odbc和C ++的异常问题导致奇怪的数据库行为

时间:2009-06-10 20:32:45

标签: c++ sql-server-2000 odbc windows-server-2000

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

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

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

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

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

后跟一个空格,就像你通常会看到查询失败的原因(语法错误,找不到表,不管怎样,但这次没什么)。

此代码处理成千上万的记录,可能会持续运行数月和此线程后不久(似乎总是第一个受害者,可能只是最繁忙的并且首先受到打击)开始窒息所有其他连接似乎具有同样的问题 - 允许读取,但更新会抛出此异常。

我最后一次快速查看了任务管理器(它快速反弹,所以我无法长时间检查)并且应用程序使用典型的5到6兆内存,其他资源看起来很正常。

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

当查询有效时,我无法在线找到任何报告错误结果的内容......

HELP!

2 个答案:

答案 0 :(得分:0)

从错误中,“[Microsoft] [ODBC SQL Server驱动程序] [SQL Server]语句无法准备。[37000]”我假设ODBC驱动程序正在尝试准备语句。这导致了很多不稳定的问题。

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

答案 1 :(得分:0)

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

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

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