VBAでは、ADOレコードセットと接続を使用してSQL Server#TEMPテーブルに対して別の操作を実行しようとしています。ADOレコードセットと接続を使用して同じ#TEMPテーブルを更新する
以下のコードでは、レコードセットと接続で同じセッション/スコープが使用されているため、どちらのオブジェクトでも#TEMPテーブルにアクセスできます。これは当てはまるとは思われません。レコードセットには、接続によって作成された#TEMPテーブルが表示されますが、レコードセットによって挿入されたレコードは表示されません。また、レコードセットは、接続オブジェクトによる削除の試行後にレコードを返しません。
私はこれがなぜ、どのように正しいことができるのだろうと思っています。
EDIT:ローカルの#TEMPテーブルまたはグローバル## TEMPテーブルを使用するかどうかにかかわらず、以下のコードは失敗します。
Dim cn As New adodb.Connection
Dim rst As New adodb.Recordset
'Open Connection.
cn.Open cConnSeasFcst
'Create temp table.
cn.Execute "CREATE TABLE #TEMP (COL1 INT)"
'Open rst.
With rst
.ActiveConnection = cn
.CursorLocation = adUseClient
.CursorType = adOpenDynamic
.LockType = adLockBatchOptimistic
End With
'Add records to temp table using rst.
rst.Open "#TEMP"
For i = 1 To 5
rst.AddNew
rst!COL1 = i
rst.Update
Next
'Delete records using connection.
cn.Execute "DELETE #TEMP WHERE COL1 IN(2,4)", raff
'Display.
rst.Requery
While Not rst.EOF ' ##ALWAYS AT EOF. RECORDS ARE NOT RETURNED.##
Debug.Print rst!COL1
rst.MoveNext
Wend
最終レコードセットの再クエリは、すべてのレコードを返さない、とraff
変数がゼロである - それは、接続オブジェクトは、レコードセットによって挿入されたレコードのいずれかを見ることができないように私には見えます。
グローバルスコープを与えるには '## TEMP'を使用してください。 – Lankymart
[SQL Serverでの一時テーブルのスコープ]の複製の可能性があります。(http://stackoverflow.com/questions/18614344/scope-of-temporary-tables-in-sql-server) – Lankymart
://stackoverflow.com/a/37073685/692942)、 'SET NOCOUNT ON;'を設定してみてください。 – Lankymart