0

我有一个 C++ 应用程序(使用在 Windows 2000 服务器上针对 SQL 2000 数据库运行的 VS2003 编译)运行良好多年,现在正在崩溃。

我的日志显示数据库连接(使用 SQL Server 驱动程序的 ODBC)将正常工作(读取和更新数据库)然后在抛出异常(并且被捕获/记录但没有真正的细节)之后,连接可以从数据库中读取数据但是不能再更新数据库。

所以我看到一个线程正在读取下一行进行处理,将数据从套接字发送到另一台服务器,尝试将记录更新为已处理和 BOOM。

我从失败的查询中得到的唯一错误信息是:

[Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared.  [37000]

后跟一个空白,就像您通常会看到查询失败的原因一样(语法错误,找不到表,无论如何,但这次什么都没有)。

此代码处理数万条记录,可能运行数月,并且在此线程(似乎总是第一个受害者,可能只是最忙并首先被攻击)开始阻塞所有其他连接后不久,所有其他连接似乎都有同样的问题 -允许读取,但更新会引发此异常。

上次我快速查看了任务管理器(它很快被弹跳,所以我不能长时间检查),该应用程序使用的是典型的 5 到 6 兆内存,其他资源看起来很正常。

其他应用程序正在使用数据库并且在此期间没有错误。

当查询有效时,我在网上找不到任何你得到这个报告的错误结果的东西......

帮助!

4

2 回答 2

0

从错误中,“[Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepare.[37000]”我假设 ODBC 驱动程序正在尝试准备一个语句。这给我们带来了很多不稳定的问题。

在 ODBC 数据源的定义中,取消选中“为准备好的 SQL ... 创建临时存储过程”选项,看看这是否能修复错误。

于 2009-06-10T20:41:23.653 回答
0

更新语句是否有可能写入对其字段而言太大的数据或在不允许空值时为空值?

也许您可以将更新记录到文件中以确定问题是否是数据驱动的。

我不确定 SQL Server 的 ODBC 驱动程序是否使用 ADO,但我认为 ADO 在其更新和插入代码中存在泄漏,会逐渐消耗您的所有内存。如果您在大约相同数量的记录后始终遇到崩溃,您可能需要进行调查。

于 2009-06-11T03:12:10.243 回答