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

2019-06-27 03:14发布

使用Excel中的VBA脚本,我试图插入新行到一个表,然后取回该行的标识值。 如果我运行:

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)。

Answer 1:

当你运行一个批处理利用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)


Answer 2:

您正在执行两个语句所以你会得到两个结果回来。 Recordset对象只能在同一时间举行一个结果 - 让你需要使用NextRecordset方法的其他结果。

Set rs = rs.NextRecordset


Answer 3:

在您的rs.Open试试这个

rs.Open SQLStr, cn, adCmdText



Answer 4:

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



文章来源: Using “SELECT SCOPE_IDENTITY()” in ADODB Recordset