2017-09-08 44 views
0

我有一個類和我的MySqlConnection是在那裏:關閉連接/ MySqlDataReader將不起作用

public class DB 
{ 
    private static MySqlConnection _Connection; 
    public static MySqlConnection Connection 
    { 
     get 
     { 
      if(_Connection == null) 
      { 
       string cs = string.Format("SERVER={0}; DATABASE={1}; UID={2}; PWD={3};", SERVER_ADRESS, DATABASE, UID, PWD); 
       _Connection = new MySqlConnection(cs); 
      } 

      if(_Connection.State == System.Data.ConnectionState.Closed) 
       try 
       { 
        MessageBox.Show("MySQL Connection ist geschlossen. Öffne Sie"); 
        _Connection.Open(); 
       } 
       catch(MySqlException ex) 
       { 
        switch (ex.Number) 
        { 
         case 0: 
          MessageBox.Show("Verbindung zum Server konnte nicht hergestellt werden."); 
          break; 
         case 1045: 
          MessageBox.Show("Ungültiger Benutzername/Passwort."); 
          break; 
         default: 
          MessageBox.Show(ex.Message); 
          break; 
        } 
       } 
      return _Connection; 
     } 
    } 
} 

這樣我就可以使用帶有DB.Connection中的所有其他類此連接。

但現在我得到「DataReader已經打開」。 但我所有的DataReader都在使用中。

我們開始在我的登錄頁:

using (loginreader = cmd.ExecuteReader()) 
      { 
       if (loginreader.Read()) 
       { 
        DB.Connection.Close(); 
        return true; 
       } 
       else 
       { 
        DB.Connection.Close(); 
        return false; 
       } 
       loginreader.Close(); 
      } 

我想這是行不通的。但第一個錯誤消息登錄後,我在83線上的另一類:

DataTable schema = null; 

      using (var schemaCommand = new MySqlCommand("SELECT * FROM " + firmCustomerTablename, connection)) 
      { 
       using (var reader = schemaCommand.ExecuteReader(CommandBehavior.SchemaOnly)) 
       { 
        schema = reader.GetSchemaTable(); 
       } 
      } 

這也在使用中。所以我不明白爲什麼我會得到這個錯誤。我想關閉連接/ DataReaders不工作。

在此更改之前,我爲每個站點建立了連接。但是我的節目沒有很好的表現。所以我決定建立一個始終打開的連接,並且只需要打開查詢連接。現在我得到DataReader錯誤。

有人可以解釋我,爲什麼使用不關閉DataReader?而83行不是一個DataReader它是一個var,所以我不知道爲什麼我在這一行得到這個錯誤。

+3

有你的整個比如一個靜態的連接是不是一個很好的解決方案。您應該打開每個查詢或更新的連接。這樣做會導致超出你所描述的問題的更多問題。如果這導致性能不佳,那麼解決這個問題(確保連接正確合併,你及時處理/關閉它們等)。 –

+0

它會損害性能以每5秒打開一次連接。因爲所有的東西都會從數據庫讀取。點擊按鈕打開一個包含數據庫內容的窗口。另外點擊另一個按鈕等等。 –

+2

它不應該每5秒鐘就要殺死性能來創建連接。如果是,則某些設置不正確。你是否真的證實它正在發生或只是假設?請參閱:https://stackoverflow.com/questions/9705637/executereader-requires-an-open-and-available-connection-the-connections-curren/9707060#9707060和https://stackoverflow.com/questions/26089420/ c-sharp-mysql-connection-pooling –

回答

1

這聽起來像你的問題是關於連接狀態管理?我可能不完全理解你所要求的,但通過連接上下文中的設計using聲明將關閉連接。它們是try {} catch {} finally的語法糖。我經常看到不使用IDisposable的連接對象,命令對象等的例子,並且沒有正確處置/關閉。

在此代碼中,我看不到要再次打開要執行的命令的連接。

DataTable schema = null; 

     using (var schemaCommand = new MySqlCommand("SELECT * FROM " + firmCustomerTablename, connection)) 
     { 
      using (var reader = schemaCommand.ExecuteReader(CommandBehavior.SchemaOnly)) 
      { 
       schema = reader.GetSchemaTable(); 
      } 
     } 

這是一個基本的想法:

 using (var conn = new SqlConnection(connectionString: "")) 
     { 
      conn.Open(); 

      using (var cmd = new SqlCommand(cmdText: "cmdText", connection: conn)) 
      { 
       using (var reader = cmd.ExecuteReader()) 
       { 
        while (reader.Read()) 
        { 
         // 
        } 
       } 
      } 

     } 

文檔:MSDN SqlConnection Class

+0

我會建議展示如何安全地關閉連接,因爲這是他最初的問題。您可以通過添加'cmd.ExecuteReader(CommandBehavior.CloseConnection)'開始。這將自動關閉讀取循環完成的讀取器。因此你不需要檢查讀者狀態。您可以簡單地使用null合併,然後關閉連接。 – thanatorr

+0

我知道你的使用聲明能夠解決這個問題,但是編號說它可能值得我們首先了解最新情況。在深入語法糖之前。 – thanatorr

+0

@thanatorr,感謝您的反饋。永遠學習。 –