为啥我通过 ODBC 调用的存储过程在同一位置失败? [关闭]
Posted
技术标签:
【中文标题】为啥我通过 ODBC 调用的存储过程在同一位置失败? [关闭]【英文标题】:Why does the Store Procedure I'm calling over ODBC fail at the same location? [closed]为什么我通过 ODBC 调用的存储过程在同一位置失败? [关闭] 【发布时间】:2008-10-15 20:18:42 【问题描述】:我正在使用freeodbc++ 库来访问 MS SQL Server 2000 数据库(SP3?SP4?)上的数据。特别是,我正在运行一个特别长且令人讨厌的存储过程。我可以在 SQL Profiler 中观看该过程的执行,但是,它往往会在某个点停止处理。没有错误代码或异常抛出。如果我注释掉始终是最后一个语句的嵌套语句,它只会在注释之前稍微结束。我没有尝试从根本上评论整个该死的事情......我将查询超时设置为 300 秒。可调用语句通常会在 1 秒内返回,而不会真正完成 SP。
有什么想法吗?
UPDATE0:如果我通过查询分析器或其他工具运行 SP……它可以工作。只是通过我的 ODBC 连接失败了。
UPDATE1:当我注释掉代码时,执行会进一步进入 SP。让我觉得我遇到了超时或缓冲区限制。
【问题讨论】:
【参考方案1】:您是否尝试过在 SQL Server 端进行分析,以查看您的 SPID 发生了什么?
另外,我还没有使用过freeodbc++,但也许里面有一个它不喜欢的PRINT 语句。您还可以 SET NOCOUNT ON 来抑制行计数消息。同样,这取决于 freeodbc++ 如何对这些“信息性”消息作出反应。
根据您描述的这种“冻结”行为方式,这听起来像是 freeodbc++ 中的一个错误。首先检查 SQL 端的进程,看看它是否真的挂起,或者你的库是否刚刚“死”在你身上。
【讨论】:
谢谢...我已经向 DBA 询问了有关跟踪 SPID 的问题。我们明天会这样做。我认为这是一个 freeodbc++ 错误,因为缺乏对 SP 的支持。【参考方案2】:从查询分析器运行该过程,看看会发生什么。您可以在过程中使用 RAISERROR() 函数将跟踪信息提供回消息窗口以帮助您进行调试。
【讨论】:
没有提到。它通过其他方法起作用。【参考方案3】:您是否尝试过使用 TRY 和 CATCH?它可能会在您的存储过程中的函数调用上引发您看不到的错误。
BEGIN TRY
<Your code>
END TRY
BEGIN CATCH
DECLARE @ErrMsg nvarchar(max),
@ErrSeverity int,
@ErrState int
SELECT @ErrMsg = ERROR_MESSAGE(),
@ErrSeverity = ERROR_SEVERITY(),
@ErrState = ERROR_STATE()
RAISERROR (@ErrMsg,@ErrSeverity,@ErrState);
END CATCH
【讨论】:
没试过,谢谢建议。【参考方案4】:添加“::Sleep(30000);”在我对 ODBC 语句对象调用执行之后(以及在语句关闭命令之前)立即阻止服务器进程过早退出。一定是 freeodbc++ 的错误或我的配置错误。
感谢您提供故障排除/调试提示。
【讨论】:
以上是关于为啥我通过 ODBC 调用的存储过程在同一位置失败? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 Access 中使用 UNION ALL 时出现 ODBC 连接失败错误?