2017-02-27 32 views
0

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変数がゼロである - それは、接続オブジェクトは、レコードセットによって挿入されたレコードのいずれかを見ることができないように私には見えます。

+0

グローバルスコープを与えるには '## TEMP'を使用してください。 – Lankymart

+0

[SQL Serverでの一時テーブルのスコープ]の複製の可能性があります。(http://stackoverflow.com/questions/18614344/scope-of-temporary-tables-in-sql-server) – Lankymart

+0

://stackoverflow.com/a/37073685/692942)、 'SET NOCOUNT ON;'を設定してみてください。 – Lankymart

答えて

1

私は問題があなたが削除ステートメントを発行する前に、レコードセットを閉じていないことだと思う。私もロックタイプを変更しましたが、それはおそらく二次的な問題です。これは私のために働きます:

Dim cn As New ADODB.Connection 
Dim rst As New ADODB.Recordset 
Dim i As Integer 

Const connString As String = "Provider=sqloledb;Data Source=yourserver;Initial Catalog=yourdb;Integrated Security=SSPI;" 

'Open Connection. 
cn.Open connString 

'Create temp table. 
cn.Execute "CREATE TABLE #TEMP (COL1 INT)" 

'Open rst. 
With rst 
    .ActiveConnection = cn 
    .CursorType = adOpenDynamic 
    .LockType = adLockOptimistic 
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 
rst.Close 

'Delete records using connection. 
cn.Execute "DELETE FROM #TEMP WHERE COL1 IN (2,4)" 

'Display 
rst.Open "#TEMP" 
While Not rst.EOF 
    Debug.Print rst!COL1 
    rst.MoveNext 
Wend 
rst.Close 
関連する問題