1

Access 97 データベースを使用して情報を格納する古いシステムがあります。毎日、90 ほどのテーブルから SQL Server 2008 データベースにデータをコピーしたいと考えています。SS2008 で定義されたテーブルが既にあります。

テーブルごとに個別のボックスラインボックスを持つ、同じように古い DTS ジョブがあります。行やボックスではなく、コードで記述された、保守が容易なメソッドを使用したいと思います。(はい、SSIS の行とボックスが XML に変換されることは知っていますが、それを読み書きするのはちょっと難しいです。)

SS2008 サーバーが 64 ビット プロセスとして実行されているため、Linked Server または OPENROWSET を使用できず、OLEDB Jet ドライバーを使用できません。OLEDB MSOffice ACE 12.0 ドライバーは 64 ビットですが、(Microsoft によると) スレッドセーフではないため、データベース サーバーで使用することは想定されていません。また、広範な調査にもかかわらず、SS2008 内で動作させることができません (「インストール可能な ISAM が見つかりませんでした」)。SSIS などの 32 ビット プログラムで OLEDB Jet を使用して Access テーブルを読み取ることができます。

そのため、Access mdb/mdw ファイルから SS2008 にテーブルをコピーするための、モダンで非ボックス アンド ラインのエレガントな 32 ビット ソリューションを探しています。

私はこれを行うことができます:

  • 単一の T-SQL スクリプト
  • イントロスペクションを行ってテーブル構造を決定し、各テーブルに対して SQL を実行する C# のこと
  • いくつかの魔法の「このOLEDBからそのSQL Serverにすべてのテーブルをコピーする」パッケージ

この質問にはいくつかの詳細な重複があります (アクセス データベースを SQL サーバーに定期的にコピーするアクセス テーブルを SQL サーバーに移行する - 初心者)、OPENROWSET/Linked Server を非オプションにする 32 ビットの制限に対処するものはありません。

4

2 に答える 2

2

おそらく、次のように VBA を使用して Access 自体から実行できます。

Public Function CopyTableDataToSqlServer()
Dim tbd As DAO.TableDef, qdf As DAO.QueryDef, connStr As String
connStr = _
        "ODBC;" & _
        "Driver={SQL Server};" & _
        "Server=.\SQLEXPRESS;" & _
        "Database=cloneDB;" & _
        "Trusted_Connection=yes;"
For Each tbd In CurrentDb.TableDefs
    If Not ((tbd.Name Like "MSys*") Or (tbd.Name Like "~*")) Then
        Debug.Print tbd.Name
        Set qdf = CurrentDb.CreateQueryDef("")
        qdf.Connect = connStr
        qdf.SQL = "DELETE FROM [" & tbd.Name & "]"
        qdf.ReturnsRecords = False
        qdf.Execute
        Set qdf = Nothing
        CurrentDb.Execute _
                "INSERT INTO [" & connStr & "].[" & tbd.Name & "] " & _
                "SELECT * " & _
                "FROM [" & tbd.Name & "] ", _
                dbFailOnError
    End If
Next
Set tbd = Nothing
Debug.Print "Done."
End Function
于 2013-06-22T16:51:45.857 に答える
1

私はいくつかのC#のものに投票しました。大きなテーブルがある場合、メモリ使用量に注意する必要があるかもしれません。

基本的な考え方は次のようになります。

foreach(tableName in access)
    get the table from access
    optionally clear the target table
    sqlbulkcopy it to target database

より複雑な解決策は、両方のテーブルを取得して、変更された行のみを更新することです。

于 2013-06-22T08:28:47.917 に答える