本文來自CSDN博客http://blog.csdn.net/liushengmz/archive/2010/04/29/5541986.aspx
問題:在存儲過程中,有時會遇到比較變態的東西,如一個存儲過程中有output返回值,有return返回值,還有查詢的返回值TABLE,遇到這樣的存儲過程真是郁悶,一次性把所有的返回值取出來還真的有點麻煩。
1、? 首先來看這個存儲過程吧
為了方便大家看得更加清清楚楚,我已經將數據賦值寫得很直觀的了。USERS是一個表
在sql中要取得這個存儲過程的返回值可以用以下方式
結果如下
2、? 用C#取得返回值的方法如下(不做解釋了,很簡單的)
???????
結果如下:
3、? JAVA取得返回值的方法如下
結果如下:
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
問題:在存儲過程中,有時會遇到比較變態的東西,如一個存儲過程中有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
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

