2013-06-05 51 views
1

完全新建於C#C#:構建連接的類/方法

在我的應用程序中,幾個按鈕將連接到MySql並傳遞信息。每個按鈕都有它自己的連接字符串,我發現它很冗餘,並且很好奇,如果在C#中有一種方法來構建一個ClassMethod,保存連接字符串,並在每個按鈕中調用連接,而不是建立連接,然後調用它。

我試過建立一個Public Method,它使用了MySqlConnection mycon參數,並且它返回了mycon,但是在其他按鈕中,它將mycon看作是一個方法而不是對象。從那裏我嘗試了一個Class(使用dotnetperls和其他網站的語法),它已經產生了關於類型的其他錯誤。顯然,對於這個新手來說,我接近錯誤的語法來構建一個ClassMethod,儘管我假設由於Method將是一個動作,所以我實際上是在尋找一個類來保存對象並允許其他部分該程序來訪問它。

請參見下面的僞代碼爲例:

當前

private void button1_Click(object sender, EventArgs e) 
{ 

MySqlConnection mycon = new MySqlConnection(); 
mycon.ConnectionString = "Connection"; 

mycon.Open(); 
// Code 
mycon.Close(); 

} 

private void button2_Click(object sender, EventArgs e) 
{ 

MySqlConnection mycon = new MySqlConnection(); 
mycon.ConnectionString = "Connection"; 

mycon.Open(); 
// Code 
mycon.Close(); 

} 

private void button3_Click(object sender, EventArgs e) 
{ 

MySqlConnection mycon = new MySqlConnection(); 
con.ConnectionString = "Connection"; 

mycon.Open(); 
// Code 
mycon.Close(); 

} 

目標:

Some Class 
{ 

//MySqlConnection parameters establish mycon 

} 

private void button1_Click(object sender, EventArgs e) 
{ 

mycon.Open(); 
// Code 
mycon.Close(); 

} 

private void button2_Click(object sender, EventArgs e) 
{ 

mycon.Open(); 
// Code 
mycon.Close(); 

} 

private void button3_Click(object sender, EventArgs e) 
{ 

mycon.Open(); 
// Code 
mycon.Close(); 

} 

注:我知道了XML方法(和有在我的另一個程序中使用它),但我試圖看看是否有Class/Method方法。

+0

你應該包裝所有的連接在'使用'的。 – Arran

+0

也可能沒有直接在你的UI事件中進行 – valverij

回答

3

我建議有一個方法(或許可以是靜態的,並且存在在一個地方,從您的代碼中的任何地方訪問)與獲取連接的所有細節的交易,並將其返回。然後在任何需要連接的地方,調用該方法。

class SomeClass 
{ 
    private void button1_Click(object sender, EventArgs e) 
    { 
     using (var conn = Utilities.GetConnection()) 
     { 
      conn.Open(); 
      // Code 
     } 
    } 
} 
public static class Utilities 
{ 
    public static MySqlConnection GetConnection() 
    { 
     MySqlConnection conn = new MySqlConnection(); 
     conn.ConnectionString = "Connection"; 
     return conn; 
    } 
} 

並使用using確保連接始終關閉。通常使用您所使用的IDisposable來做到這一點。

有關Open()是否應該在GetConnection()與否的一些信息/ duscussion,見using statement with connection.open

+0

絕對美麗;節省了大量的代碼,併爲我提供了一些關於如何利用它的想法。另外,關於OPEN的好處,它有點多餘,因爲當我調用這個方法時,我會打開一個連接! – Question3CPO

1
class SomeClass : IDisposable 
{ 
    SqlConnection conn; 

    public SomeClass 
    { 
     conn = new SqlConnection("some connectionstring"); 
    } 

    public void Open() 
    { 
     conn.Open() 
    } 

    public void Close() 
    { 
     conn.Close() 
    } 

    public void Dispose() 
    { 
     conn.Dispose() 
    } 
} 
+0

這個類是否使用'conn',或者另一個類會使用這個類? –

+0

那麼,通過調用這個類,你可以間接使用SqlConnection。 – SamiHuutoniemi

+0

'conn'是私人的;如果我有一個'SomeClass'的實例,除了open,close和dispose,我無法對連接做任何事情。 –

3

使用一個靜態方法來創建連接,並using速記關閉/處置它:

SomeClass 
{ 
    public static MySqlConnection CreateConnection() 
    { 
     MySqlConnection mycon = new MySqlConnection(); 
     mycon.ConnectionString = "Connection"; 
     mycon.Open(); 
     return mycon; 
    } 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    using (MySqlConnection conn = SomeClass.CreateConnection()) 
    { 
    } 
} 
+0

如果'Open()'拋出,我認爲可能有資源沒有正確處置。 –

+0

@TimS。 - 嗯,需要看看它。 – Igor

+0

http://stackoverflow.com/questions/9316981/using-statement-with-connection-open有更多的信息 - 接受的答案是,你不應該在返回它之前打開一個連接。雖然,這種無意義的,主觀的東西。 –

0

我會做這樣的事情:

public class DataBase 
{ 
    private static string DEFAULT_CONNECTION_STRING = "*your connection string*"; 
    private string connectionString; 
    private DbProviderFactory factory; 

    public DataBase() 
    { 
      connectionString = DEFAULT_CONNECTION_STRING; 
      factory = DbProviderFactories.GetFactory("MySql.Data.MySql"); 
    } 

    public IDataReader GetData(string sql) 
    { 
      using(var conn = factory.CreateConnection()) 
      using(var command = factory.CreateCommand()) 
      { 
        command.CommandText = sql; 
        command.CommandType = CommandType.Text; 
        conn.ConnectionString = this.connectionString; 
        conn.Open(); 
        command.Connection = conn; 
        return cmd.ExecuteReader(); 
      } 
    } 
}