1

それぞれが数百のマクロクエリなどを含むいくつかのMSAccess2007データベースを文書化する必要があり、C#でプロセスを自動化したいと思います。すべての.mdbファイルについて、myfirstの目標は、スキーマ情報(テーブル、フォーム、マクロ、クエリ名と定義)を抽出することです。

OleDBを使用して次のコードを使用して、ユーザーが使用できるすべてのテーブルのリストを取得しています。

 private static List<String> getTableNames(OleDbConnection db)
 {
        List<String> tableList = new List<String>();
        DataTable schemaTable;
        try
        {
            object[] objArrRestrict = new object[] { null, null, null, "TABLE" };
            schemaTable = db.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,objArrRestrict);
            foreach(DataRow row in schemaTable.Rows) tableList.Add((String)row["TABLE_NAME"]);
        }
        catch(Exception e) {
            Console.WriteLine(`"Table Name Querying Failed. Returning Empty List"`);
            Console.WriteLine(e.Message);
        }
        return tableList;
    }

同様の方法を使用している列については、次のように前の方法を単純にフィードします。

object[] objArrRestrict = new object[] { null, null, tableName, null };
schemaCols = db.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, objArrRestrict);
foreach (DataRow row in schemaCols.Rows) tableList.Add((String)row["COLUMN_NAME"]);

マクロ情報(名前と定義)の取得方法はよくわかりませんが、調査の結果、以下を使用してクエリ情報を取得することにしました。

object[] objArrRestrict = new object[] { null, null, null, null };
schemaCols = db.GetOleDbSchemaTable(OleDbSchemaGuid.Procedures, objArrRestrict);

ただし、コードの最後のビットを実行すると、非常に漠然とした言葉で書かれたエラーメッセージが表示されます。

The SQL statement could not be executed because it contains ambiguous outer joins. To force one of the joins to be performed first, create a separate query in your SQL statement.

さらに調査した後、getTableNamesメソッドを変更して、「VIEWS」制限を介してクエリを取得しましたが、データベースに格納されているSELECTクエリのみが取得され、格納されているINSERT、UPDATE、およびDELETEクエリも必要です。

最後に、次のコードを使用してMsysObjectsテーブルを直接クエリしています。

String cmdString; 
OleDbCommand queries = new OleDbCommand(cmdString,db);
OleDbDataReader reader = queries.ExecuteReader();

次の2つのcmdStringを同じ意味で使用します。

SELECT MSysObjects.Name FROM MsysObjects WHERE(Left $([Name]、1)<> "〜")AND(MSysObjects.Type)= 5 ORDER BY MSysObjects.Name

また

SELECT Name FROM MSysObjects WHERE(Name Not Like "" MSys * "")AND(Type In(1,4,6))ORDER BY Name

この場合も、両方の文字列で同じ「あいまいな外部結合」エラーが発生します。

このタイプのエラーについて少し読んだことがあります。一般的な推奨事項は、元のクエリを複数のクエリに分割することですが、ライブラリ関数を使用してこのスキーマデータを取得しているため、正確にどの程度かわかりません。それをやろうとしています。私はすでにこれを研究するために何日も費やしました、そして私は私の機知に富んでいます。誰かがこの問題について私を助けてくれるか、この障害を回避するための何らかの方法を私に教えてくれるなら、私は本当に感謝しています。

4

1 に答える 1

0

このようにグループ化するとどうなりますか?

SELECT 
Name 
FROM 
MSysObjects 
WHERE 
Name Not Like 'MSys*'
AND 
Type In (1,4,6)
ORDER BY Name

またはこれ

SELECT 
Name 
FROM 
MSysObjects 
WHERE 
(
(Name Not Like ""MSys*"") 
AND 
(Type In (1,4,6))
)
ORDER BY Name
于 2012-08-01T01:41:39.823 に答える