0

次の防御的なプログラミングですか?

つまり、接続が失われた場合、または実行時に問題が発生した後、ユーザーが再度実行した場合、.NET Frameworkは、最初に実行されたときに作成された開いている接続とオブジェクトを整理しますか?

「シングルトンパターン」についての言及を聞いたことがありますが、これは静的メソッド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")),
                    };
                }
            }
        }
    }
}

または、 ADO.NET Entity FrameworkなどのORMフレームワークの使用を検討することもできます。これにより、リレーショナルデータベースのクエリが簡単になり、LINQクエリを使用して厳密に型指定されたモデルを直接操作できるようになります。

于 2012-09-16T12:44:47.463 に答える