2012-09-16 39 views
0

下面是防禦性編程嗎?防禦性數據庫編程 - 我應該使用Singleton模式嗎

我的意思是,如果它失去連接,或者在運行時發生了一些問題,然後用戶再次運行,那麼.NET框架將清理首次運行時創建的所有打開的連接和對象嗎?

我已經聽說了「Singleton模式」的提及 - 這是不是我應該在靜態方法創建連接使用?

class Program { 
    static void Main(string[] args) { 
    DataTable CasTable = fillSampleDataTable("SELECT top 100 * FROM x"); 
    //do other stuff 
    } 


    static SqlConnection CreateConnection() { 
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["XXX"].ConnectionString); 
    return conn; 
    } 
    static SqlDataAdapter CreateAdapter(string myCommand) { 
    SqlDataAdapter myAdapt = new SqlDataAdapter(myCommand, CreateConnection()); 
    return myAdapt; 
    } 
    static DataTable fillSampleDataTable(string myCommand) { 
     using (var adapt = CreateAdapter(myCommand)) {     
      DataSet mySet = new DataSet(); 
      adapt.Fill(mySet, "SampleData"); 
      return mySet.Tables["SampleData"]; 
    } 
    } 
} 

回答

4

我想您使用ADO.NET連接池,又名配置的連接,一旦您完成使用它們=建議>包裝所有IDisposable的資源using聲明:

class Program 
{ 
    static void Main(string[] args) 
    { 
     DataTable CasTable = fillSampleDataTable("SELECT top 100 * FROM x"); 
     //do other stuff 
    } 

    static DataTable fillSampleDataTable(string myCommand) 
    { 
     var connectionString = ConfigurationManager.ConnectionStrings["XXX"].ConnectionString; 
     using (var conn = new SqlConnection(connectionString)) 
     using (var cmd = conn.CreateCommand()) 
     using (var adapt = new SqlDataAdapter(cmd, conn)) 
     { 
      conn.Open(); 
      cmd.CommandText = myCommand; 
      DataSet mySet = new DataSet(); 
      adapt.Fill(mySet, "SampleData"); 
      return mySet.Tables["SampleData"]; 
     } 
    } 
} 

但一般DataSets和DataTables是過去的工件。今天,你最好使用強類型模型。

所以定義模型:

public class MyModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

,然後編寫,將返回這些模型的列表的方法:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var models = SelectTop100Models("SELECT top 100 * FROM x"); 
     //do other stuff 
    } 

    static IEnumerable<MyModel> SelectTop100Models() 
    { 
     var connectionString = ConfigurationManager.ConnectionStrings["XXX"].ConnectionString; 
     using (var conn = new SqlConnection(connectionString)) 
     using (var cmd = conn.CreateCommand()) 
     { 
      conn.Open(); 
      cmd.CommandText = "SELECT top 100 * FROM x"; 
      using (var reader = cmd.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        yield return new MyModel 
        { 
         Id = reader.GetInt32(reader.GetOrdinal("ID")), 
         Name = reader.GetString(reader.GetOrdinal("Name")), 
        }; 
       } 
      } 
     } 
    } 
} 

或者你可以考慮使用一個ORM框架,如ADO.NET Entity Framework爲它將簡化查詢關係數據庫並使用LINQ查詢直接處理強類型模型。

+0

美妙+思考的食物+「過去的神器」。 =很酷的答案 – whytheq

+0

一個問題darin - 在我的代碼的更正中,爲什麼使用'var'來代替每個'using'語句而不是特定的類型? – whytheq

+0

也 - 如果我玩的是一組較大的數據(50,000個記錄是20個字段寬是第二種方法仍然是未來的方向?) – whytheq