1

SqlDataAdapter を使用してコマンドを実行した後、データベースとの接続が閉じられません。何をする必要があるか教えてください。ここにコードスニペットがあります

 DataSet dsResult = new DataSet("Result");
            SqlCommand selectCommand = new SqlCommand();
            if (_datasource.DataType == DataType.SqlText)
            {
                selectCommand = GenerateCommand(_datasource.DataType,_sqlquery);
            }
            else
            {
                selectCommand = GenerateCommand(_datasource.DataType, _datasource.DataObjectName, _fieldNames, _filters);
            }

            SqlDataAdapter da = new SqlDataAdapter(selectCommand.CommandText, _datasource.ConnectionString);
            da.Fill(dsResult);



            dataset = dsResult;

da.SelectCommand.Connection.Close() のように明示的に接続を閉じようとしました。しかし、問題は修正されませんでした。また、次のことを試してみましたが、まだ問題が修正されていません

using(SqlDataAdapter da = new SqlDataAdapter(selectCommand.CommandText, _datasource.ConnectionString))
{
                da.Fill(dsResult);
}

セッションを解放するために何ができるか教えてください。

4

1 に答える 1

2

Fillメソッドは、関連するSelectCommandプロパティで指定されたSELECTステートメントを使用して、データソースから行を取得します。SELECTステートメントに関連付けられている接続オブジェクトは有効である必要がありますが、開いている必要はありません。Fillが呼び出される前に接続が閉じられると、データを取得するために接続が開かれ、次に閉じられます。フィルが呼び出される前に接続が開いている場合、接続は開いたままになります。

http://msdn.microsoft.com/en-us/library/377a8x4t.aspx

私はあなたのケースを強調しました。接続を開いていないため、DataAdapterによって自動的に接続が開かれ、接続が終了すると閉じられます。

編集:接続を自分で管理する場合は、接続が終了したらすぐに閉じる必要があります。

using-statementそのため、(例外の場合でも)それを破棄/閉じるを使用できます。

using(var con = new SqlConnection(_datasource.ConnectionString))
{
    using(var da = new SqlDataAdapter(selectCommand.CommandText, con))
    {
        con.Open(); // not needed but ...
        da.Fill(dsResult); // will not close the conection now
    }
} // will close the connection

Edit2:接続を閉じることは、それが物理的に閉じられることを意味しません。再度使用できることは、接続プールのヒントにすぎません。

ExecuteReaderには、開いていて利用可能な接続が必要です。接続の現在の状態は接続中です

于 2012-07-27T09:38:22.167 に答える