2009-07-29 3 views
6

Используя сценарий VBA в Excel, я пытаюсь вставить новую строку в таблицу, а затем вернуть значение идентификатора этой строки. Если я запустил:Использование «SELECT SCOPE_IDENTITY()» в наборе записей ADODB

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

в Studio 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).

ответ

8

При запуске пакета команд с помощью 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) 
+0

Прекрасно! Работает отлично, спасибо! – JoeCool

0

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

1

В ваших rs.Open Попробуйте

rs.Open SQLStr, cn, adCmdText

3

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

Set rs = rs.NextRecordset