テーブルによっては以下のようなエラーが出て、どうにもならない例がありました。

いろいろと試行錯誤したのですが、SQL文一発では解決できそうになく、、、
ADOを使って、チマチマ1行ずつ読み書きするという古来の方法しか無いのかな。。。
せめて、プロシージャにしておくか。
・読むADOコネクションを開く(SQLServerから)
・書くADOコネクションを開く(Accessへ)
・Call TableImport("読み書きするテーブル名", 読むADO, 書くADO)
こんな感じで使えます。
案外、思ったよりも処理が早い!
Option Compare Database ' ■-------------------------------------------------------- ' ■SQLServer のテーブルを、ACCESSにコピーする ' ■-------------------------------------------------------- Public Sub GetTableDWH() Dim strSQL As String Dim strMessage As String ' ■SQLServerから読み込む側の設定 Dim adoCn_R As Object 'ADOコネクションオブジェクト Set adoCn_R = CreateObject("ADODB.Connection") 'ADOコネクションのオブジェクトを作成 adoCn_R.Open = "Provider=SQLOLEDB.1;Password=パスワード;Persist Security Info=True;User ID=ユーザー名;Initial Catalog=データベース名;Data Source=サーバー名" ' ■Accessへ書き込む側の設定 Dim adoCn_W As Object 'ADOコネクションオブジェクト Set adoCn_W = CurrentProject.Connection ' ■テーブルを読み込む処理(ここでは、同じテーブル名での読み書きを想定しています) Call TableImport("読み書きするテーブル名", adoCn_R, adoCn_W) ' ■読み書きの設定を終了する adoCn_R.Close: Set adoCn_R = Nothing 'コネクションの破棄 adoCn_W.Close: Set adoCn_W = Nothing 'コネクションの破棄 MsgBox "取り込み処理が完了しました!" & vbCrLf & vbCrLf & strMessage End Sub ' ■-------------------------------------------------------- ' ■SQLServer のテーブルを、ACCESSにコピーする ' ■-------------------------------------------------------- Private Sub TableImport(strTableName As String, ByRef objCn_R As Object, ByRef objCn_W As Object) ' SQLServerから読み込む側の設定 Dim adoRs_R As Object 'ADOレコードセットオブジェクト Set adoRs_R = CreateObject("ADODB.Recordset") 'ADOレコードセットのオブジェクトを作成 ' Accessへ書き込む側の設定 Dim adoRs_W As Object 'ADOレコードセットオブジェクト Set adoRs_W = CreateObject("ADODB.Recordset") 'ADOレコードセットのオブジェクトを作成 ' 削除メッセージを出さなくして、Access上のテーブル内容を全件削除 DoCmd.SetWarnings False DoCmd.RunSQL "DELETE FROM " & strTableName ' Access側のテーブルが、クリアされて無かったら、エラー表示 If DCount("*", strTableName) > 0 Then MsgBox "Access側の「" & strTableName & "」テーブルの内容、削除しきれてないでー" End If ' SQLserver側のテーブル内容を全件持ってくるため、読み込み、書き込みのオープン strSQL = "SELECT * FROM " & strTableName adoRs_R.Open strSQL, objCn_R adoRs_W.Open strTableName, objCn_W, 1, 2 ' レコードごとに読み書きし、全レコードをなめる Do Until adoRs_R.EOF adoRs_W.AddNew For i = 0 To adoRs_R.Fields.Count - 1 adoRs_W.Fields(i).Value = adoRs_R.Fields(i).Value Next i adoRs_W.Update adoRs_R.MoveNext Loop 'レコードセットの破棄 adoRs_R.Close: Set adoRs_R = Nothing adoRs_W.Close: Set adoRs_W = Nothing ' メッセージを出すモードに戻す DoCmd.SetWarnings True End Sub
0 件のコメント:
コメントを投稿