web-dev-qa-db-ja.com

SQL / C#-クエリを実行するための最良の方法

C#クラス内からSQLクエリを実行する必要があります。 2つのオプションを考えました

  1. Sqlcmdのプロセスを開始します。
  2. SqlCommandオブジェクトを使用する。

私の質問はどちらが良い方法でしょうか?ソリューションがサーバーへの接続を短時間だけ保持することが重要です。

上記が適切でない場合は、他のアイデアを受け入れます。

前もって感謝します。

18
Ash Burlaczenko

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);
29
Justin Niessner

から 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();
        }
    }
}
7
Shaun Mason

場合によります。クエリの結果が気にならない場合は、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();
}
4
Darin Dimitrov

SqlCommandは良い考えだと思いますが、このクラスはSQL Serverに接続している場合にのみ使用できることに注意してください。 Oracle、または他のデータベースへのOleDb接続を扱う場合は、他のタイプのコマンド/接続クラスが必要になります。すべてのデータコマンドオブジェクトは DbCommand を継承しているので、それについて読みます。

0
Steve Danner

別のプロセスを接続する必要がないので、SqlCommandは明らかに勝者です。データベース接続は、使い終わったらすぐに閉じることができます。

そして、sqlcmdが利用できないマシンにアプリケーションを配布することもできます。

0
Adam Lear