sql >> データベース >  >> RDS >> Access

アドホック接続文字列とMSAccessの異種クエリ

    MSAccessのアドホック接続文字列と異種クエリ

    異種クエリは、接続文字列、特にアドホック接続文字列が重要である理由です。シリーズの以前の記事では、Excelおよびテキストファイルに接続するための接続パラメーターをカスタマイズする方法を説明しました。テキストファイルの場合、schema.iniを使用して、テキストファイルの構造のスキーマを記述することもできます。 または保存された仕様。最初の記事では、データソースをリンクすることと開くことの違いについても学びました。

    VBAコードの代わりに異種クエリ

    以前の記事で、DAOのOpenDatabaseを使用してそのようなデータソースを開くサンプルコードを見ました。 メソッド。

    Set db = DBEngine.OpenDatabase(vbNullString, False, False, "Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=C:\Links\Products.xlsx")

    これにより、データソースを開く唯一の方法はコードを使用することであるという印象を残す可能性があります。しかし、そうである必要はありません!実際には、Accessクエリのみを使用して任意のデータソースを開くことができます。 Accessクエリで実行できる構文の例は次のとおりです。

    SELECT * 
    FROM [Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=C:\Links\Products.xlsx].[Sheet1$];

    一般的に、OpenDatabaseに入力する接続文字列 の4番目のパラメータは、「テーブル」の前に付けるパラメータです。したがって、一般的な構文は次のようになります。

    FROM [<complete connection string>].[<name of the table>]

    OpenDatabaseを使用できます メソッドとTableDefsの反復 テーブルの有効な名前を検索します。次に、それを使用して名前の2番目の部分を入力できます。

    リンクの代わりに開くのはなぜですか?

    リンクではなく開くことの利点の1つは、実行時に接続文字列を変更できることです。また、不要になったリンクオブジェクトを削除するなど、必要なクリーンアップを行う必要もありません。これは純粋に一時的なものであり、VBAコードを記述せずに1つのソースから別のソースにデータを移動するのに最適です。

    考えられるシナリオの1つを次に示します。 SQLServerデータベースのビューからの出力であるテキストファイルを作成するとします。以前の記事から、DAOレコードセットをループしてコンテンツを1つずつ書き込むVBAコードを記述できることがわかりました。ただし、別の方法として、代わりにこのSQLを使用してAccessクエリを作成することもできます:

    INSERT INTO [Text;DATABASE=C:\Links\].[products.csv;] (Products, Count)
    SELECT Products, Count
    FROM [ODBC;DRIVER=ODBC Driver 17 for SQL Server;SERVER=myServer;DATABASE=myDatabase;].[vwProducts];

    宛先とソースの両方がAccessのソースではないため、これを「異種クエリ」と呼びます。 vwProductsであっても、注意してください リンクされたテーブルであったとしても、それでも「異種」クエリになります。これは、1つのクエリでさまざまなデータソースを混合しているためです。

    さらに重要なことに、異種クエリを使用することで、Accessアプリケーション内に一時オブジェクトを作成する必要がなくなります。一時オブジェクトを作成すると、Accessアプリケーションが肥大化する可能性があります。これは、VBAでレコードセットをインポート、リンク、または使用する場合でも当てはまります。肥大化したファイルは、圧縮と修復が必要になる場合があります。ただし、異種クエリを使用してデータをあるデータソースから別のデータソースに直接転送する場合は、その肥大化をすべて回避できます。したがって、Accessアプリケーションがアプリケーション自体のメンテナンスなしで複数のファイルを生成する必要があるシナリオに最適です。

    アドホック接続文字列の作成

    これで、接続文字列で使用されるパラメータを理解することが重要である理由がわかります。宛先(テキストファイルのパスやExcelシートの範囲など)を制御することは特に重要です。これらの非リレーショナルデータソースでは、そのようなデータソースの「データベース」と「テーブル」を構成するものは直感的ではない場合があります。最後の3つの記事を参照として使用して、接続文字列とスキーマ情報を作成し、レイアウトが正しく表示されるようにすることができます。とはいえ、接続文字列を見つけるのに役立つショートカットもあります。

    [外部]タブと[テキストのインポート]または[Excelのインポート]のいずれかを使用して、リンクオプションを選択できます。これは通常、示されているようにウィザードの3番目のオプションです。

    ウィザードを実行して新しいリンクテーブルを保存したら、次のコードを使用してVBAイミディエイトウィンドウから接続文字列を調べることができます。

    ?CurrentDb.TableDefs("<name of linked table>").Connect

    これにより、接続文字列を作成する方法のヒントが得られ、カスタマイズすることができます。ほとんどの場合、パスまたはテーブル名をカスタマイズしていることに気付くでしょう。そのため、通常、開発中の手法として十分に機能します。その後、それに応じて異種クエリを作成し、リンクされたテーブルを削除できます。

    結論

    このシリーズでは、リンクとオープニングの違いを学びました。次に、ExcelファイルとテキストファイルをDAO.Databaseのように使用する方法を確認しました。 「テーブル」を持つオブジェクト。 2番目の記事では、Excelブックの接続パラメーターについて学習しました。 3番目の記事では、テキストファイルを記述するためのスキーマ情報が必要であることがわかりました。 4番目の記事では、schema.iniの使用方法について説明しました。 。 5番目の記事では、MSysIMEXSpecsがどのように機能するかを見ました。 およびMSysIMEXColumns schema.iniの代わりに使用できます メソッド。

    最後に、ローコードソリューションの例として、異種クエリを構築する際にすべてをまとめました。あるソースから別のソースにデータをプッシュするためだけに、大量のVBAコードを記述する必要はありません。データの読み取りと書き込みを行う大規模で複雑なVBAルーチンを作成するよりも、パスまたはテーブル名を調整してAccessクエリを変更する方がはるかに簡単であることに同意していただけると思います。さらに重要なことに、異種クエリを使用することで、どちらの側の構造の変更もはるかに簡単に処理できるようになります。新しい列が追加されましたか?問題ありません。クエリに新しい列を追加するだけで完了です。

    ただし、ご覧のとおり、これには接続文字列の構成を十分に理解する必要があります。そのため、2〜5回目と同様に、接続ストリングの複雑さを深く検討する必要がありました。リンクテーブルウィザードを使用して、接続文字列に関するヒントを得ることができますが。しかし、それはヒントにすぎません。したがって、出力を正確に制御する方法を知っておくとよいでしょう。接続文字列がどのように機能するかを理解するためにある程度の努力を払うことで、労力を節約できることに同意していただければ幸いです。


    1. Moodleのパフォーマンスをベンチマークする方法

    2. PRAGMAEXCEPTION_INITを使用してユーザー定義の例外を宣言する方法

    3. テーブルの主キーのベストプラクティスは何ですか?

    4. SQL Serverトランザクションログ—パート2