2016-04-03 85 views
1

我正在處理VS13和SQL Server 2012中的項目,並且遇到了一些小問題。我似乎無法從我的數據庫中讀取數據。每當我嘗試對用於讀取數據的SqlDataReader對象執行任何操作時,它都會拋出異常。SqlDataReader對象在每次執行操作時都會拋出異常

我得到的例外是InvalidOperationException

看看我的代碼,我用SQL查詢作爲參數調用這個函數,並將返回的對象存儲在另一個SqlDataReader對象中。

private SqlDataReader reader (string sqCommand) 
{ 
     myConnection.Open(); 
     string string1; 
     string1 = sqCommand; 
     SqlDataReader a = null; 

     try 
     { 
      SqlCommand Newcommand = new SqlCommand(string1, myConnection); 
      a = Newcommand.ExecuteReader(); 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show(e.ToString()); 
     } 

     myConnection.Close(); 

     if (a.Read())  //**statement 1** 
      return a; 
     else 
      return null; 
    } 

我得到在標記在上面和我的對象或接收到該對象執行每個操作的代碼的聲明1除外。

任何人都可以告訴我什麼是我的代碼錯誤或提供任何其他解釋?如果需要更多其他代碼部分來查找錯誤,我可以提供。

感謝您的時間和您可能提供的幫助。 :)

+0

看看這篇文章可能會對你有幫助。 http://stackoverflow.com/questions/23187029/sqldatareader-invalidoperationexception –

回答

3

當您使用SqlDataReader時,您的連接需要保持打開狀態。您的SqlDataReader更傳統的用法如下:

private List<object> Reader(string sqCommand) 
{ 
    using (SqlConnection myConnection = new SqlConnection(ConnectionString)) 
    { 
     myConnection.Open(); 

     using (SqlCommand cmd = new SqlCommand(sqCommand, myConnection)) 
     using (SqlDataReader reader = cmd.ExecuteReader()) 
     { 
      List<object> list = new List<object>(); 

      while (reader.Read()) 
      { 
       list.Add(reader[0]); 
      } 

      return list; 
     } 
    } 
} 
+0

感謝您的幫助。我想在連接打開的同時,我正在嘗試修復它時需要一分鐘前使用讀取器。我只是碰巧讀取了異常提供的信息,並且表示連接已關閉,因此無法執行我想要的操作。我實際上通過在form_load函數中打開連接並在最後關閉它(在退出時)來修復問題,因爲這只是一個登錄表單。 –

+0

@SahilSoni,儘管你已經得到了正如你所提到的代碼工作,但我建議你按照Kirill的例子重構。最佳做法是遵循「開放遲到早期」模式,利用IDisposable(使用)來管理資源。 –

+0

@DanGuzman沒關係,我會爲「開放遲到早」做必要的修改。我正在從事的這個項目有點浪費,它不會在任何地方使用,但是我必須這樣做是因爲我的大學課程。我還有另外一個項目,我會在6月份開始工作,那將會很棒!如果我不能自己修復這些問題,我會在本網站上發佈我的問題。 –

相關問題