2009-07-29 65 views
6

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

回答

8

當使用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) 
+0

漂亮!完美的作品,謝謝! – JoeCool 2009-07-29 17:27:18

0

見當您刪除adOpenKeySet和ADLOCKOPTIMISTIC值讓他們在他們的默認值會發生什麼。

1

在你rs.Open試試這個

rs.Open SQLStr, cn, adCmdText

3

您正在執行兩個語句,所以你會得到兩個結果。記錄集對象一次只能保存一個結果 - 以獲得使用NextRecordset方法所需的其他結果。

Set rs = rs.NextRecordset