2017-01-23 103 views
0

所以我注意到在我的代碼中我有很多重複連接字符串,並決定清理它一點點。C#SQL連接類連接問題中的字符串

我的問題是,現在用using (InfoTableConnection = new SqlConnection(infoTableConnString))

時但是,如果我不使用using它工作得很好,我已經把連接字符串成一個單獨的類,我可以不再打開連接。

我不是很理解它是如何工作的我猜。這裏是我的代碼,如果有人能夠解釋一旦它被引入到一個類和/或如何解決它到底發生了什麼。

連接類: MainForm.cs

private void zGradeCombo() 
     { 
      try 
      { 

       //Connection string from class. 
       Connection connInfoTable = new Connection(); 
       connInfoTable.InfoConnection(); 

       SqlCommand cmd = new SqlCommand(); 
       cmd.Connection = Connection.InfoTableConnection; 
       cmd.CommandText = "SELECT * FROM [dbo].[Item] ORDER by [Type] ASC"; 

       SqlDataReader reader = cmd.ExecuteReader(); 

       while (reader.Read()) 
       { 
        cmbType.Items.Add(reader["Type"].ToString()); 
       } 

       //Close connection from "Connection" class 
       Connection.InfoTableConnection.Close(); 
      } 

      //Catch Exception 
      catch (Exception ex) 
      { 
       MessageBox.Show(this, ex.Message, "SQL ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
     } 
+1

'using'關鍵字在它離開使用塊後處理有問題的對象,所以你的連接只有在調用InfoTableConnection.Open();'之後才存在,然後它將被丟棄 –

+0

因此,打開後的連接無法在類中使用並從單獨的窗體調用它? – Mokey

+0

它可以,如果你不使用'使用',但你將不得不調用'InfoTableConnection.Dispose()'當你完成 –

回答

1

如果你的目標是讓你的連接字符串是一個位置,爲什麼不把你的連接字符串放在你的app.config(設置)文件中,並在那裏的代碼中引用它?

的app.config

<connectionStrings> 
    <add name="MyConnectionString" connectionString="Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=MTRInfoTables;Integrated Security=True" /> 
</connectionStrings> 

code.cs

string myConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString; 

您必須在您引用到System.Configuration.dll參考使用ConfigurationManager

通過這種方式,您可以繼續使用您的using設計用於他們的方式。

+0

謝謝...這使得它更清潔:) – Mokey

5

using關鍵字可確保當你達到你的對象將被佈置:Connection.cs從

class Connection 
    { 
     public static SqlConnection InfoTableConnection = null; 
     public void InfoConnection() 
     { 
      string infoTableConnString = "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=MTRInfoTables;Integrated Security=True"; 

      using (InfoTableConnection = new SqlConnection(infoTableConnString)) 

      InfoTableConnection.Open(); 

     } 
    } 

示例代碼範圍的結尾,以便所有的資源將被清理後

using (InfoTableConnection = new SqlConnection(infoTableConnString)) 
{ 
     InfoTableConnection.Open(); 
} // <- At this point InfoTableConnection will be disposed (and closed) 

因爲你關心在你周圍的代碼中的配置,所以在類的構造函數中不需要using塊。不過,這將是實現您的連接類IDisposable的一個好主意,這樣使用它:

using(var con = new Connection()) 
{ 
    SqlCommand cmd = new SqlCommand(); 
    cmd.Connection = con.InfoTableConnection; 
    cmd.CommandText = "SELECT * FROM [dbo].[Item] ORDER by [Type] ASC"; 

    SqlDataReader reader = cmd.ExecuteReader(); 

    while (reader.Read()) 
    { 
     cmbType.Items.Add(reader["Type"].ToString()); 
    } 
} 

在你連接的Dispose()方法,你應該配置的SQL連接。