Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 存储过程导致ADODB.Field错误';800a0bcd';_Sql Server_Stored Procedures_Asp Classic - Fatal编程技术网

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。。。以防万一!