最小限のボイラープレートコードを使用してデータベースクエリを実行するための最良の方法を見つけようとしています。SqlCommandドキュメントで提案されている方法:
private static void ReadOrderData(string connectionString)
{
string queryString = "SELECT OrderID, CustomerID FROM dbo.Orders;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(queryString, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
try
{
while (reader.Read())
{
Console.WriteLine(String.Format("{0}, {1}", reader[0], reader[1]));
}
}
finally
{
reader.Close();
}
}
}
ほとんどの場合、データベースと対話するすべてのメソッドで繰り返す必要のあるコードで構成されています。
私はすでに接続の確立を除外する習慣があります。これにより、次のようなコードが生成されます。(例を少し簡単にするために、データを返すように変更しています。)
private SQLConnection CreateConnection()
{
var connection = new SqlConnection(_connectionString);
connection.Open();
return connection;
}
private List<int> ReadOrderData()
{
using(var connection = CreateConnection())
using(var command = connection.CreateCommand())
{
command.CommandText = "SELECT OrderID FROM dbo.Orders;";
using(var reader = command.ExecuteReader())
{
var results = new List<int>();
while(reader.Read()) results.Add(reader.GetInt32(0));
return results;
}
}
}
それは改善ですが、それでも私を悩ませるのに十分な定型文があります。これをさらに減らすことはできますか?特に、手順の最初の2行について何かしたいと思います。メソッドがの作成を担当する必要があるとは思わないSqlCommand
。例のように小さな繰り返しですが、トランザクションが手動で管理されているか、タイムアウトが変更されているか、またはそのようなものである場合、それは大きくなるようです。
編集:少なくとも仮定的には、返されるさまざまなタイプのデータの束が必要になると想定します。その結果、ソリューションは1つのサイズですべてに対応する方法ではなく、少なくとも、、、、、または他のいずれかが呼び出されているかどうかExecuteNonQuery
に応じてExecuteScalar
、いくつかの異なる方法が必要になります。それらの間の繰り返しを減らしたいと思います。ExecuteReader
ExecuteReaderAsync