質問

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

役に立ちましたか?

解決

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)

他のヒント

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

Set rs = rs.NextRecordset

rs.Openでこれを試す

rs.Open SQLStr、cn、adCmdText

adOpenKeySetとadLockOptimisticの値を削除すると、デフォルトのままにしておきます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top