Sql server 存储过程导致ADODB.Field错误';800a0bcd';
我有一个这样的存储过程Sql server 存储过程导致ADODB.Field错误';800a0bcd';,sql-server,stored-procedures,asp-classic,Sql Server,Stored Procedures,Asp Classic,我有一个这样的存储过程 UPDATE rv SET Redeemed = 1, DateRedeemed = @DateRedeemed, OnlineID = @SaleID FROM Coupon AS rv WHERE REPLACE(rv.ID, '-', '') = @RewardID AND TypeID = 2; EXEC [dbo].[spRewardVoucherSearch] @docketNumber = @RewardID spRewardVo
UPDATE rv
SET Redeemed = 1,
DateRedeemed = @DateRedeemed,
OnlineID = @SaleID
FROM Coupon AS rv
WHERE REPLACE(rv.ID, '-', '') = @RewardID
AND TypeID = 2;
EXEC [dbo].[spRewardVoucherSearch] @docketNumber = @RewardID
spRewardVoucherSearch是这样的吗
SELECT REPLACE(lv.ID, '-', '') AS Number, "REF" AS Ref, lv.*
FROM Coupon AS lv
WHERE REPLACE(lv.ID, '-', '') = @docketNumber
AND TypeID = 2;
现在,当我运行以下代码时
cmd.ActiveConnection = conn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "spRedeemGiftVoucher"
cmd.NamedParameters = True
cmd.Parameters.Append cmd.CreateParameter("@GiftVoucherID", adVarWChar, adParamInput, 9, UCase(giftVouchers(0,i)))
cmd.Parameters.Append cmd.CreateParameter("@SerialNo", adVarWChar, adParamInput, 16, UCase(giftVouchers(1,i)))
cmd.Parameters.Append cmd.CreateParameter("@DateRedeemed", adDBTimeStamp, adParamInput, 20, Now())
cmd.Parameters.Append cmd.CreateParameter("@SaleID", adBigInt, adParamInput, 0, CLng(saleid))
rs.Open cmd
giftValues(i) = rs("Value")
我得到以下错误
ADODB.字段错误“800a0bcd”
BOF或EOF为真,或者当前记录已被删除。请求的操作需要当前记录
现在,我运行此代码的页面是一个签出处理页面,在上一页中,我已经使用spRewardVoucherSearch
验证了我的凭证是否存在,并使用了几乎相似的代码(但它只使用了第一个参数),因此我知道凭证存在。如果它可能已从数据库中删除,则如果rs.EOF Then
,这将不会有帮助,因为处理过程已经完成(检查只会输出错误并停止进一步处理,但我可以稍后处理)
当我在SQL Management Studio中运行第一个过程时,我得到的是如果我运行
spRewardVoucherSearch
(这是我想要的)就会得到的结果集。既然我在上一页自己运行了spRewardVoucherSearch
,得到了rs(“Value”)
我怎么会得到错误?有没有一种方法可以让我在不出错的情况下完成我想做的事情?您需要检查记录集是否为空
您可以这样编写代码:
If Not (rs.EOF And rs.BOF) Then
giftValues(i) = rs("Value")
Else
MsgBox "Recordset is Empty"
End If
尝试以下方法:
“不要使用rs.Open cmd
'改为执行存储过程
设置rs=cmd.Execute
SET cmd=Nothing
'您现在可以访问记录集
如果(不是卢比EOF),则
“礼品价值(i)=卢比(“价值”)
回答:写rs(“值”)并打印
如果结束
“处理你的物品
rs.Close
设置rs=无
关闭连接
设置连接=无
有两件事需要检查,第一:您是否在查询中指定了输出变量作为别名值,因为您使用的是rs(“值”)。第二:当查询返回结果时,检查它是否返回任何结果,或者它是否为空,因为在从记录集中获取值之前需要检查rs.eof或rs.bof。@PareshJadhav和第一个一样,您是说使用输出@SaleID int OUTPUT
?如果是这样的话,我在这两个过程中都没有,正如我所说的,spRewardVoucherSearch
在使用相同的asp代码时工作得非常好(唯一的区别是我有一个rs.EOF
)那么,没有它,为什么它可以与spRewardVoucherSearch一起工作呢?@rewardd
来自哪里?您需要在存储过程开始时指定SET NOCOUNT ON
,或者ADODB
将更新的类行计数作为一个单独的关闭的ADODB.Recordset
。但是记录确实存在,正如我之前解释的那样,spRewardVoucherSearch
本身在另一个页面上运行得很好,我还使用相同的参数运行了主过程,并获得了我的记录集,spRewardVoucherSearch
将输出,正如我所预期的,或者您是说rs(“值”)
将始终返回错误,除非我使用rs.EOF
(我在上一页中使用它停止所有处理,如果rs.EOF=true
,您无法访问我遇到问题的页面)是,您的记录集rs可能返回错误或为空。+1-很高兴看到有人在那里使用了一些常见的字符-“800a0bcd”表示BOF(文件开头)或EOF(文件结尾)为真。你还能说什么@Memor-X您需要将查询通过管道传输到屏幕,以便可以在类似SSMS的东西中进行测试。试试,也需要一个BOF。。。以防万一!