0

以下是防御性编程吗?

我的意思是,如果它失去了连接,或者在运行时发生了一些问题,然后用户再次运行它,.NET 框架是否会清理它第一次运行时创建的任何打开的连接和对象?

我听说过“单例模式”——这是我应该在静态方法 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"];
    }
  }
 }
4

1 回答 1

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 实体框架,因为它可以简化您查询关系数据库并使用 LINQ 查询直接处理强类型模型。

于 2012-09-16T12:44:47.463 回答