SQL Connection.Close方法上的应用程序崩溃 - c#

我有一个Windows服务,正在执行大量数据处理。在某个时候,我的服务在关闭SQLConnection时崩溃了。当我评论“关闭”连接方法调用时,“服务”将持续运行而不会崩溃。

可能是什么问题呢 ?下面是一个代码片段

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;
        }

    }

当我评论关闭连接时,服务正在运行而不会崩溃。而且它没有被卡在挡块中。另外Connection不是Null并且connectionstate仅处于打开状态。

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

参考方案

删除该Close()应该不会使任何问题消失,并且坦率地说,我认为它没有。由于您还不了解问题,因此现在假定随机代码更改已解决此问题还为时过早。特别:

使用Close(),每次都将连接返回到池;当您调用Open()时,它将从池中恢复相同的连接(已清除,除了一些小事)
如果没有Close(),则先前的连接将被垃圾回收,这可能导致连接池饱和,或者数据库服务器的连接计数饱和;基本上-坏事

我怀疑正在发生的事情是您随机出现了一些随机错误,而现在却看不到。例如,网络连通性或Dictionary<,>的不可预测顺序(这意味着您不知道对表DROP进行排序的顺序,如果它们之间有外键,这非常重要)。

当前代码的唯一主要问题是它没有使用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();
    }
}

或(首选):

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();
        }
    }
}

SQL Joins与Java代码? - java

我有这样的查询Select Folder.name from FROM FolderTable,ValidFolder, ValidFolderGroup, ValidUser, ValidLocation, ValidDepartment where ValidUser.LocationCode *= ValidLocation.LocationCode …

数学和科学方程式和Fomulas的数​​据类型-SQL Server 2008? - c#

我正在使用SQL Server2008。我有一个用于教育部门工作的小项目。为此,我需要存储数学和科学方程式和公式。这意味着数据可能包含带有上标和下标的值。我希望以相同的格式保存数据。是否有适合我需求的适当数据类型? 参考方案 如果此列专门用于存储数学方程式和科学公式,那么我将使用Xml列,然后将数据存储在MathML format中。文字段落,例如说明,可以…

在本地上测试Flask应用程序时出现ERR_CONNECTION_REFUSED - python

我创建了一个简单的html-app,并想使用python的flask包进行部署。我运行以下代码:from flask import Flask, render_template,request app =Flask(__name__) @app.route('/') def index(): return render_template(…

是否有任何ORM可以为高速散装刀片提供合适的方法? - c#

是否有任何ORM可以为高速散装刀片提供不错的方法?我问的原因是,Entity Framework非常适合拉出数据,但是如果您要以每秒10行以上的速度进行插入,则会完全失败。更新资料我目前正在使用DataTable和T-SQL以每秒80,000行的速度插入,但是如果我能全面使用ORM会更干净。 参考方案 您可以使用EF进行后门操作,但是反对使用ORM的常见参数…

在文本字段中键入时显示预制建议列表 - javascript

如标题所说我正在处理一个mysql项目,我希望该文本字段在键入它时向现有用户提供建议(管理员控制页以禁止用户..类似的东西)一个简单的例子来解释:当我输入文字时..我想给用户输入建议假设他正在输入颜色名称所以当他在其中输入b在他继续之前,会出现一个列表,向他提供我们预先设定的建议,例如:黑色棕色蓝色然后如果他输入l为bl该列表将是:黑色蓝色布拉布拉有什么建议…