我有一个很奇怪的问题,并希望有人在那里有类似的经历。.NET SQL Server连接问题 - 也许连接池相关
我的公司申请的一个客户端在我们的应用程序开始时就被SQL Server“禁止”了。行为很奇怪。我会以点形式写出来。
创建SQL连接,检索数据,关闭连接,与其他数据源交谈,然后拒绝访问SQL Server。
这里的长篇大论版本:
.NET应用程序连接到数据库多次。获取一些数据,做一些工作。然后它会获得更多的数据,然后出现“SQL Server无法找到或访问被拒绝”的错误。如果在不重新启动应用程序的情况下再次启动该进程,则不能再向SQL Server连接。所有新的连接都会导致“无法找到SQL Server或访问被拒绝”。如果应用程序重新启动,那么它将重复上述过程。
这是5年来我第一次遇到这个问题。该应用程序确实有用Delphi 7编写的代码.Dephi 7/VBA代码没有问题。我的.NET代码执行实际查询如下所示:
protected abstract DbConnection GetConnection();
protected abstract DbDataAdapter GetDataAdapter(DbCommand cmd);
protected abstract DbCommand GetCommand(DbConnection conn, String sql);
protected abstract DbCommandBuilder GetCommandBuilder(DbDataAdapter adapter);
public virtual DataTable Query(string sql)
{
var dt = new DataTable();
using (var conn = GetConnection())
{
try
{
using (var cmd = GetCommand(conn, sql))
{
using (var adapter = GetDataAdapter(cmd))
{
adapter.Fill(dt);
}
}
}
catch (Exception ex)
{
throw new SqlStatementException(sql, ex);
}
}
return dt;
}
这是我自己非常脏的DAL。当它使用它使用OleDbConnection。
注意:由于遗留代码,连接字符串配置为OleDbConnection。花点时间检查我的代码后,我确实有能力将连接类型更改为SqlConnection。我还没有尝试过。
在客户端的机器上,我一直无法在主应用程序之外重现问题。我尝试创建一个小应用程序,使用上面的格式使用OleDbConnection将100个调用背对背,但它成功执行。
主应用程序的失败发生在同一个地方。这应该给我一个线索,除非我无法理解它,因为它正在进行重复查询,获取相同的数据。但我会说应用程序会与两个数据源对话并将数据从一个数据源传输到另一个数据源。在它进行转移之前,它对源代码进行了一些验证。因此,它通过ODBC与另一个数据库(基于专有文件)进行通信,并成功返回,然后在尝试通过OleDbConnection与SQL Server交谈时失败。
我的怀疑是在连接池中发生的事情。这导致了失败,从而导致拒绝访问。
其他有趣的一点。所有的工作都很好,大约一年前,客户在几个月前买了一台新机器,一切正常,然后突然停下来。我把应用程序放在客户端的另一台机器上,一切都运行良好,然后出现了同样的问题。我们在客户端的机器上关闭了所有东西,但问题依然存在。我认为防火墙,但没有运气。
任何帮助,非常感谢。
验证SQLSERVER没有t将其进行更改为连接未在此代码关闭。另外,如果服务器不接受多个连接,那么这将成为连接到同一服务器上的多个数据库的问题 – Shon
@Shon:using语句关闭连接。澄清一个数据源在一台服务器上,另一个数据源在另一台服务器上。虽然在同一台服务器上应该不成问题。 –
我不太了解,但我不认为连接池问题会带来这样的信息。 “无法找到SQL Server或访问被拒绝”。但是,您的怀疑在某些观点上也是有道理的。词“新机”,“拒绝访问”,“ConnectionString的”让我觉得事情的授权,但只是想.. –