2008-10-15 61 views
0

我正在使用freeodbc++库来访问MS SQL Server 2000数据库(SP3?SP4?)上的数据。特别是,我正在运行一个特别长且令人讨厌的存储过程。我可以在SQL Profiler中看到该过程执行,但是它往往会在某个时间点停止处理。没有错误代码或抛出异常。如果我注释掉总是最后一条语句的嵌套语句,它只是在评论之前稍微结束。我还没有尝试从根本上解决整个问题......我将查询超时设置为300秒。可调用语句通常会在1秒内返回,而不会实际完成SP。为什么通过ODBC调用的存储过程在同一位置失败?

任何想法?

UPDATE0:如果我通过查询分析器或其他工具运行SP ...它的工作原理。这只是通过我的ODBC连接,它失败了。

UPDATE1:当我注释掉代码时,执行进一步结束到SP中。让我觉得我遇到了超时或缓冲区限制。

回答

0

您是否尝试过在SQL Server端进行分析,以查看您的SPID发生了什么?

此外,我没有使用freeodbC++,但也许有一个PRINT语句在那里,它不喜欢。您也可以SET NOCOUNT ON来抑制行计数消息。同样,这取决于freeodbC++如何对这些“信息”消息作出反应。

这听起来像freeodbC++中的一个bug,基于你描述的这种“冻结”式的行为。首先检查SQL端的流程,看看它是否真的挂起,或者你的库只是“死掉”在你身上。

+0

谢谢...我已经向DBA询问了有关跟踪SPID的信息。我们明天会这样做。我认为这是一个freeodbC++错误,因为对SP的支持不足。 – 2008-10-16 03:03:05

0

从查询分析器运行该过程,看看会发生什么。您可以在过程中使用RAISERROR()函数将追踪信息提供回消息窗口以帮助您进行调试。

+0

没有提及。它通过其他方法工作。 – 2008-10-15 20:22:39

0

您是否尝试过使用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 
+0

还没有尝试过,感谢您的建议。 – 2008-10-15 22:00:57

0

添加“:: Sleep(30000);”在我调用ODBC语句对象执行之后(以及语句关闭命令之前)立即使服务器进程不能提前退出。必须是freeodbC++的bug或者我的配置错误。

感谢您的故障排除/调试提示。

相关问题