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

本文来自CSDN博客http://blog.csdn.net/liushengmz/archive/2010/04/29/5541986.aspx

问题:在存储过程中,有时会遇到比较变态的东西,如一个存储过程中有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'



结果如下

[img]http://dl.iteye.com/upload/attachment/245596/c63f04e8-35ea-3552-b348-abeec5803816.png[/img]


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();

结果如下:

[img]http://dl.iteye.com/upload/attachment/245598/cca2fb21-3ef1-3ec0-858a-048fdbf7ad8b.png[/img]


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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值