sisi1984117 发表于 2013-2-1 12:24:22

【转】用C#、JAVA一次性取出存储过程中的各种返回值

问题:在存储过程中,有时会遇到比较变态的东西,如一个存储过程中有output返回值,有return返回值,还有查询的返回值TABLE,遇到这样的存储过程真是郁闷,一次性把所有的返回值取出来还真的有点麻烦。
 
 
 
1、  首先来看这个存储过程吧
 
CREATE  PROCEDURE ParaTest
@paraout varchar(20) output
AS
BEGIN
   SET NOCOUNT ON
   SELECT * FROM USERS
   SELECT @paraout = 'outputvalue'  
   RETURN 10
END
 
为了方便大家看得更加清清楚楚,我已经将数据赋值写得很直观的了。USERS是一个表
在sql中要取得这个存储过程的返回值可以用以下方式
 
DECLARE @paraoutput varchar(20)
DECLARE @parareturn varchar(20)
EXEC @parareturn= ParaTest @paraout = @paraoutput output
SELECT @paraoutput AS 'output',@parareturn AS 'return'
 
结果如下
 
 
 
 
 
 
2、  用C#取得返回值的方法如下(不做解释了,很简单的)
         string stroutput = "";
            string strreturn = "";
 
            string conStr = "Server=.;DataBase=Test;Uid=sa;Pwd=";           
            SqlConnection conn = new SqlConnection(conStr);
            conn.Open();          
            SqlCommand cmd = new SqlCommand("ParaTest",conn);
            cmd.CommandType = CommandType.StoredProcedure;
 
            SqlParameter spa = new SqlParameter("@paraout",SqlDbType.VarChar,20);
            spa.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(spa);
 
            SqlParameter spareturn = new SqlParameter("@return", SqlDbType.VarChar,10);
            spareturn.Direction = ParameterDirection.ReturnValue;
            cmd.Parameters.Add(spareturn);
 
            cmd.ExecuteNonQuery();
            stroutput = cmd.Parameters["@paraout"].Value.ToString();
            strreturn = cmd.Parameters["@return"].Value.ToString();
            DataTable dt = new DataTable();
 
            SqlDataAdapter sda = new SqlDataAdapter(cmd);
            sda.Fill(dt);
 
            Text_ParaReturn.Text = "output value:" + stroutput + ";return value:" + strreturn;
            dgv_ParaSet.DataSource = dt;

            sda.Dispose();
            cmd.Dispose();
            conn.Dispose();
结果如下:
 
 
 

3、  JAVA取得返回值的方法如下
public static void main(String[] args)
    {
        new com.microsoft.sqlserver.jdbc.SQLServerDriver();
        String strOutput = "";
        String strReturn = "";
        Connection conn = null;
        CallableStatement cstmt = null;
        ResultSet rs = null;
    String conUrl = "jdbc:sqlserver://localhost:1433;DatabaseName=Test;User=sa;pwd=";
        try
        {
            conn = DriverManager.getConnection(conUrl);
            cstmt = conn.prepareCall("{ ? = call ParaTest( ? ) }");
            cstmt.registerOutParameter(1,Types.VARCHAR);
            cstmt.registerOutParameter(2,Types.VARCHAR);
            rs = cstmt.executeQuery();
            while(rs.next())
            {
                System.out.println(rs.getInt(1) + "---" + rs.getString(2));
            }
            strReturn = cstmt.getString(1);
            strOutput = cstmt.getString(2);        
            System.out.println("OutPut:" + strOutput+"---Return:"+strReturn);               rs.close();
            cstmt.close();
            conn.close();
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
结果如下:
1---fsdaf
2---f
3---sd
OutPut:outputvalue---Return:10
 
4、  备注:
在上面的代码中,用C#取返回值的时候,其实它是执行了两次存储过程的,cmd.ExecuteNonQuery();这里执行一次,sda.Fill(dt);也执行了一次。而JAVA代码取得返回值中,它仅仅只是招行了一次存储过程,就拿到了全部的数据,JAVA主要是使用了游标进行取数据,而C#是一次性取来放到DATATABLE这个容器里面去,中间C#帮我们做了一次数据提取,估计也是用游标取得的数据。不管怎样,终究是取到所有数据了。
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/liushengmz/archive/2010/04/29/5541986.aspx
页: [1]
查看完整版本: 【转】用C#、JAVA一次性取出存储过程中的各种返回值