Использование & # 8220; SELECT SCOPE_IDENTITY () & # 8221; в ADODB Recordset
-
05-07-2019 - |
Вопрос
Используя 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 полей после запроса и также кажется закрытым (состояние = 0).
Решение
Когда вы запускаете пакет команд с использованием 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)
Другие советы
Вы выполняете два оператора, поэтому вы получите два результата назад. объект набора записей может содержать только один результат за раз - для получения другого результата вам необходимо использовать метод NextRecordset.
Set rs = rs.NextRecordset
В вашем rs.Open Попробуйте это
rs.Open SQLStr, cn, adCmdText
Посмотрите, что происходит, когда вы удаляете значения adOpenKeySet и adLockOptimistic, оставляя их по умолчанию.