2011-02-15 65 views
0

將數據存儲到SqlDataReader時遇到問題。當我分配sdr變量時,在connection.close()的位置,sdr變量變爲空。爲什麼?SqlDataReader問題

string strConnection = ConfigurationManager.ConnectionStrings["dbconn"].ConnectionString; 

    SqlDataReader sdr = null; 

    using (SqlConnection connection = new SqlConnection(strConnection)) 
    { 
     connection.Open(); 
     using (SqlCommand cmd = new SqlCommand("GetProducts", connection)) 
     { 


      cmd.CommandType = System.Data.CommandType.StoredProcedure; 

      sdr = cmd.ExecuteReader(); 


     } 
     connection.Close(); 
    } 

    return (sdr); 

回答

3

您需要遍歷在一個循環的讀者,同時呼籲閱讀:

while(sdr.Read()) 
{ 
    var someValue = sdr["SomeValue"]; //Where SomeValue is the column name you're expecting from the DB 
} 

所有這一切的ExecuteReader呢,是它返回一個DataReader對象給你,但是這是你要經過各行返回並將值從中拉出。如果你想獲得這一切在一杆,你可以使用一個SqlDataAdapter:

var adapter = new SqlDataAdapter(command); 
var table = new DataTable(); 
adapter.Fill(table); 
+0

是否不可能返回值作爲SqlDataReader? – user532104

+0

@user:您可以這樣做,但是您需要保持連接處於打開狀態。一旦你關閉連接,閱讀器無法繼續閱讀數據庫... – BFree

+0

好的隊友,謝謝 – user532104

3

你在遍歷DataReader的需要一個開放和活躍的連接。如果您在返回數據讀取器之前關閉它,它將不起作用。我最常做的來解決這個問題是打開的DataReader到一個IEnumerable,就像這樣:

public IEnumerable<IDataRecord> GetProductsFromDB() 
{ 
    string strConnection = ConfigurationManager.ConnectionStrings["dbconn"].ConnectionString; 

    using (SqlConnection connection = new SqlConnection(strConnection)) 
    using (SqlCommand cmd = new SqlCommand("GetProducts", connection)) 
    { 
     cmd.CommandType = System.Data.CommandType.StoredProcedure; 

     connection.Open(); 
     using (var sdr = cmd.ExecuteReader()) 
     { 
      while (sdr.Read()) 
      { 
       yield return sdr; 
      } 
     }  
    } 
} 

請注意,我也改變了一下週圍的命令:等待儘可能長的時間來打開連接,並把連接和命令創建,以避免嵌套太多。

這種模式爲您編寫數據訪問代碼打開了一個全新的世界,因爲現在突然您的原始sql查詢和存儲過程調用與linq-to-objects操作符一起工作。你可以這樣做一些很酷:

foreach (var product in GetProductsFromDB() 
      .Select(i => CreateProductFromDataRow(i)) 
      .Where(p => p.IsOnSale())) 
{ 
    // do something with products that are on sale 
} 
+0

酷酷的模式,從來沒有見過。 – BFree