当存储过程设置为UPDATE或DELETE时,ADO命令超时



存储过程

我在SQL Server 2000上有一个存储过程。存储过程将根据@Action参数INSERT、UPDATE或DELETE记录。然后,它检查错误,提交事务,并返回1。这在SQL查询分析器中非常有效。

CREATE PROCEDURE dbo.spWeb_GoodsInRequestProducts
@Action Int, -- 0 = Insert, 11 = Update, 2 = Delete
@GoodsInRequestRef Int,
@ProductRef Int,
@Qty Int = Null
AS
Set NoCount On
Declare @Error Int
Begin Transaction
If @Action = 0 Begin
    INSERT INTO dbo.tblGoodsInRequestProducts (
        GoodsInRequestRef,
        ProductRef,
        Qty
    ) VALUES (
        @GoodsInRequestRef,
        @ProductRef,
        @Qty )
End
If @Action = 1 Begin
    UPDATE  dbo.tblGoodsInRequestProducts
    SET     Qty = @Qty    
    WHERE   GoodsInRequestRef = @GoodsInRequestRef
    AND     ProductRef = @ProductRef
End
If @Action = 2 Begin
    DELETE FROM dbo.tblGoodsInRequestProducts
    WHERE   GoodsInRequestRef = @GoodsInRequestRef
    AND     ProductRef = @ProductRef
End
Set @Error = @@Error
If @Error = 0 Begin
    COMMIT Transaction
    SELECT 1
End
If @Error <> 0 Begin
    ROLLBACK Transaction
    SELECT 0
End
Set NoCount Off
GO

ADO命令

然后在一个asp经典的vbscript网页上,我有一个ado命令,它将一些参数传递给存储过程并执行存储过程。如果@Action设置为0(INSERT记录),但设置为1(UPDATE)或2(DELETE),并且页面超时,则此操作正常。

Function GoodsInProduct()
    Dim objCmd
    Set objCmd = Server.CreateObject("ADODB.Command")
    objCmd.ActiveConnection = CONN
    objCmd.CommandType = adCmdStoredProc
    objCmd.CommandText = "dbo.spWeb_GoodsInRequestProducts"     
    objCmd.Parameters.Append objCmd.CreateParameter("@Action", adInteger, adParamInput, , 2)
    objCmd.Parameters.Append objCmd.CreateParameter("@GoodsInRequestRef", adInteger, adParamInput, , 1)
    objCmd.Parameters.Append objCmd.CreateParameter("@ProductRef", adInteger, adParamInput, , 10110)
    objCmd.Parameters.Append objCmd.CreateParameter("@Qty", adInteger, adParamInput, , 8)
    Dim objRS
    Set objRS = objCmd.Execute      
    GoodsInProduct = objRS(0)
    Set objRS = Nothing
    Set objCmd = Nothing
End Function
Response.Write GoodsInProduct

我还有一个几乎相同的存储过程,它是从同一页上的几乎相同的ado命令调用的,它将插入、更新和删除而不会有任何麻烦。运行SQL事件探查器时,我看到INSERT命令通过,但我从未看到UPDATE或DELETE,页面只是超时。正如我所说的,所有这些都可以在SQL查询分析器中完美地工作。

有人能看出我做错了什么吗?甚至只是一种改进错误检查的替代方法或某种方法,这样我就可以看到错误发生的地方。

谢谢。

尝试过的事情

我刚刚尝试了最低限度,但仍然在网页上超时,但在SQLQA中工作:

Dim strSQL
strSQL = "DELETE FROM dbo.tblGoodsInRequestProducts WHERE GoodsInRequestRef = 1 AND ProductRef = 10110"
Dim objConn
Set objConn = server.CreateObject("ADODB.Connection")
objConn.Open CONN
objConn.Execute (strSql)
objConn.Close
Set objConn = Nothing

已解决

对于任何处于类似情况的人:如果遇到任何问题,请记住关闭SQL Enterprise Manager、SQL Query Analyzer和SQL Profiler。

我仍然不完全理解SQL Server复杂的内部工作,但不知何故,我造成了尚未提交的事务积压。在关闭上面的程序后,所有的事务都完成了,一切都按预期进行。

如果有人理解我做错了什么,请让我们都知道,这样其他人就可以远离这种情况。

最新更新