使用“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)
答
见当您删除adOpenKeySet和ADLOCKOPTIMISTIC值让他们在他们的默认值会发生什么。
答
在你rs.Open试试这个
rs.Open SQLStr, cn, adCmdText
答
您正在执行两个语句,所以你会得到两个结果。记录集对象一次只能保存一个结果 - 以获得使用NextRecordset方法所需的其他结果。
Set rs = rs.NextRecordset
漂亮!完美的作品,谢谢! – JoeCool 2009-07-29 17:27:18