Microsoft Access 掲示板

レコードセットをレコードセットにコピーしてテーブルに反映

6 コメント
views
5 フォロー

互いにConnectionが異なっていて、同じcolumnのテーブルで、データをRecordsetで取り出して、
一方にコピー後、テーブルに反映する方法を教えてください。
最後の、テーブルに反映がどうしてもできませんでした。

やす
作成: 2021/08/23 (月) 17:17:08
通報 ...
1

最後の、テーブルに反映がどうしてもできませんでした。

途中でもいいので現状のコードを提示してください。

2
やす 2021/08/24 (火) 09:02:35 1915d@9f459

    '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

3
mayu 2021/08/24 (火) 13:26:01 修正 ef559@a99f1

Set Rst0 = RstD.Clone
'TBL2に反映させたい

残念ながら、無理でしょう。
ご自身で書かれているように、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 に内包されていたデータは消滅してしまいます。

4
やす 2021/08/25 (水) 16:47:31 1915d@9f459

レスありがとうございます。
VB.NETの方でしたら、レコードセットの受け渡しをしてテーブルに反映ができましたので、
Accessもできると思っていました。

5

おそらくですが、VB.NET で利用なさっているのが
ADO ではなく、ADO.NET の DataSet だからではないでしょうか。

レガシーADO は OLE DB プロバイダー
ADO.NET    は .NET Framework データプロバイダー

とアーキテクチャも異なっており、
名前が似てはいますけど、仕様は全くの別物になっています。

一応、SQLServer 側のテーブルから Acccess のテーブルへ
Insert文を発行する例を載せておきます。
  

Sub insertTBL2()
    Const fDate As Date = #8/1/2021#
    Const tDate As Date = #8/31/2021#
    Dim strSQL  As String
    
    '接続に用いるプロバイダがODBCのため、日付リテラルの引用符は
    'Transact-SQLの単一引用符ではなく、Access-SQLのシャープになります
    
    strSQL = "INSERT INTO TBL2 " & vbNewLine _
           & "SELECT * FROM " & vbNewLine _
           & "[ODBC;" & vbNewLine _
           & "driver=SQL SERVER;" & vbNewLine _
           & "server=SALESSV2\ABCINSTANCE;" & vbNewLine _
           & "trusted connection=YES;" & vbNewLine _
           & "database=AAA].TBL1 " & vbNewLine _
           & "WHERE planDate Between #" & fDate & "# " & vbNewLine _
           & "                   And #" & tDate & "# " & vbNewLine _
           & "ORDER BY ID;"
    
    CurrentProject.Connection.Execute CommandText:=strSQL _
                                    , Options:=adExecuteNoRecords
End Sub
6
やす 2021/08/27 (金) 09:20:47 1915d@9f459

実装しました。結果、9500行を16秒でINSERTできたのでだいぶ改善されました。
ありがとうございました。