为什么通过ODBC调用的存储过程在同一位置失败?
我正在使用freeodbc++库来访问MS SQL Server 2000数据库(SP3?SP4?)上的数据。特别是,我正在运行一个特别长且令人讨厌的存储过程。我可以在SQL Profiler中看到该过程执行,但是它往往会在某个时间点停止处理。没有错误代码或抛出异常。如果我注释掉总是最后一条语句的嵌套语句,它只是在评论之前稍微结束。我还没有尝试从根本上解决整个问题......我将查询超时设置为300秒。可调用语句通常会在1秒内返回,而不会实际完成SP。为什么通过ODBC调用的存储过程在同一位置失败?
任何想法?
UPDATE0:如果我通过查询分析器或其他工具运行SP ...它的工作原理。这只是通过我的ODBC连接,它失败了。
UPDATE1:当我注释掉代码时,执行进一步结束到SP中。让我觉得我遇到了超时或缓冲区限制。
您是否尝试过在SQL Server端进行分析,以查看您的SPID发生了什么?
此外,我没有使用freeodbC++,但也许有一个PRINT语句在那里,它不喜欢。您也可以SET NOCOUNT ON来抑制行计数消息。同样,这取决于freeodbC++如何对这些“信息”消息作出反应。
这听起来像freeodbC++中的一个bug,基于你描述的这种“冻结”式的行为。首先检查SQL端的流程,看看它是否真的挂起,或者你的库只是“死掉”在你身上。
从查询分析器运行该过程,看看会发生什么。您可以在过程中使用RAISERROR()函数将追踪信息提供回消息窗口以帮助您进行调试。
没有提及。它通过其他方法工作。 – 2008-10-15 20:22:39
您是否尝试过使用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
还没有尝试过,感谢您的建议。 – 2008-10-15 22:00:57
添加“:: Sleep(30000);”在我调用ODBC语句对象执行之后(以及语句关闭命令之前)立即使服务器进程不能提前退出。必须是freeodbC++的bug或者我的配置错误。
感谢您的故障排除/调试提示。
谢谢...我已经向DBA询问了有关跟踪SPID的信息。我们明天会这样做。我认为这是一个freeodbC++错误,因为对SP的支持不足。 – 2008-10-16 03:03:05