A. 獲取存儲過程的ReturnValue值
用了這么長時間的.NET了,竟然連怎么獲取存儲過程的返回值都不知道,真是失敗。
在網上搜了一下,就知道怎么用了。
Input 此參數只用于將信息從應用程序傳輸到存儲過程。
InputOutput 此參數可將信息從應用程序傳輸到存儲過程,并將信息從存儲過程傳輸回應用程序。
Output 此參數只用于將信息從存儲過程傳輸回應用程序。
ReturnValue 此參數表示存儲過程的返回值。SQL Server 的存儲過程參數列表中不顯示該參數。它只與存儲過程的 RETURN 語句中的值相關聯。
存儲過程為主鍵生成新值后,通常使用存儲過程中的 RETURN 語句返回該值,因此用來訪問該值的參數類型是 ReturnValue 參數。
ReturnValue 參數與其他類型的參數有一個重要的區別。通常,在 ADO.NET 中為 Command 對象配置的參數的順序并不重要。參數名稱只用來與存儲過程中相應的參數相匹配。但是,對于 ReturnValue 參數,它必須是列表中的第一個參數。
也就是說,為 Command 對象配置 ReturnValue 參數時,必須首先在代碼中配置該參數,這樣它才能獲取集合中的第一個數字索引。如果先配置任何其他參數,ReturnValue 參數將不能正常工作。
呵呵,這樣就可以了
args[0] = new SqlParameter("@RETURN_VALUE", SqlDbType.Int );
args[0].Direction = ParameterDirection.ReturnValue;
取回值的時候用args[0].Value.ToString()
B.獲得SQL-server存儲過程的返回值存儲過程為:
///<summary>
///c#code,獲得SQL-server存儲過程的返回值
///<summary>
SqlParameter[] sp = new SqlParameter[5];
sp[0]=new SqlParameter("@Name",SqlDbType.VarChar);
sp[0].Value=this.TextName.Text;
sp[1]=new SqlParameter("@Text",SqlDbType.Text);
sp[1].Value=this.TextTxt.Text;
sp[2]=new SqlParameter("@Comment",SqlDbType.Text);
sp[2].Value=this.TextComment.Text;
sp[3]=new System.Data.SqlClient.SqlParameter("ReturnValue",System.Data.SqlDbType.Int,4,System.Data.ParameterDirection.ReturnValue,false,0,0,string.Empty,DataRowVersion.Default,null);
//參數"ReturnValue",System.Data.ParameterDirection.ReturnValue聲明此參數為返回值。
sp[4]=new SqlParameter("@Type",SqlDbType.Int);
sp[4].Value=int.Parse(this.ClickBox.SelectedItem.Value);
_SQL.ExecuteSP("us_styletextnew",sp);
//使用sp[3].Value.ToString()即可!
存儲過程為:
CREATE PROCEDURE [dbo].[us_styletextnew]
@id int=0,
@Name varchar(50),
@Text text,
@Comment text,
@Type int
AS
SET NOCOUNT ON
IF not EXISTS(SELECT [Name] FROM [dbo].[iStyle] WHERE [Name] = @Name)
BEGIN
INSERT INTO
[dbo].[iStyle]
([Name],
[Text],
[Comment],
[Type])
VALUES
(@Name,@Text,@Comment,@Type)
SET @id = SCOPE_IDENTITY()
END
RETURN @id
GO
希望對剛學存儲過程的朋友有點幫助!
用過SQLHelper的朋友,一定很懷疑SQLHelper怎么不能執行帶輸出、返回參數的存儲過程呢?請參考 http://blog.joycode.com/ghj/archive/2004/04/12/19015.aspx
此文并沒有做成相應的解決方法,所以這也是寫本文的一個出發點。原因值需要修改存儲過程中RETURN @id為SELECT @id,取值采用SqlHelper.ExecuteScalar 方法.其中原理并沒有違背SqlHelper.ExecuteScalar取第一行一列的值。
string aa= SqlHelper.ExecuteScalar(SqlHelper.CONN_STRING,"PRO_Table1_OPER",sp).ToString();
C.如何在存儲過程中引用別的存儲過程返回的表
1. 一般的方法認為只有把存儲過程返回的值,寫入一個結構相同的
輔助表中,如下:
create procedure proc1
as
begin
create table #t(...) --表結構同被調用存儲過程返回結果集的結構
insert #t exec proc2
select * from #t left join table on ...
end
go
2。還有一個方面就是用openrowset(不過就是速度不怎么樣)
select * from openrowset('sqloledb'
,'Trusted_Connection=yes'
,'exec sp_who') -- 這里是你要調用的存儲過程
參考文獻 :http://www.linkui.cn/read-20.html
http://blog.joycode.com/ghj/archive/2004/04/12/19015.aspx
新聞熱點
疑難解答