为啥我通过 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 连接失败错误?

ODBC调用存储过程

为啥我的 ODBC 在添加新记录后立即失败?

ODBC 机器 DSN 设置存储在 Windows 中的啥位置?

虽然哈希值不同,但为啥我的对象存储在同一个位置?

为啥此查询在 ODBC 表上运行但在本地表上运行时会失败?