2010-09-27 84 views
4

我剛遇到一個奇怪的問題,我無法檢索sql存儲過程輸出參數值。我遇到了這個問題將近2個小時。使用c讀取存儲過程中的參數問題#

代碼很簡單

using (var con = new SqlConnection(connectionString)) 
     { 
      con.Open(); 
      SqlCommand cmd = new SqlCommand("sp_mgsearach", con); 
      cmd.CommandType = CommandType.StoredProcedure; 
      SqlParameter param1 = new SqlParameter("@SearchTerm", SqlDbType.VarChar); 
      param1.Value = searchTerm; 
      param1.Direction = ParameterDirection.Input; 
      cmd.Parameters.Add(param1); 
      SqlParameter param2 = new SqlParameter("@start", SqlDbType.Int); 
      param2.Value = start; 
      param2.Direction = ParameterDirection.Input; 
      cmd.Parameters.Add(param2); 
      SqlParameter param3 = new SqlParameter("@end", SqlDbType.Int); 
      param3.Value = end; 
      param3.Direction = ParameterDirection.Input; 
      cmd.Parameters.Add(param3); 
      SqlParameter param4 = new SqlParameter("@total", SqlDbType.Int); 
      param4.Direction = ParameterDirection.InputOutput; 
      param4.Value = 0; 
      cmd.Parameters.Add(param4); 


      var reader = cmd.ExecuteReader(); 
      LoadHits(reader);   
      if (lstHits.Count > 0) 
       total = Convert.ToInt32(cmd.Parameters["@total"].Value); 
      else 
       total = 0; 

     } 

的@total值總是空。但是當我執行通過查詢分析器中的分析器生成的查詢時,它返回正常。

最後我發現這是由於SQL連接。

它工作正常,如果我讀出PARAM

  LoadHits(reader);   
      con.close() 
      if (lstHits.Count > 0) 
       total = Convert.ToInt32(cmd.Parameters["@total"].Value); 
      else 
       total = 0; 

WT ..,我只是無法弄清楚,爲什麼它的行爲這樣的..任何人有一個想法之前關閉連接?

回答

7

參數值在TDS流的(因爲你可以在你的查詢的結尾改變它,選擇數據後)返回。你必須確保消費所有的TDS數據(或者至少,使緩衝器被刷新,這Close()爲你做),以獲得更新的參數值,例如:

do { while(reader.Read() {} } 
while (reader.NextResult()); 

的查詢中後期引發的SQL錯誤也是一樣。您也可以嘗試添加一個using;這可能也足夠了:

using(var reader = cmd.ExecuteReader()) { 
    LoadHits(reader); 
}