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),但这不是问题。
答案 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
虽然我认为你上面有什么,你在哪里插入然后选择应该以某种方式工作。