使用“SELECT()SCOPE_IDENTITY”在ADODB记录

使用“SELECT()SCOPE_IDENTITY”在ADODB记录

问题描述:

使用Excel中的VBA脚本,我试图插入新行到一个表,然后取回该行的标识值。如果我运行:使用“SELECT()SCOPE_IDENTITY”在ADODB记录

INSERT INTO DataSheet(databaseUserID, currentTimestamp) 
VALUES (1, CURRENT_TIMESTAMP); 
SELECT SCOPE_IDENTITY() 

在Management Studio中,该行被插入,并且它给我如预期的返回标识值。然而,当我通过VBA一个ADODB记录运行完全相同的查询,我遇到麻烦了。该行确实已插入,但我无法访问标识值。记录集列出了0个字段,并且实际上已关闭。我试着和没有分号,而且我也尝试运行查询作为单个事务也是如此。同样的交易,没有骰子。任何想法是怎么回事?

这里是我的VBA:

Dim rs As ADODB.Recordset 
Dim cn As Connection 
Dim SQLStr As String 
Dim serverName As String 
Dim databaseName As String 

serverName = "MSSQLServer" 
databaseName = "QA" 
cxnStr = "Driver={SQL Server};Server=" & serverName & ";Database=" & databaseName & ";" 

SQLStr = "INSERT INTO DataSheet(databaseUserID, currentTimestamp) 
VALUES (1, CURRENT_TIMESTAMP); SELECT SCOPE_IDENTITY()" 
Set cn = New ADODB.Connection 
cn.Open cxnStr 
Set rs = New ADODB.Recordset 
rs.Open SQLStr, cn, adOpenKeyset, adLockOptimistic 
MsgBox (rs.Fields(0).Value) 

和消息框无法显示,因为rs.Fields(0).Value返回null。我添加了一个手表RS,和,就像我说,示出了该查询后0字段和似乎也被关闭(状态= 0)。

当使用ADODB运行批处理命令的,我相信它运行每一个seperately。使下一个命令来运行,你必须使用以下方法:

Set rs = rs.NextRecordset() 

改变你的日常到下面的到底应该做的伎俩:

Set rs = New ADODB.Recordset 
rs.Open SQLStr, cn, adOpenKeyset, adLockOptimistic 
Set rs = rs.NextRecordset 
MsgBox (rs.Fields(0).Value) 
+0

漂亮!完美的作品,谢谢! – JoeCool 2009-07-29 17:27:18

见当您删除adOpenKeySet和ADLOCKOPTIMISTIC值让他们在他们的默认值会发生什么。

在你rs.Open试试这个

rs.Open SQLStr, cn, adCmdText

您正在执行两个语句,所以你会得到两个结果。记录集对象一次只能保存一个结果 - 以获得使用NextRecordset方法所需的其他结果。

Set rs = rs.NextRecordset