我在SQL Server 2000上有一个存储过程。根据@Action参数,sproc将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
然后在asp经典的vbscript网页上,我有一个ado命令,它将一些参数传递给sproc并执行它们。如果@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
我也有一个几乎相同的sproc,在同一页面上从一个几乎相同的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
答案 0 :(得分:0)
对于处于类似情况的任何人:如果遇到任何问题,请记得关闭SQL企业管理器,SQL查询分析器和SQL事件探查器。
我仍然不完全理解SQL Server的复杂内部工作方式,但是我以某种方式导致了尚未提交的TRANSACTIONS的积压。关闭上述程序后,交易全部完成,事情按预期进行。
如果有人理解我做错了什么,那么请让我们都知道,以便其他人能够清除这种情况。