1

のパススルー クエリについて学習しましたMS-ACCESS

私はバックエンドを持っています。私が正しければ、クエリ アクセスは where 句を実行する前にすべてのレコードをロードします...では、バックエンドSQL SERVERを持つポイントは何でしょうか?SQL SERVER

そのため、できるだけパススルー クエリを使用したいのですが、パススルー クエリのリンク テーブルから接続文字列を取得する方法はありますか?

プロパティで試しCurrentDb.TableDefs("One of my table name").ConnectましたODBC Connect Strが、無効な接続文字列であるというエラーが表示されました。

すぐに接続を変更する必要があることがわかっているので、多くの場所で接続文字列を編集する必要がなくなるので、それは素晴らしいことです。

ありがとうございました。

4

1 に答える 1

2

私はあなたがここで何を意味しているのか分かりません: "クエリ アクセスの場合、 where 句を実行する前にすべてのレコードをロードします"

サーバーで句を適用できる場合WHERE、ODBC はそれをサーバーの言語に翻訳し、一致する行のみが Access に送り返されます。

WHERE date_field >= #2011-01-01# AND date_field < #2012-01-01#

このWHERE句は、Access に送信される行を、date_field値が 2011 年のものだけに制限します。

ただし、WHERE句に Access で評価する必要がある関数が含まれている場合、ODBC はすべての候補行を取得し、それらを Access db エンジンに渡して、評価を実行できるようにする必要があります。

WHERE Format(date_field, 'yyyy') = '2011'

しかし、実際の質問については...パススルークエリの接続文字列...次のコード例を検討してください。dbo_fooSQL Server のソース テーブルがという名前の ODBC リンクがあります[dbo].[foo]。したがって、.Connectプロパティを取得して、同じサーバー テーブルに基づくパススルー クエリdbo_fooのプロパティとして使用できます。.Connect

Public Sub CreatePassThruQuery()
    Dim db As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim strConnect As String
    Set db = CurrentDb
    strConnect = db.TableDefs("dbo_foo").Connect
    Set qdf = db.CreateQueryDef("qryDbo_Foo")
    qdf.Connect = strConnect
    qdf.SQL = "SELECT * FROM [dbo].[foo];"
    qdf.Close
    Set qdf = Nothing
    Set db = Nothing
End Sub

それでも.Connect、テーブルのプロパティを変更する場合は、クエリに対しても変更する必要があります。それらが多数ある場合や接続を頻繁に変更する場合は、それらを更新するための VBA プロシージャを作成する価値があるかもしれません。.Connectまたは、テーブルのプロパティと一致するクエリにDSN を使用することもできます。その後、必要に応じて DSN を修正します。このアプローチの落とし穴は、他の人がアプリケーションを使用する場合、複数のマシンで DSN を管理する必要があることです。

于 2012-10-24T18:02:26.407 に答える