防御性数据库编程 - 我应该使用Singleton模式

时间:2012-09-16 12:34:43

标签: c#

以下是防御性编程吗?

我的意思是,如果它丢失了连接,或者在运行期间发生了某些问题,然后用户再次运行,那么.NET框架是否已经整理了第一次运行时创建的任何打开的连接和对象? / p>

我听说过提到“Singleton模式” - 这是我应该在静态方法CreateConnection中使用的吗?

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"];
    }
  }
 }

1 个答案:

答案 0 :(得分:4)

我建议你使用ADO.NET连接池,a.k.a在你完成使用后立即处理连接=>在using语句中包装所有IDisposable资源:

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"];
        }
    }
}

但通常DataSet和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查询直接使用强类型模型。