[英]Reading SP with output parameters and result set in C#?
我創建了一個類似於此簡化示例的存儲過程:
CREATE PROCEDURE dbo.sp_MyStoredProcedure
@Var1 INT OUTPUT,
@Var2 DECIMAL(10,2) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT
@Var1 = COUNT(*),
@Var2 = SUM(TranAmount)
FROM
MyTable
SELECT * FROM MyTable
END
當我在調用SqlCommand
對象的ExecuteReader()
方法后嘗試從輸出變量中讀取值時,該值為null。
string MyConnString = string.Empty;
SqlConnection MyConn = new SqlConnection(MyConnString);
SqlCommand MyCmd = new SqlCommand("sp_MyStoredProcedure", MyConn);
MyCmd.CommandType = CommandType.StoredProcedure;
MyCmd.Parameters.Add(new SqlParameter("@Var1", SqlDbType.Int));
MyCmd.Parameters.Add(new SqlParameter("@Var2", SqlDbType.Decimal);
MyCmd.Parameters[0].Direction = ParameterDirection.Output;
MyCmd.Parameters[1].Direction = ParameterDirection.Output;
SqlDataReader dr = MyCmd.ExecuteReader(CommandBehavior.CloseConnection);
int Var1 = Convert.ToInt32(MyCmd.Parameters[0].Value);
decimal Var1 = Convert.ToDecimal(MyCmd.Parameters[1].Value);
我做錯了什么?
您需要閱讀閱讀器直到最后,輸出參數在TDS流的末尾,並且直到不使用結果集時,客戶端才會看到它們。
如果在讀取結果集之前必須具有計數和總和,則必須放棄OUTPUT參數。 只需使用您感興趣的兩個值生成一個普通的結果集即可購買SELECT *結果集。 然后使用SqlDataReader.NextResult()在客戶端中讀取兩個結果集。
更新資料
這是我設置兩個結果的意思:
CREATE PROCEDURE dbo.sp_MyStoredProcedure
AS
BEGIN
SET NOCOUNT ON;
SELECT COUNT(*) as cnt, SUM(TranAmount) as sum_ta
FROM MyTable
SELECT * FROM MyTable
END
和客戶:
string MyConnString = string.Empty;
SqlConnection MyConn = new SqlConnection(MyConnString);
SqlCommand MyCmd = new SqlCommand("sp_MyStoredProcedure", MyConn);
MyCmd.CommandType = CommandType.StoredProcedure;
using(SqlDataReader dr = MyCmd.ExecuteReader(CommandBehavior.CloseConnection))
{
while(dr.Read())
{
count = dr["cnt"];
sum = dr["sum_ta"];
}
dr.NextResult();
while(dr.Read())
{
// process MyTable row here
}
}
請注意,您不必這樣做,如果你的C#代碼不使用了該數據之前,讀者需要的輸出參數的值。 您可以簡單地讀取SqlDataReader直到結束, 然后檢查輸出參數,它們將被設置。
正如Remus所說,如果您首先需要它,那么您需要重新定位查詢方式。 為什么沒有兩個單獨的程序? 那將是抽象的最佳解決方案。
否則,您可以在同一批中執行兩個SQL語句
SELECT COUNT(*) AS VAR1, SUM(TranAmount) AS VAR2 FROM MyTable
SELECT * FROM MyTable
然后,當您調用ExecuteReader時
SqlDataReader dr = MyCmd.ExecuteReader(CommandBehavior.CloseConnection);
while (dr.read())
{
var1 = dr["Var1"];
var2 = dr["Var2"];
}
dr.NextResult();
while (dr.read())
{
// blah blah blah code
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.