1

Jet(mdb)クエリで次の構文を使用して、別の.mdbファイルからデータを選択できます。

SELECT * FROM [Database=C:\Tempo\AnotherDB.mdb;].MyTable

あるいは

SELECT * FROM MyTable IN 'C:\Tempo\Another.mdb'

これを拡張して、ワークグループセキュリティ(別名ユーザーレベルセキュリティ)を使用したいと思います。ユーザーIDとパスワードを指定する方法を知っています。

SELECT *
FROM
[Database=C:\Tempo\AnotherDB.mdb;UID=Admin;PWD=***;].MyTable

ただし、これは、両方のmdbが同じmdwを共有している場合にのみ機能します。

他のmdbを保護するために使用されるmdwファイルのパスをどのように指定しますか?出来ますか?そうでない場合は、なぜですか?

PS私は何年も前にこのAccessニュースグループの投稿でこの質問をしましたが、返事がありませんでした。Access MVPがそれが不可能であると私に確信させた後、私はあきらめました。詳細は思い出せませんが、基盤となるアーキテクチャと関係があります(ワークスペースは、1つのワークグループファイルのみをサポートし、Jetクエリが新しいワークスペースをインスタンス化するメカニズムはありません。とにかくそのようなものです)。

私の新たな関心は、このSOコメントによって引き起こされました。

4

5 に答える 5

2

短い答えはノーです。ソース データベースを使用する場合、別のワークグループを指定することはできず、空白のままにして有効な接続文字列を指定すると、ISAM エラーが発生します。(ただし、この方法は SQL Server などの他のデータベースでは問題なく機能します。) 例 (機能しません):

SELECT *
FROM Table1 IN '' [Provider=Microsoft.Jet.OLEDB.4.0;Password=foo;User ID=Oorang;Data Source=C:\Users\Oorang\Documents\db1.mdb;Persist Security Info=True;Jet OLEDB:System database=C:\Users\Oorang\Documents\Security.mdw];

ただし、ADO でそれを行うことができます。クエリを取得したら、何を達成しようとしているのかわかりませんが、レコードセットに取得する方法は次のとおりです。

Option Explicit
Sub ADODBExample()
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Password=foo;User ID=Oorang;Data Source=C:\Users\Oorang\Documents\db1.mdb;Persist Security Info=True;Jet OLEDB:System database=C:\Users\Oorang\Documents\Security.mdw"
    Set rs = New ADODB.Recordset
    rs.Open "SELECT * FROM Table1;", cn
    Debug.Print rs.GetString
    rs.Close
    cn.Close
End Sub

どちらの方法でも、最終的にアカウント資格情報がハードコーディングされることに注意してください。A.) ユーザーに上記の情報を提供するように促すか、B.) 読み取り専用アクセスが最小限に制限された特別なアカウントを使用することをお勧めします。また、コード内の情報を難読化するためにいくつかの手順を実行することをお勧めします。また、プロジェクトをパスワードで保護しても、実際にはファイルに保存されているテキストが不明瞭になるわけではありません。

于 2009-05-18T03:51:23.530 に答える
0

まあ...実際には、接続文字列を使用できます。これは、SQL Server で最適に機能します。Access で動作する場合の様子を示しただけです。私が作ろうとしていたポイントは、有効な構文があるということです...それは、Access が Access でそれを行うことを許可しないということだけです。(接続が別のタイプのデータベースにある場合は、それを行うことできます。)この機能が Access ではなく他のタイプの DB と互換性があるのはおかしいです... Access場合ですが、それでも当てはまります。

それらが同じ MDW で保護されている場合は、これを実行するだけで、クエリは現在ログインしているユーザーのコンテキストで実行されます。

SELECT *
FROM Table1 IN 'C:\Users\Oorang\Documents\db2.mdb';
于 2009-05-19T00:32:18.637 に答える
0

たぶん、再統合して明確にする必要があります:) 元の質問の文脈では、答えは次のとおりです。ただし、両方のデータベースが Access であり、同じmdw を持っている場合 (後のコメントが示すように)、SQL/Query Builder を介して実行できます。その特定のシナリオでは、接続文字列を介してそれを実行することはできません (実行できません)。以下の手順 1 ~ 4 に従って実行し、手順 5a を 5b に置き換えます。

データベースが両方とも Access であり、mdw が異なる場合、異なるワークグループを指定する唯一の方法は、接続文字列を使用することです。ただし、接続文字列プロパティを介して接続しようとすると、SQL/Query Builder は ISAM エラーをスローします (以下の手順 5a)。そのため、クエリビルダーを介して行うことはできません。以前に投稿した私の例のように、ADO を使用して VBA で実行できます。

クエリ ビルダーの接続文字列プロパティはAccess以外のデータベース用であり、ソース データベースは mdw が同じ(またはない) Access データベース用であることに注意してください。異なるmdwsを持つ Access データベースの場合、私が認識している唯一の解決策は、以前に投稿した VBA の解決策です。

次に、接続文字列を SQL で直接使用する方法について説明します。これを行うことができます。ただし、いくつかの注意点があります。他の Access データベースでは機能しません。SQL サーバーの dbo テーブルを使用する場合は、クエリ ビルダーが生成する SQL を編集して「dbo」を削除する必要があります。プレフィックス。

最も簡単な方法は、私が言おうとしていることを説明することだと思います.

  1. 非アクセスデータベースへの有効な接続文字列を設定します。(エクセルファイルを使用するだけで、簡単にすることをお勧めします。)
  2. 文字列を取得したら、Access でクエリ ビルダーを開きます。
  3. テーブルの選択ダイアログを閉じます。
  4. Alt-Enter を押してクエリのプロパティを開きます。5a. 「Source Connect Str」に接続文字列を貼り付けます。*5b. 「ソース データベース」に他のデータベースへのパスを貼り付けます。
  5. 次に、テーブルを追加してクエリを作成します。
  6. SQL ビューに移動します。構築されたものを参照してください。

ただし、このアプローチは Access以外のデータベースでは有効ですが、 Access では機能しないため、ほとんど無関係です。(それは私が知っている少しイライラします。)

使用中の接続文字列の例:

SELECT [Sheet1$].F1
FROM [Sheet1$] IN '' [Excel 5.0;HDR=NO;IMEX=2;DATABASE=C:\Users\Oorang\Documents\Book1.xls];

OLE DB 接続文字列を IN データベース句に入れるのが有効な ACE/Jet 構文であるとは本当に思えません。

参考までに、上記のように接続文字列を使用しますが、Source Db プロパティを使用すると、以下のようになります:) (投稿する前にすべての例をテストしました:))

SELECT *
FROM Table1 IN 'C:\Users\Oorang\Documents\db2.mdb';
于 2009-05-20T18:44:20.423 に答える