2

我们的一个客户有一个运行在 SQL Server 2005 后端之上的应用程序 (FoxPro 9)。间歇性地,他们失去了与 SQL Server 数据库的 ODBC 连接。以下是初始错误信息:

错误消息:连接错误:[Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionRead (recv())。

ODBC 错误消息:[Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionRead (recv())。

SQL 状态:01000

ODBC 错误编号:10054

ODBC 句柄:1

FoxPro 错误编号:1526

我们无法在命令中复制此错误。我们尝试了任何数量的解决方案都无济于事。我们发现的一种此类硬件基础解决方案在以下网址中进行了描述:http: //support.microsoft.com/kb/942861/en-us

我提到这一点是因为它几乎完全符合我们所看到的。但是,我们已经实施了该帖子中列出的所有解决方法(以及在这个http://support.microsoft.com/kb/948496中) - 问题仍然存在。

此问题似乎在执行长时间运行的查询后出现,但我们没有收到来自应用程序或 SQL Server 的任何超时错误。我不相信这是空闲超时的结果,因为它有时会发生在执行程序的中间。

我不是硬件专家,但网络和服务器 (Windows Server 2003) 似乎都很快且设计良好。但是,有时数据库服务器会承受很大的压力。

如果有人对我们可以尝试的事情有任何建议……请告诉我们!

4

4 回答 4

1

只是在黑暗中拍摄,但您是否尝试过运行跟踪并尝试捕获错误事件以及任何 tsql. 这可能会提供一些线索或帮助您查看模式。

于 2009-01-08T18:08:32.487 回答
1

只是对这个问题的跟进……部分解决方案。

我确实进行了跟踪,实际上是其中的一些。我发现,这些错误似乎有多种原因。我能够找到并修复其中一个,但我们仍然在其他地方遇到此错误,并且它们没有出现在我所做的跟踪中。

那么我找到的那个是怎么回事?好吧,从跟踪中我发现这些 ODBC 错误出现在另一个 SQL Server 错误之后:

Error: 1203, Severity: 20, State: 1.
Process ID 94 attempted to unlock a resource it does not own: OBJECT: 25:1699834390:0 . Retry the transaction, because this error may be caused by a timing condition. If the problem persists, contact the database administrator.

从 FoxPro 代码中,我发现插入语句导致了这个错误......并非总是......但有时。在此插入中,他们将一个表中的所有字段以及另一个表中的一些字段提取到第三个表中。此数据库中的每个表都有一个名为 id_col 的标识列,填充第三个表的 select 语句返回两个 id_col 字段。

insert into tablethree 
select a.*, b.price, b.item, id_col 
from tableone a, tabletwo b 
where a.item = ....

当我们重组代码以便只返回一个 id_col 时......错误停止了。

老实说,我同时修复了另一个可能导致此错误的原因。在此之前还有另一个大/长查询,它a.item+a.customer = lc_item+lc_customer在 sql server 查询中使用 Foxpro Rushmore 语法(例如)。我们以前遇到过这种类型的问题,所以它可能是导致问题的原因......但证据高度支持额外的身份列是原因。

于 2009-03-06T01:20:53.913 回答
1

使用 pb application 和 ms sql 作为 db,从头开始设置 2 个事务对象。一个函数使用第一个事务循环游标,在此循环中,第二个事务对象用于更新另一个表。如果更新后未使用显式提交(第二个事务 obj),则第一个连接将关闭,我收到 [Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionRead (recv()) 错误。一旦我为相应的事务调用了适当的提交语句,一切都像魅力一样。 是的,错误总是在您实际发生崩溃的位置之前的某个地方 - 假设您处于调试模式. 有趣的是,Sybase 设法关闭/打开适当的事务,而无需显式地对第二个事务对象发出提交!!!!

于 2013-01-03T20:32:26.197 回答
0

Not sure if you have come across a complete solution, but have you looked into whether the network connection ever gets interrupted? One of the VFP programs I was developing started losing its SQL connection very frequently for users that were using laptops. It seemed that the laptops were temporary losing the network connection. Even if the connection is only gone for a couple seconds, the handle in VFP needs to be reset. Not sure if this is your exact issue, but sounded similar to me.

于 2009-04-13T14:15:01.737 回答