C# SQL连接上的应用程序崩溃。关闭方法
我有一个windows服务,它正在执行大量的数据处理。在某个时刻,我的服务在关闭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
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();
}
}
}