2
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),但这不是问题。

4

4 回答 4

6

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

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

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

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

于 2009-04-07T13:59:03.987 回答
1

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

于 2009-04-07T12:01:58.980 回答
1

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

SET NOCOUNT ON;
Insert into log(Name,Value) values("xxx", 123); 
select scope_identity()
于 2009-04-07T13:57:32.557 回答
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

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

于 2009-04-07T13:35:37.990 回答