c# - ExecuteNonQuery 离开休眠等待命令 session

标签 c# sql-server-2008-r2 executenonquery

我有一个用 C# 编写的命令行实用程序,它会更新数据库中的一些记录,然后进入循环检查其他一些内容。由于某种原因,SQL 执行总是在 SQL server 2008 中留下一个 sleep 等待命令 session 。我可以使用 SQL Server 事件监视器并运行 sp_who2 来确认这一点。但是 SQL 事务确实已经提交成功了。我可以通过代码调试以及数据库中数据记录的时间戳来判断这一点。 此外,当我明确停止命令行实用程序时,打开的休眠 session 将被终止。这似乎表明我的函数创建了一些 SQL 连接对象,在应用程序中止时,只有在 CLR 对其进行垃圾回收后才能释放这些对象。怎么会这样?谢谢。这是代码:

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数据库字段。

最佳答案

这称为连接池,you want it to work this way .

基本上,完全断开连接然后为您的应用程序重新建立它会导致比仅仅重新使用上次调用您的代码时留下的空闲连接更高的惩罚。这是好事。

关于c# - ExecuteNonQuery 离开休眠等待命令 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12164832/

相关文章:

c# - 从 C# 调用存储过程时出错

c# - 如何设置 Socket.ConnectAsync 超时?

c# - View 模型或XAML代码隐藏的WPF CollectionViewSource

c# - 将 Window.Title 绑定(bind)到 Application 方法

sql-server - 更新多行而不循环

sql - SQL Server 中从右到左的字符串

c# - 返回标识值时的 ExecuteScalar 与 ExecuteNonQuery

out-of-memory - SqlCommand ExecuteNonQuery 抛出 OutOfMemoryException

c# - 常规方法的 Action/Func 扩展方法

sql-server - 聚集索引上的列顺序