【问题标题】:VB6 ADO Set rs=command.ExecuteVB6 ADO 设置 rs=command.Execute
【发布时间】:2009-04-07 11:59:04
【问题描述】:
Set rs = command.Execute 
if not rs.EOF then
   'logic here
end if

上述代码在第 2 行失败,因为 rs 已关闭(可能 oledb 提供程序错误地认为它是一个插入命令,因此无需返回任何内容)。该命令是一个插入语句,类似于:

Insert into log(Name,Value) values("xxx", 123); select scope_identity()

我需要在一次往返中从服务器返回身份。有什么想法吗?

PS:使用字段名称更新插入语句(感谢 Eduardo),但这不是问题。

【问题讨论】:

    标签: vb6 ado


    【解决方案1】:

    您的问题是数据源返回两个记录集。这是由于数据库的 NOCOUNT 设置。第一个记录集仅用于返回受插入语句影响的记录。第二个记录集返回 SELECT SCOPE_IDENTITY 调用的结果。所以你需要这样做:

    If rs.State = adStateClosed Then
       Set rs = rs.NextRecordset()
    End If
    

    然后你可以检查 EOF 和所有这些。 但我通常会避免所有这些,并将这样的东西放在存储过程中。然后我在存储过程中设置 NOCOUNT ON。并在存储过程结束时返回 id。现在你的插入可能只是这样简单,但逻辑可能会增长。通过将其放入存储过程中,您只需更改存储过程,而不必更改已编译的 VB 应用程序。它还稍微隔离了数据库代码。

    您不想在您的声明中设置 SET NOCOUNT ON。如果不是整个数据库,我认为这会影响整个连接。

    【讨论】:

      【解决方案2】:

      Select @@Identity From TableName 应该给出最后插入的 id

      【讨论】:

      • 除非有充分的理由,否则切勿使用 @@Identity 来支持 scope_identity()。
      • scope_identity 也会给我最后插入的 id 问题是我如何在一次往返中做到这一点。
      【解决方案3】:

      这是 SQL Server 吗?尝试在 SQL 开头添加SET NOCOUNT ON,例如

      SET NOCOUNT ON;
      Insert into log(Name,Value) values("xxx", 123); 
      select scope_identity()
      

      【讨论】:

        【解决方案4】:

        您可以尝试在函数中返回 ID。

        CREATE FUNCTION dbo.MyFunc ( @name varchar(10), @value varchar(10))
        RETURNS int
        AS
        BEGIN
            DECLARE @rtn int
        
            Insert into log(Name,Value) 
            values("xxx", 123); 
        
            select @rtn = scope_identity()
            RETURN @rtn;
        END
        

        虽然我认为你在上面有什么,但你在哪里进行插入然后选择应该以某种方式工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-06
          相关资源
          最近更新 更多