C# で記述されたコマンド ライン ユーティリティがあります。これは、データベース内のいくつかのレコードを更新してから、他のものをチェックするループに入ります。何らかの理由で、SQL の実行後、SQL Server 2008 で待機中のコマンド セッションが常にスリープ状態のままになります。SQL サーバー アクティビティ モニターを使用し、sp_who2 を実行してそれを確認できます。しかし、SQL トランザクションは確かに正常にコミットされました。これは、コードのデバッグと、データベース内のデータ レコードのタイムスタンプからわかります。また、コマンドライン ユーティリティを明示的に停止すると、開いているスリープ セッションが強制終了されます。これは、私の関数が、アプリケーションが中止されたときに CLR によってガベージ コレクションされるまで破棄できない SQL 接続オブジェクトを作成することを示しているようです。これはどのように起こりますか?ありがとう。コードは次のとおりです。
bool result = false;
using (SqlConnection conn = new SqlConnection(this.Connection))
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText =
@"if not exists (select id from pl where sj=@sj and ej=@ej and dateInactivated is null)
insert into pl(sj,ej,pf, br, tk, lastModified )
values(@sj,@ej,@pf,@br,@tk,getDate())
else
update pl set sj=@sj,ej=@ej,pf=@pf,br=@br,tk=@tk,lastModified=getDate()
where sj=@sj and ej=@ej and dateInactivated is null
";
cmd.Parameters.AddWithValue("@sj", sj);
cmd.Parameters.AddWithValue("@ej", ej);
cmd.Parameters.AddWithValue("@pf", pf);
cmd.Parameters.AddWithValue("@br", br);
cmd.Parameters.AddWithValue("@tk", tkData);
cmd.CommandTimeout = 60;
SqlTransaction trans = null;
try
{
conn.Open();
trans = conn.BeginTransaction();
cmd.Transaction = trans;
cmd.ExecuteNonQuery();
trans.Commit();
conn.Close();
result = true;
}
catch (SqlException ex)
{
if (trans != null)
{
trans.Rollback();
}
Log.WriteLog(LogLevel.ERROR, ex.Message);
result = false;
}
finally
{
if (conn.State != ConnectionState.Closed)
{
conn.Close();
}
}
}
}
return result;
tk フィールドは xml データベース フィールドであることに注意してください。