6

ExcelでVBAスクリプトを使用して、新しい行をテーブルに挿入し、その行のID値を取得しようとしています。私が実行した場合:

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

Management Studioでは、行が挿入され、期待どおりに返されたID値が表示されます。ただし、VBAのADODBレコードセットを介してまったく同じクエリを実行すると、問題が発生します。行は実際に挿入されていますが、ID値にアクセスできません。レコードセットには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)。

4

4 に答える 4

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)
于 2009-07-29T15:37:15.453 に答える
3

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

Set rs = rs.NextRecordset
于 2009-07-29T15:38:01.443 に答える
1

あなたのrs.Openでこれを試してください

rs.Open SQLStr, cn, adCmdText

于 2009-07-29T15:31:18.790 に答える
0

adOpenKeySetとadLockOptimisticの値を削除すると、デフォルトのままにするとどうなるかを確認してください。

于 2009-07-29T15:29:23.397 に答える