2013-06-06 63 views
0

我做了幾個靜態類,以避免多次重寫相同的代碼並將所有與數據庫相關的方法保留在同一位置。自定義asp.net數據庫組件中的SqlConnection屬性

類是這樣的:

public static class Database_dbSurvey 
{ 
public static DataSet GetQuestionari() 
    { 
     SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["default_connection"].ConnectionString); 
     string query = "[admin].[SRV_Categorie_Lista]"; 
     SqlCommand cmd = new SqlCommand(query, connection); 
     cmd.CommandType = CommandType.StoredProcedure; 

     //GetDataSet use the SqlDataAdapter.fill() method 
     return Utils.GetDataSet(cmd); 
    } 

    etc.... (others similar methods) 
} 

我想減少代碼,我想使它更「面向對象」,於是我開始製作屬性爲SqlConnection的(這是相同的爲這個類的每個方法)。

private static SqlConnection connection 
    { 
     get { return new SqlConnection(ConfigurationManager.ConnectionStrings["default_connection"].ConnectionString); } 
    } 

的問題是,它與SqlDataAdapter.fill()完美地工作,直到我用這樣的方法:

using (connection) 
     { 
      connection.Open(); 
      cmd.ExecuteNonQuery(); 
     } 

現在,連接的未來使用會拋出「不istanziated 「例外,我不明白爲什麼。

什麼是定義連接屬性的正確方法?

p.s. 如果你有改進的代碼將higly理解的其它建議

編輯: 我仍然不明白爲什麼「新」的關鍵字不創建的SQLConnection每次我把它的另一istance。然而 我做了一些改動,以使代碼更安全:

private static string connection_string 
    { 
     get { return ConfigurationManager.ConnectionStrings["Connection_dbPrysmianSurvey"].ConnectionString; } 
    } 

public static DataSet GetQuestionari(string username) 
    { 
     string query = "[dbo].[SRV_Test_Lista]"; 
     using (SqlConnection connection = new SqlConnection(connection_string)) 
     using (SqlCommand cmd = new SqlCommand(query, connection)) 
     { 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Parameters.AddWithValue("@username", username); 
      return Utils.GetDataSet(cmd); 
     } 
    } 
    public static int CreaTest(string ID_questionario, string username) 
    { 
     string query = "[dbo].[srv_test_genera]"; 
     using (SqlConnection connection = new SqlConnection(connection_string)) 
     using (SqlCommand cmd = new SqlCommand(query, connection)) 
     { 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Parameters.AddWithValue("@ID_categoria", ID_questionario); 
      cmd.Parameters.AddWithValue("@ID_utente", username); 

      connection.Open(); 
      return (int)cmd.ExecuteScalar(); 
     } 
    } 

但考慮到一個事實,我有40-50的方法,它仍然是一個痛苦的改寫同一線40-50倍,有什麼建議?

回答

0

請勿在您的情況下使用using關鍵字。

通過調用SqlConnection.Dispose方法將配置連接後using的範圍完成。

using(connection) {...}的等效 -

try 
{ 
    connection.Open(); 
    cmd.ExecuteNonQuery(); 
} 
catch 
{ 
    throw; 
} 
finally 
{ 
    connection.Dispose(); 
} 
+0

我沒有得到它...... NEW關鍵字的重點不是每次都創建一個NEW連接?我認爲,即使我處理連接,下次我使用該屬性時,get會使我成爲一個新的SQLConnection。所以你告訴我,即時通訊爲每個用戶使用相同的連接?這意味着我只創建一個連接而不實際關閉它? – Simone

0

由於@Parag Meshram提到的,使用關鍵字時完成自身內部部署的一切。

有兩種方法我可以建議:

(1)不要讓連接的靜態方法

私人的SqlConnection連接(){{返回新 的SqlConnection(ConfigurationManager.ConnectionStrings [ 「default_connection」]的ConnectionString);}}

然後用它像

SqlConnection newConnection = connection();

using(newConnection){...}

或者

(2)讓您的靜態方法是使用,但它是這樣的:

嘗試{ connection.Open(); cmd.ExecuteNonQuery(); } catch { throw; }

這樣,您的連接不會被處置。

一年前我有同樣的問題,現在我使用方法(2)解決它。

+0

我無法在靜態類 – Simone

+0

中聲明變量NON-static。你將不得不爲此創建一個非靜態類。我所做的就是分開功能。 SqlConnection在它自己​​的類中,在它們自己的類中有User方法,在它們自己的方法中也有Clients的方法等。這樣你可以使用Users.Create()和Clients.Create()來表示不同的東西。兩個本地化的非靜態連接。 – SollyM