2011-03-23 36 views
6

我試圖獲得SQL 2008服務器上的存儲過程的結果集和返回值。當我在sql管理工作室運行proc時,我得到了結果集和返回值。返回值使用SqlCommand

但是,當我嘗試獲取C#4.0中的值時,該參數的值爲null。這是我的C#代碼:

using (ConnectionManager<SqlConnection> cn = ConnectionManager<SqlConnection>.GetManager(CultureInfo.CurrentCulture.Name)) 
{ 
    using (SqlCommand cm = cn.Connection.CreateCommand()) 
    { 
     cm.CommandText = "Name of proc here"; 
     cm.CommandType = CommandType.StoredProcedure; 

     cm.Parameters.AddWithValue("@ApplicationId", ApplicationId);           
     cm.Parameters.AddWithValue("@Index", Index); 

     if (PageSize > 0) 
      cm.Parameters.AddWithValue("@PageSize", PageSize); 

     cm.Parameters.Add("@ReturnValue", SqlDbType.Int); 
     cm.Parameters["@ReturnValue"].Direction = ParameterDirection.ReturnValue; 

     using (IDataReader dr = cm.ExecuteReader()) 
     { 
      SafeDataReader sdr = new SafeDataReader(dr); 
      while (sdr.Read()) 
      { 
       UserApplicationEntity uae = new UserApplicationEntity(); 
       uae.UserId = sdr.GetGuid("UserId"); 
       uae.ExternalId = sdr.GetString("ExternalId"); 
       Result.Value.Collection.Add(uae); 
      } 

      Result.Value.TotalResults = (int)cm.Parameters["@ReturnValue"].Value; 
     } 
    } 
} 

最後一行,其中我請Result.Value.TotalResults =(int)的cm.Parameters [ 「@返回值」]值; Value的值爲null。我找到的每一篇教程或文章,似乎都是正確的。在這一點上,我想我只是想念一些小事,需要另一雙眼睛。我也嘗試設置返回參數之前所有其他人作爲一個職位,我發現在MS網站上說我需要,但無論它在哪裏,它返回null。

回答

7

返回值是在數據庫的響應中最後發送的,因此您必須完全讀取結果集才能訪問返回值。

SafeDataReader類是做什麼的?是否有可能阻止整個結果集被讀取?

嘗試將讀取數據讀取器using塊之外的返回值的代碼移動。這可能有助於超出結果集提前響應,以便返回值可用。

+0

必須將其移動到使用區塊以外才能關閉閱讀器。從來沒有想到會是這樣。謝謝! – phreak3eb 2011-03-23 23:14:33