Использование " SELECT SCOPE IDENTITY()" в наборе записей ADODB

используя скрипт VBA в Excel, я пытаюсь вставить новую строку в таблицу, а затем вернуть значение идентификатора этой строки. Если я побегу:

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

В Management Studio строка вставляется, и она дает мне возвращаемое значение идентификатора, как ожидалось. Однако, когда я запускаю тот же самый запрос через набор записей ADODB в VBA, у меня возникают проблемы. Строка действительно вставлена, но я не могу получить доступ к значению идентификатора. Набор записей содержит 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 полей после запроса, а также кажется закрытым (state=0).

4 ответов


когда вы запускаете пакет команд с помощью ADODB, я считаю, что он работает каждый отдельно. Чтобы принудительно выполнить следующую команду, вы должны использовать следующее:

Set rs = rs.NextRecordset()

изменение конца вашей процедуры на следующее должно сделать трюк:

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

вы выполняете два оператора, поэтому вы получите два результата. объект recordset может содержать только один результат за раз - для получения другого результата необходимо использовать метод NextRecordset.

Set rs = rs.NextRecordset

в вашем rs.Откройте попробуйте это

rs.Open SQLStr, cn, adCmdText


посмотрите, что происходит при удалении adOpenKeySet и adLockOptimistic значения оставить их по умолчанию.