それぞれが数百のマクロクエリなどを含むいくつかの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
この場合も、両方の文字列で同じ「あいまいな外部結合」エラーが発生します。
このタイプのエラーについて少し読んだことがあります。一般的な推奨事項は、元のクエリを複数のクエリに分割することですが、ライブラリ関数を使用してこのスキーマデータを取得しているため、正確にどの程度かわかりません。それをやろうとしています。私はすでにこれを研究するために何日も費やしました、そして私は私の機知に富んでいます。誰かがこの問題について私を助けてくれるか、この障害を回避するための何らかの方法を私に教えてくれるなら、私は本当に感謝しています。