8

2 つのデータベースがあります。1 つは MS Access ファイルで、もう 1 つは SQL Server データベースです。Access データベースのデータに基づいて SQL Server データベースからデータをフィルター処理する SELECT コマンドを作成する必要があります。ADO.NET でこれを実現する最善の方法は何ですか?

必要なデータを各データベースから 2 つの新しいテーブルにプルできますか? これらを単一のデータセットに入れます。次に、データセットで別の SELECT コマンドを実行して、データを結合しますか?

追加情報: Access データベースは永続的ではありません。使用する Access ファイルは、実行時にユーザーが設定します。

ここでは、2 つのデータベースがある理由を説明するための背景情報を少し説明します。私の会社では、建物の設計に CAD プログラムを使用しています。プログラムは、CAD モデルで使用される材料を Access データベースに保存します。モデルごとに 1 つのファイルがあります。各モデルの原価計算情報を生成するプログラムを作成しています。これは、SQL Server データベースに保存されている現在の材料価格に基づいています。


私の解決策

アクセスデータベースのデータをSQLサーバーデータベースの一時テーブルにインポートするだけになりました。必要なすべての処理を実行してから、一時テーブルを削除します。それはきれいな解決策ではありませんでしたが、うまくいきました。

4

6 に答える 6

3

必要がない場合は、両方のデータセットをプルする必要はありません。ファイルの場所が変更される可能性があり、サーバー自体がすぐに利用できない可能性があるため、Tomalak のソリューションの実装にも問題が生じるでしょう。

私の推測では、あなたのユーザーは、人や製品、または作業に関心のあるものを含む Access データベースをセットアップしているので、2 つのデータベースから選択する必要があるのです。その場合、Access テーブルは SQL Server テーブルよりも小さい可能性があります。最善の策は、Access データを取得し、それを使用して SQL Server へのフィルター処理されたクエリを生成し、ネットワーク経由で送信されるデータを最小限に抑えることです。

したがって、最も重要なことは次のとおりです。

  1. サーバー上のデータをフィルター処理して、ネットワーク トラフィックを最小限に抑えることができます。また、データベースは ADO.NET よりもフィルター処理が高速になるためです。
  2. アプリケーションに取り込むデータセットを選択する必要がある場合は、小さい方のデータセットを取り込み、それを使用して他のテーブルをフィルター処理します。
于 2008-10-27T14:55:16.180 に答える
1

Sql Server が Access データベースにアクセスできると仮定すると、それらに対してOPENROWSETクエリを作成できます。

 SELECT a.* 
 FROM SqlTable 
 JOIN OPENROWSET(
     'Microsoft.Jet.OLEDB.4.0', 
     'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';'admin';'',
     Orders
 ) as b ON
     a.Id = b.Id

別の MDB にアクセスするには、実行時に Access データベースへのパスを変更するだけです。

于 2009-03-10T10:06:12.697 に答える
0

十分な情報を提供していないため、いくつかの推測を行う必要があります。

仮定:

  1. SQL Server と Access データベースが同じコンピューター上にない
  2. SQL Server がファイル共有を介して Access データベースを認識できないか、これを実現するのが非常に困難です。
  3. アクセス データベースと SQL サーバーの間で結合を行う必要はありません。アクセス データベースのデータのみを where 句のルックアップ要素として使用します。

上記の仮定が正しければ、ADO を使用して Access データベースを開き、データセットまたはデータテーブルから必要なデータを取得できます。次に、必要なデータを抽出し、動的 ​​Where 句、準備済みステートメント、またはストアド プロシージャへのパラメーターを介して、SQL Server への別の ADO クエリにフィードします。

人々が提供している他のソリューションはすべて、データを結合するか、両方のデータベースを含む SQL を実行する必要があると想定しています。これを行うには、リンクされたデータベースを使用するか、データをテーブルに (おそらく一時的に) インポートする必要があります。

于 2009-03-10T00:04:19.583 に答える
0

Access フロント エンドから ODBC 経由で SQL Server にリンクし、両方のテーブルがローカルであるかのように SQL を記述した場合に何が起こるかをベンチマークしてみましたか? 次に、サーバー上でトレースを実行して、Jet がサーバーに送信するものを正確に確認できます。Jet がこの種のことでどれほど効率的であるかについて驚くかもしれません。キー フィールド (たとえば、ID フィールド、SQL Server からかどうかに関係なく) にリンクしている場合、Jet が ID のリストを送信する可能性があります。または、SQL を記述してそのようにすることもできます (WHERE 句で IN SELECT ... を使用)。

基本的に、どこで WHERE 句を実行するかによって効率が異なります。たとえば、単一のフィールドでローカルの Jet テーブルをリンクされた SQL Server テーブルと結合し、ローカル テーブルの値に基づいて結果をフィルター処理する場合、Jet が唯一行うことであるという点で、非常に効率的である可能性が非常に高くなります。 send to server は、SQL Server テーブルをフィルタリングするために必要なものです。

繰り返しますが、何をしようとしているのか (つまり、どのフィールドをフィルタリングするのか) に完全に依存します。ただし、Jet が台無しにするとすぐに想定するのではなく、Jet が賢いかどうかを確認する機会を与えてください。Jet を効率的に動作させるには多少の調整が必要になる可能性がありますが、すべてのロジックをクライアント側に保持できる場合は、サーバーからすべての Access データベースを追跡することをいじくりまわすよりはましです。

于 2008-10-27T19:54:24.393 に答える
0

まず、サーバーで何かを行う必要があります。Access DB を「リンク サーバー」として参照します。

その後、SQL サーバー内からクエリを実行して、好きなようにデータを引き出したり、詰め込んだりすることができます。この Web ページでは、その方法について概要を説明しています。

http://blogs.meetandplay.com/WTilton/archive/2005/04/22/318.aspx

于 2008-10-27T14:18:56.270 に答える
0

質問を正しく読んだ場合、複数のデータベース間で相互参照を試みているわけではありません。

特定の FILE に関する詳細を参照するだけで済みます。この場合、次のものが含まれる可能性があります。

主キー、親ファイルのチェックサム (変更の場合)、ファイルのチェックサム、最後の既知の作成者、リビジョン番号、最終変更日...

そして、プログラムを使用してそのファイルを分析して得られた情報を追加するときのその主キー。

実際に分散データベースが必要な場合は、LDAP などの非リレーショナル データベースを使用することをお勧めします。

LDAP を使用できないが、リレーショナル データベースを使用する必要がある場合は、GUID を使用して主キーが適切であることを確認することを検討してください。

于 2009-03-06T06:09:33.330 に答える