代码之家  ›  专栏  ›  技术社区  ›  Terry G Lorber

为什么我调用的ODBC存储过程在同一位置失败?[关闭]

  •  0
  • Terry G Lorber  · 技术社区  · 16 年前

    我正在使用 freeodbc++ 用于访问MS SQL Server 2000数据库(SP3)上数据的库。SP4?)。特别是,我正在运行一个特别长而讨厌的存储过程。我可以观察在SQL事件探查器中执行的过程,但是,它往往在某一点上停止处理。未引发错误代码或异常。如果注释掉总是最后一条语句的嵌套语句,它只在注释之前稍微结束。我还没试着彻底地解释这件该死的事…我将查询超时设置为300秒。可调用语句通常在不到1秒的时间内返回,而实际上没有完成sp。

    有什么想法吗?

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

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

    4 回复  |  直到 16 年前
        1
  •  0
  •   Pittsburgh DBA    16 年前

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

    另外,我还没有使用freedbc++,但可能其中有一个print语句,它不喜欢。您也可以将nocount设置为on以禁止行计数消息。同样,这取决于FreeODBC++对这些“信息”消息的反应。

    这听起来像是FreeODBC++中的一个bug,基于您描述的这种“冻结”行为。从检查SQL端的进程开始,看看它是否真的挂起了,或者您的库是否在您身上“死了”。

        2
  •  0
  •   Joel Coehoorn    16 年前

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

        3
  •  0
  •   Ryan Abbott    16 年前

    你试过用“试着接住”吗?它可能会在您的存储过程中对您看不到的函数调用引发错误。

    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
  •  0
  •   Terry G Lorber    16 年前

    添加“::sleep(30000);”后立即调用ODBC语句对象上的execute(在语句关闭命令之前),防止服务器进程过早退出。必须是FreeODBC++的错误,或者是我的配置错误。

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