我有一个非常奇怪的问题,我希望那里的人有类似的经历。
在我们的应用程序开始时,我的公司应用程序的一个客户端正在从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通信时失败。
我的怀疑是连接池中发生的事情。这导致失败,进而导致拒绝访问。
其他有趣的观点。所有工作都运行了大约一年,客户几个月前买了一台新机器,一切正常,然后突然停止。我把应用程序放在客户端站点的另一台机器上,并且运行良好一周,然后出现了同样的问题。我们在客户端的机器上关闭了一切,但问题仍然存在。我以为防火墙但没有运气。
非常感谢任何帮助。
答案 0 :(得分:0)
是否会将其放在评论中,但它太大了: - )
我看到你的连接创建方法是抽象的。这当然意味着衍生品在创建连接时可以做各种不好的事情。我先看看那里。
我在类似的情况下发现了一件事......如果你在代码中做了一些事情来创建连接,使连接字符串唯一,你就不会成为重用那些汇集的联系。所以...做一些事情,比如添加一个"App=MyApp"
+递增的数字,日期/时间或guid,它会破坏你使用池化连接的能力。当这件事发生在我身上时,我花了很长时间才弄明白。
如果你的应用程序足够慢,那么#34;在过去,这样" old"汇集的连接从池中掉出来,你可能永远不会看到问题...但是,然后,说一个客户获得热门的新硬件......并且责备......奇怪的错误无处不在!这可能不是你发生的事情,但也许它会给你一些关于在哪里看的想法。祝你好运!