VB6 ADO Set rs = command.Execute

时间:2009-04-07 11:59:05

标签: vb6 ado

Set rs = command.Execute 
if not rs.EOF then
   'logic here
end if

上面的代码在第2行失败,因为rs已关闭(可能oledb提供程序错误地认为它是一个insert命令,所以不需要返回任何内容)。该命令是一个插入语句,如:

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

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

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

4 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

您可以尝试在函数中返回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

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