3

300を超えるAccessデータベース(制御できないプログラムによって作成された)を含むフォルダーがあります。それらはすべて同じ構造で、1つのテーブルだけです。SQL Server(2005)のテーブルにデータをインポートしています。インポートウィザードの使用はうまく機能しますが、一度に1つのAccessデータベースでのみ機能します。

私はこれを行う方法を検索して検索しましたが、ForEachループコンテナー内のデータフロータスクを使用して何かに取り組んでいると思いました。ただし、Excelファイルまたはフラットファイルをソースとして使用してこれを行う方法しかわかりません。

どんな助けでも大歓迎です。

4

2 に答える 2

1

1 回限りのタスクの場合は、使い捨ての VBA コードを使用できます。

新しいデータベースを作成し、そのデータベース内に SQL Server テーブルへの ODBC リンクを作成します。

次に、次のような新しい Access クエリを作成します。

INSERT INTO remote_table (<field list>)
SELECT <field list>
FROM YourTable In 'C:\SourceFolder\db1.mdb';

ソースと宛先でフィールドの名前が同じ場合は、省略できます<field list>

INSERT INTO remote_table
SELECT *
FROM YourTable In 'C:\SourceFolder\db1.mdb';

最良の場合、Access フィールドの値は SQL Server のフィールド タイプと互換性があります。そうでない場合は、Access 関数を使用して、フィールド値を SQL Server と互換性のある型にキャストする必要があります。

並べ替えが完了したら、Access db ファイルからデータをアップロードする VBA 手順をすばやく簡単に実行できます。

Sub Test()
Const cstrExtension As String = "mdb"
Const cstrFolder As String = "C:\SourceFolder\"
Dim db As DAO.database
Dim strDbFile As String
Dim strInsert As String

strInsert = "INSERT INTO remote_table (<field list>)" & vbCrLf & _
    "SELECT <field list>" & vbCrLf & _
    "FROM YourTable In 'DB_FILE';"
Set db = CurrentDb
strDbFile = Dir(cstrFolder & "*." & cstrExtension)
Do While Len(strDbFile) > 0
    db.Execute Replace(strInsert, DB_FILE, _
        cstrFolder & strDbFile), dbFailOnError
    strDbFile = Dir()
Loop
Set db = Nothing
End Sub
于 2013-01-21T18:36:26.173 に答える
1

あなたがする必要があるのはこれです:

1.- パッケージ内に 2 つの変数を作成します。1 つは「current_file」と呼ばれ、もう 1 つは「loading_location」(または好みの名前) と呼ばれ、どちらもパッケージのスコープ、データ型文字列、current_file の場合は値を空のままにし、loading_location に置くAccess データベースを含むフォルダーのルート。

2.- Foreach ループ コンテナーを追加し、その中にコレクションに移動し、式を選択して、新しい式を追加します。プロパティで [ディレクトリ] を選択し、[式] で、作成したばかりの loading_location 変数を選択します。もう一度コレクションに戻り、ファイルに次のように入力します: *.mdb

他のすべてのオプションはそのままにしておきます。次に、変数マッピングに移動し、変数で current_file 変数を選択します。

3.- 新しい OLE DB 接続を作成します。[プロバイダー] で [Microsoft Jet 4.0 OLE DB Provider] を選択し、[データベース ファイル名] で任意のアクセス DB を選択します (これは後で変更されますので心配しないでください)。

4.- Foreach ループ コンテナー内にデータ フロー タスクを作成し、そのデータ フロー タスク内に OLE DB ソースを追加します。OLE DB ソースを開き、接続マネージャーで作成した接続を選択し、データ アクセス モードで [テーブルまたはビュー] を選択して、DB のテーブルを選択します。

5.- OLE DB 宛先を追加し、宛先データベースに対応する接続​​を選択し、Access データベースのデータを配置するテーブルを選択します。

次に、これがすべての Access データベースを通過するように変更します。

6.- Access DB 用に作成した接続を選択し、[プロパティ] ウィンドウに移動して、ConnectionString の値をメモします。

データ ソース="MyAccessDBFile";プロバイダー = Microsoft.Jet.OLEDB.4.0;

DBに対する許可に応じて、追加のものがある場合があります。Expression 属性に移動して展開し、2 つの式を追加します。プロパティ「ConnectionString」に 1 つ、式に配置

"Data Source="+yourCurrentFileVariable+";Provider=Microsoft.Jet.OLEDB.4.0;"

次のようなものを取得する必要があります。

"Data Source="+ @[User::current_file]+";Provider=Microsoft.Jet.OLEDB.4.0;"

プロパティ「ServerName」の新しい式を追加します。この式で current_file 変数を Expression として選択すると、式フィールドに次のような値が表示されます。

@[ユーザー::現在のファイル]

画像

7.- OLE DB ソースでエラーが発生しますが、current_file 変数がまだ値を持っていないという理由だけで心配する必要はありません。Foreach ループ コンテナーのデータ フロー タスクに戻り、DelayValidation 属性を true に設定します。Project->"Your Package" Properties->Debugging に移動し、Run64BitRunteime を false に設定します。

画像

以上です。

于 2014-01-02T14:44:50.433 に答える