C# SQL连接上的应用程序崩溃。关闭方法

C# SQL连接上的应用程序崩溃。关闭方法,c#,crash,sqlconnection,sqlconnection.close,C#,Crash,Sqlconnection,Sqlconnection.close,我有一个windows服务,它正在执行大量的数据处理。在某个时刻,我的服务在关闭SQLConnection时崩溃。当我对Close connection方法调用进行注释时,服务一直在工作,没有崩溃 有什么问题吗?下面是一段代码片段 private void DeleteTempTable() { _logger.Info("DeleteTempTable"); try { foreach (KeyValuePai

我有一个windows服务,它正在执行大量的数据处理。在某个时刻,我的服务在关闭
SQLConnection
时崩溃。当我对Close connection方法调用进行注释时,服务一直在工作,没有崩溃

有什么问题吗?下面是一段代码片段

private void DeleteTempTable()
    {
        _logger.Info("DeleteTempTable");

        try
        {

            foreach (KeyValuePair<string, string> item in _stables)
            {                 
                string dropSql = string.Empty;
                dropSql = string.Format("DROP TABLE [{0}];", item.Value);                 


                    SqlConnection oConnDropTables = new SqlConnection(connectionString);
                    oConnDropTables.Open();

                    if (!string.IsNullOrEmpty(dropSql))
                    {
                        using (SqlCommand cmd = new SqlCommand(dropSql, oConnDropTables))
                        {                              
                            cmd.ExecuteNonQuery();                             
                        }
                    }

              if (oConnDropTables != null && oConnDropTables.State == ConnectionState.Open)
                oConnDropTables.Close();                    
                oConnDropTables = null;



            }


        }
        catch (Exception ex)
        {
            _logger.Error("Error " + ex.Message);
            throw ex;
        }

    }
private void deleteTestable()
{
_logger.Info(“可删除”);
尝试
{
foreach(稳定中的KeyValuePair项)
{                 
string-dropSql=string.Empty;
dropSql=string.Format(“DROP TABLE[{0}];”,item.Value);
SqlConnection oConnDropTables=新的SqlConnection(connectionString);
oConnDropTables.Open();
如果(!string.IsNullOrEmpty(dropSql))
{
使用(SqlCommand cmd=newsqlcommand(dropSql,oConnDropTables))
{                              
cmd.ExecuteNonQuery();
}
}
if(oConnDropTables!=null&&oConnDropTables.State==ConnectionState.Open)
oConnDropTables.Close();
oConnDropTables=null;
}
}
捕获(例外情况除外)
{
_记录器错误(“错误”+ex.Message);
掷骰子;
}
}
当我评论这个紧密的连接时,服务工作正常,没有崩溃。此外,它不会卡在挡块中。此外,连接不是空的,并且connectionstate仅打开

我所尝试的: 1) 将“使用”构造用于连接-没有帮助
2) 捕获SQLException以检查我是否得到任何东西-没有帮助

问题是每次循环运行时都要创建一个新的连接对象。当您关闭SQL连接时,它实际上并没有关闭,而是返回到应用程序池,准备重新使用。一次可以在SQL中打开的连接数量有限

尝试将SQLConnection对象移出循环,只需在循环中执行命令,并在循环完成后关闭连接

private void DeleteTempTable()
{
    _logger.Info("DeleteTempTable");

    try
    {
        using(SqlConnection oConnDropTables = new SqlConnection(connectionString))
        {
            oConnDropTables.Open();

            foreach (KeyValuePair<string, string> item in _stables)
            {                 
                string dropSql = string.Empty;
                dropSql = string.Format("DROP TABLE [{0}];", item.Value);                 

                if (!string.IsNullOrEmpty(dropSql))
                {
                    using (SqlCommand cmd = new SqlCommand(dropSql, oConnDropTables))
                    {                              
                        cmd.ExecuteNonQuery();                             
                    }
                }
            }
        }

    }
    catch (Exception ex)
    {
        _logger.Error("Error " + ex.Message);
        throw ex;
    }

}
private void deleteTestable()
{
_logger.Info(“可删除”);
尝试
{
使用(SqlConnection-oConnDropTables=newsqlconnection(connectionString))
{
oConnDropTables.Open();
foreach(稳定中的KeyValuePair项)
{                 
string-dropSql=string.Empty;
dropSql=string.Format(“DROP TABLE[{0}];”,item.Value);
如果(!string.IsNullOrEmpty(dropSql))
{
使用(SqlCommand cmd=newsqlcommand(dropSql,oConnDropTables))
{                              
cmd.ExecuteNonQuery();
}
}
}
}
}
捕获(例外情况除外)
{
_记录器错误(“错误”+ex.Message);
掷骰子;
}
}
删除
Close()
不会让任何问题消失,坦率地说,我不相信它会消失。因为您还不了解这个问题,所以假设随机代码更改已经解决了这个问题还为时过早。具体而言:

  • 使用
    Close()
    ,它每次都返回到池的连接;当您调用
    Open()
    时,它将从池中恢复相同的连接(已清除,除了一些小事情)
  • 如果没有
    Close()
    ,以前的连接将被垃圾收集,这可能导致连接池饱和,或者数据库服务器的连接计数饱和;基本上是坏事
我怀疑发生的是你有一些随机的错误,你现在没有看到,随机的。例如,网络连通性,或
字典的不可预测顺序(这意味着您不知道表的顺序是什么
DROP
ped,如果表之间有外键,这一点非常重要)

当前代码唯一的主要问题是它没有使用
using
。不过,还有一些多余的线路。这样会更好:

foreach (var item in _stables)
{                 
    var dropSql = string.Format("DROP TABLE [{0}];", item.Value);
    using(var oConnDropTables = new SqlConnection(connectionString))
    using (var cmd = new SqlCommand(dropSql, oConnDropTables))
    {
        oConnDropTables.Open();
        cmd.ExecuteNonQuery();
    }
}
或(最好):


欢迎来到StackOverflow。请在您的问题中添加“崩溃”的完整跟踪。它可能包含有关“崩溃”原因的基本信息。在循环中打开和关闭连接…???定义“崩溃”。例外情况是什么?你的
\u记录器报告了什么?@codingbiz不理想,但它不应该导致崩溃-它只会与池对话我的服务基本上停止了。。。我现在正在尝试debugdiag捕获dump…我同意示例代码(尽管使用
中的最后两行是不必要的;让它处理掉即可)-但是:开始时的逻辑与症状不匹配。删除
Close()
最坏情况下会导致“从池中提取超时”或类似情况。没有理由添加关闭会使其崩溃。感谢您的回复。即使进行了建议的更改,应用程序仍会在connection.close()处崩溃。而且我忘了提到我们有很多COM电话。。你能猜到是否有任何东西可以链接到这个吗?你应该做的第一件事是重新启动SQL Server服务。然后试着运行你的程序。如果可行,那么我填充应用程序池的逻辑是正确的。然后试着运行你的程序几次。如果一次又一次地尝试这个错误,那么在代码中的某个地方,另一个连接可能没有关闭。所有这些只是目前的故障排除,因为我不知道您的其他代码正在做什么。调查SQL Server中发生的事情的另一种方法是
using(var oConnDropTables = new SqlConnection(connectionString))
{
    oConnDropTables.Open();
    foreach (var item in _stables)
    {                 
        var dropSql = string.Format("DROP TABLE [{0}];", item.Value);
        using (var cmd = new SqlCommand(dropSql, oConnDropTables))
        {
            cmd.ExecuteNonQuery();
        }
    }
}