2009-07-29 21 views
6

ExcelでVBAスクリプトを使用すると、新しい行をテーブルに挿入し、その行のID値を取得しようとしています。 Management StudioのADODB Recordsetで "SELECT SCOPE_IDENTITY()"を使用する

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

を実行すると、行が挿入され、返されたID値が期待どおりに返されます。しかし、VBAでADODBレコードセットを使用して同じクエリを実行すると、問題が発生します。行は実際に挿入されますが、ID値にはアクセスできません。レコードセットには0個のフィールドがリストされ、実際には閉じられています。私はセミコロンの有無を問わず試してみましたが、私もクエリを単一のトランザクションとして実行しようとしました。同じ取引、ダイスなし。何が起こっているか考えてみませんか?

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ので、表示されない:

は、ここに私のVBAです。私はrsに時計を追加し、私が言ったように、クエリの後に0個のフィールドを表示し、閉じているようにも見える(状態= 0)。

答えて

8

を試してみて、私はそれが別々にそれぞれ1を実行します信じています。

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の値を削除すると、デフォルト値のままになります。あなたはADODBを使用してコマンドのバッチを実行すると、あなたのrs.Openで

1

この

rs.Open SQLStr, cn, adCmdText

3

あなたはあなたように、2つのステートメントを実行しているを実行するために、次のコマンドを強制するには、次の使用する必要があります2つの結果が返されます。レコードセットオブジェクトは一度に1つの結果しか保持できないため、NextRecordsetメソッドを使用する必要がある別の結果が得られます。

Set rs = rs.NextRecordset 
関連する問題