【问题标题】:Stored procedure not working in VB6存储过程在 VB6 中不起作用
【发布时间】:2013-01-14 10:07:38
【问题描述】:

我有一个经常被调用的存储过程,因为它用于检索对帐单。实际存储过程在 MSSMS 的查询窗口中需要大约 10 毫秒,并且通常运行良好,但有时会在我的 VB6 应用程序中决定超时(超时设置为 120 秒)。 SP 连接 2 个数据库之间的表,一个包含当前事务 (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 时,不会发生超时。

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

【问题讨论】:

    标签: sql-server stored-procedures vb6 timeout


    【解决方案1】:

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

    SET NOCOUNT ON
    

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

    【讨论】:

      【解决方案2】:

      注意存储过程中的参数嗅探。试试这个

      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
      

      【讨论】:

      • 请原谅延迟回答。
      • 问题不在于存储过程本身。 VB.Net 中的方法不同,如下所示: cmd = New SqlClient.SqlCommand("spA_StatementData", rConn) cmd.Parameters.AddWithValue("@sAccountNr", AcNr)... ...cmd.CommandType = CommandType.StoredProcedure adapter As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter(cmd) Dim dsStatement As DataSet = New DataSet(cmd.CommandText) cmd.CommandTimeout = 30 adapter.Fill(dsStatement) ...并且仍然产生相同的超时。我想知道是否有什么我可以在数据库中实际检查的东西。就像我说的,重启服务就可以了。
      • 修改存储过程以防止参数嗅探,不要更改调用者代码中的任何内容并检查问题是否仍然存在。
      猜你喜欢
      • 2021-02-28
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 2021-10-31
      • 2018-03-28
      • 1970-01-01
      相关资源
      最近更新 更多