互いにConnectionが異なっていて、同じcolumnのテーブルで、データをRecordsetで取り出して、
一方にコピー後、テーブルに反映する方法を教えてください。
最後の、テーブルに反映がどうしてもできませんでした。
通報 ...
互いにConnectionが異なっていて、同じcolumnのテーブルで、データをRecordsetで取り出して、
一方にコピー後、テーブルに反映する方法を教えてください。
最後の、テーブルに反映がどうしてもできませんでした。
途中でもいいので現状のコードを提示してください。
'TBL1からTBL2へデータをコピー
'接続1
'SQL server
Dim StConnectDB As String
Dim dCnn As New ADODB.Connection
dCnn.ConnectionString = "Provider=SQLOLEDB; " & _
"Data Source=SALESSV2\ABCINSTANCE; " &
"Integrated Security=SSPI;Initial Catalog= 'AAA'"
dCnn.Open
Dim RstD As New ADODB.Recordset
Dim Sql As String
Dim fDate As Date
Dim tDate As Date
fDate = "2021/08/01"
tDate = "2021/08/31"
Sql = "select * from TBL1 " &
"where planDate between '" & fDate & "' and '" & tDate & "' " &
"order by ID"
RstD.Open Sql, dCnn, adOpenKeyset, adLockOptimistic
'接続2
'Access local
Dim Cnn As New ADODB.Connection
Dim Rst0 As New ADODB.Recordset
Set Cnn = CurrentProject.Connection
Rst0.Open "TBL2", Cnn, adOpenKeyset, adLockOptimistic
Set Rst0 = RstD.Clone
'TBL2に反映させたい
'while で addnewすれば書き込めるが、 SQLのinsertのように一気に書き込みたい
'TBL1とTBL2は構造は同じ
Cnn.Close
残念ながら、無理でしょう。
ご自身で書かれているように、INSERT文を用いて TBL2 にデータをコピーして下さい。
理由:
RstD のインスタンスを Rst0 に単純コピーするだけでは
Rst0 は、単に RstD のクローンになるだけで無意味ですし、
コピーした後に Rst0 の ActiveConnection を Nothing に設定すると
Rst0 は、どの DB とも接続されていない 独立した ADODB.Recordset にはなります。
で、Rst0 を Access 側である TBL2 の ADODB.Recordset として扱うためには
ActiveConnection プロパティと Source プロパティを書き換える必要がありますけど
Source プロパティは Recordset.Open 後、読取り専用のプロパティになっています。
結局、Source プロパティを書き換えるためには Recordset を一度閉じる必要があるのですけど
言うまでもなく、Closeメソッドを呼び出すと
Rst0 に内包されていたデータは消滅してしまいます。
レスありがとうございます。
VB.NETの方でしたら、レコードセットの受け渡しをしてテーブルに反映ができましたので、
Accessもできると思っていました。
おそらくですが、VB.NET で利用なさっているのが
ADO ではなく、ADO.NET の DataSet だからではないでしょうか。
レガシーADO は OLE DB プロバイダー
ADO.NET は .NET Framework データプロバイダー
とアーキテクチャも異なっており、
名前が似てはいますけど、仕様は全くの別物になっています。
一応、SQLServer 側のテーブルから Acccess のテーブルへ
Insert文を発行する例を載せておきます。
実装しました。結果、9500行を16秒でINSERTできたのでだいぶ改善されました。
ありがとうございました。