簡體   English   中英

讀取帶有輸出參數和結果集的SP(在C#中)?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM