Stored procedures 如何使用vb6从不是返回值或输出参数的记录集中检索值

Stored procedures 如何使用vb6从不是返回值或输出参数的记录集中检索值,stored-procedures,vb6,ado,Stored Procedures,Vb6,Ado,我在现有的第三方应用程序(SQL 2005)上有一个存储过程,我希望与之交互 它是一个insert语句,后跟一个select语句,如下所示: Set @CustomerId = Cast(SCOPE_IDENTITY() As [int]) Select @CustomerId 未按预期返回结果集 [编辑] rs.Fields.Count为0 任何访问结果记录集的尝试,如rs(0).Value,都会导致“未找到项…”错误。我猜存储过程返回多个记录集 如果是这种情况,您可以使用该方法对它

我在现有的第三方应用程序(SQL 2005)上有一个存储过程,我希望与之交互

它是一个insert语句,后跟一个select语句,如下所示:

Set @CustomerId = Cast(SCOPE_IDENTITY() As [int]) Select @CustomerId 未按预期返回结果集

[编辑]

rs.Fields.Count为0


任何访问结果记录集的尝试,如rs(0).Value,都会导致“未找到项…”错误。

我猜存储过程返回多个记录集

如果是这种情况,您可以使用该方法对它们进行迭代

MSDN:

  • 如果行返回命令执行成功但未返回任何记录, 返回的记录集对象将被删除 打开但空着。通过以下方式测试此情况: 确认BOF和EOF 属性都是真的
  • 如果成功执行非行返回命令,则返回 记录集对象将被关闭,这将 您可以通过测试状态进行验证 记录集上的属性
  • 当没有更多结果时,记录集将设置为“无”
这意味着我建议这样做来解决您的问题:

Set rs = cmd.Execute

''# fetch the first value of the last recordset
Do Until rs Is Nothing
  If rs.State = adStateOpen Then
    If Not (rs.BOF And rs.EOF) Then
      ''# You can do a different sanity check here, or none at all
      If rs.Fields(0).Type = adInteger Then
        CustomerId = rs.Fields(0).Value
      End If
    End If
  End If
  Set rs = rs.NextRecordSet
Loop

MsgBox CustomerId

我猜您的存储过程将返回多个记录集

如果是这种情况,您可以使用该方法对它们进行迭代

MSDN:

  • 如果行返回命令执行成功但未返回任何记录, 返回的记录集对象将被删除 打开但空着。通过以下方式测试此情况: 确认BOF和EOF 属性都是真的
  • 如果成功执行非行返回命令,则返回 记录集对象将被关闭,这将 您可以通过测试状态进行验证 记录集上的属性
  • 当没有更多结果时,记录集将设置为“无”
这意味着我建议这样做来解决您的问题:

Set rs = cmd.Execute

''# fetch the first value of the last recordset
Do Until rs Is Nothing
  If rs.State = adStateOpen Then
    If Not (rs.BOF And rs.EOF) Then
      ''# You can do a different sanity check here, or none at all
      If rs.Fields(0).Type = adInteger Then
        CustomerId = rs.Fields(0).Value
      End If
    End If
  End If
  Set rs = rs.NextRecordSet
Loop

MsgBox CustomerId

呃,伙计们,没有rs(0)。这就是rs.Fields.Count=0和“未找到项目”错误的含义。为了澄清,我编辑了这个问题,感谢Pax和JP的评论。(我现在也会说得更清楚)对不起。@Stuart Helwig:如果我的回答不太有效,在对我的回答的评论中这样说可能会有用。你不必仅仅因为有人这么说就接受它。无论如何,因为我不知道你到底在处理什么,所以我只能通过猜测来回答,而不是用100%的工作代码。你问了一个特定的问题,而最能解决特定问题的答案应该是被接受的答案——即使你自己找到了。是的,我已经编辑了我的答案,因为它一开始不起作用。在测试之后,我发布了一个经过修改的版本,它至少在我的小测试用例“SELECT'foo';SELECT 17;”中起作用。但是我现在看到我的代码中还有一个bug。我修好了,再试一次。呃,伙计们,没有rs(0)。这就是rs.Fields.Count=0和“未找到项目”错误的含义。为了澄清,我编辑了这个问题,感谢Pax和JP的评论。(我现在也会说得更清楚)对不起。@Stuart Helwig:如果我的回答不太有效,在对我的回答的评论中这样说可能会有用。你不必仅仅因为有人这么说就接受它。无论如何,因为我不知道你到底在处理什么,所以我只能通过猜测来回答,而不是用100%的工作代码。你问了一个特定的问题,而最能解决特定问题的答案应该是被接受的答案——即使你自己找到了。是的,我已经编辑了我的答案,因为它一开始不起作用。在测试之后,我发布了一个经过修改的版本,它至少在我的小测试用例“SELECT'foo';SELECT 17;”中起作用。但是我现在看到我的代码中还有一个bug。我修复了它,再试一次。这段代码似乎需要在执行之后直接调用“rs.Open”才能让它工作?这是对的还是我遗漏了什么?当你执行一个命令时,你会得到一个回复(或一堆回复)。它们是打开的还是关闭的,这取决于它们是否是行返回操作的结果。例如,如果其中一个是闭合的,则表示它是由INSERT生成的。这并不意味着它必须被打开。SELECT语句是一个行返回操作。它的附加记录集将被打开,所以我只检查“If rs.State=adStateOpen”。所有关闭的记录集只包含执行语句的信息。它们可以在循环中被跳过。这段代码似乎需要在执行之后直接调用“rs.Open”才能让它工作?这是对的还是我遗漏了什么?当你执行一个命令时,你会得到一个回复(或一堆回复)。它们是打开的还是关闭的,这取决于它们是否是行返回操作的结果。例如,如果其中一个是闭合的,则表示它是由INSERT生成的。这并不意味着它必须被打开。SELECT语句是一个行返回操作。它的附加记录集将被打开,所以我只检查“If rs.State=adStateOpen”。所有关闭的记录集只包含执行语句的信息。可以在循环中跳过它们。