存储过程无法在VB6中运行

时间:2013-01-30 14:40:32

标签: sql-server stored-procedures vb6 timeout

我有一个经常调用的存储过程,因为它用于检索帐户语句。实际的存储过程在MSSMS的查询窗口中大约需要10ms,并且工作得很好,但是SOMETIMES决定在我的VB6应用程序中超时(超时设置为120秒)。 SP在两个数据库之间连接表,一个包含当前事务(DB#1),另一个包含存档事务(DB#2)。使用'sp_who2',没有SPID似乎占用或阻塞系统。

这是我设置的SQL变量:

DECLARE @rtnRecs int;
strSQL = "EXEC spA_StatementData 
        @sAccountNr = '123abc', 
        @bIncludeHistory = 1, 
        @bShowAllTransactions = 1, 
        @iValidRecords = @rtnRecs OUTPUT"

我在VB6中使用的方法是:

rs.Open sql, con, adOpenStatic

其中rs是ADODB.Recordset,con是与数据库的连接。

这段代码很长一段时间,比如2个月,并且被几个运营商使用。然后它突然间,没有明显的原因,停止工作 - 但仍然在MSSMS中正常工作。 我正在强调VB6,因为这是问题首次出现的地方,但同样的事情发生在我的VB.net代码中。

需要注意的是,'@ bIncludeHistory'参数是将JOIN设置为存档数据库(DB#2)的条件。当'@bIncludeHistory'设置为0时,不会发生超时。

重置服务可以解决问题,但这只是最后的手段。 还有什么我可以尝试的吗? 感谢

2 个答案:

答案 0 :(得分:0)

小心存储过程中的参数嗅探。试试这个

CREATE PROC spA_StatementData (
        @sAccountNr             VARCHAR(1000)
        , @bIncludeHistory      BIT
        , ...
) AS
SET NOCOUNT ON

DECLARE @_sAccountNr            VARCHAR(1000)
        , @_bIncludeHistory     BIT
        , ...

--- prevent parameter sniffing
SELECT  @_sAccountNr = @sAccountNr
        , @_bIncludeHistory = @bIncludeHistory
        , ...

--- use local @_sAccountNr, @_bIncludeHistory, etc. instead of parmeter variables

答案 1 :(得分:0)

同样的问题发生在我身上,我错过了STORE PROCEDURE中的以下代码

SET NOCOUNT ON

希望这会有所帮助。 确保您的SP拥有此代码。