C#クラス内からSQLクエリを実行する必要があります。 2つのオプションを考えました
私の質問はどちらが良い方法でしょうか?ソリューションがサーバーへの接続を短時間だけ保持することが重要です。
上記が適切でない場合は、他のアイデアを受け入れます。
前もって感謝します。
SqlCommandを使用します。このコードは、非常に短い期間のみ接続を維持します(クエリが実行される限り)。
DataTable results = new DataTable();
using(SqlConnection conn = new SqlConnection(connString))
using(SqlCommand command = new SqlCommand(query, conn))
using (SqlDataAdapter dataAdapter = new SqlDataAdapter(command))
dataAdapter.Fill(results);
から MSDN:
次の例では、SqlConnection、SqlCommand、およびSqlDataReaderを作成します。この例では、データを読み取り、コンソールに書き込みます。最後に、この例では、SqlDataReaderを閉じてから、Usingコードブロックを終了するときにSqlConnectionを閉じます。
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
{
// Always call Close when done reading.
reader.Close();
}
}
}
場合によります。クエリの結果が気にならない場合は、sqlcmdを使用するプロセスの分岐が問題ない場合があります。一方、結果を制御する必要がある場合は、ADO.NETを使用することをお勧めします。接続を長時間開いたままにしないようにするには、接続文字列にPooling=false
を追加して ADO.NET connection pooling を無効にします。
using (var conn = new SqlConnection("Data Source=server;Initial Catalog=somedb;User Id=foo;Password=secret;Pooling=false"))
using (var cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = "DELETE FROM foo";
var result = cmd.ExecuteNonQuery();
}
SqlCommandは良い考えだと思いますが、このクラスはSQL Serverに接続している場合にのみ使用できることに注意してください。 Oracle、または他のデータベースへのOleDb接続を扱う場合は、他のタイプのコマンド/接続クラスが必要になります。すべてのデータコマンドオブジェクトは DbCommand を継承しているので、それについて読みます。
別のプロセスを接続する必要がないので、SqlCommandは明らかに勝者です。データベース接続は、使い終わったらすぐに閉じることができます。
そして、sqlcmd
が利用できないマシンにアプリケーションを配布することもできます。