我必须记录几个MS Access 2007数据库,每个数据库都有数百个宏查询等,我想在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();
可互换地使用以下两个cmdStrings:
SELECT MSysObjects.Name FROM MsysObjects WHERE(Left $([Name],1)&lt;&gt;“〜”)AND (MSysObjects.Type)= 5 ORDER BY MSysObjects.Name
或
SELECT名称来自MSysObjects WHERE(名称不喜欢“”MSys *“”)AND(输入(1,4,6))ORDER BY Name
同样,两个字符串也会导致相同的“模糊外连接”错误。
我已经阅读了一些关于此类错误的内容,我知道一般的建议是将原始查询分解为多个查询但是因为我正在使用库函数来获取此架构数据,所以我不是确定如何做到这一点。我已经花了几天时间研究这个问题而且我的智慧已经结束了。如果有人可以帮我解决这个问题,或者指出我想回避这个障碍,我会非常感激。
答案 0 :(得分: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