如果我尝试读取Access 2013数据库的架构,则会收到以下错误:
no read permission on 'MSysRelationships'
现在帮助告诉我
User-level security features are not available in Access apps, web databases,
or databases that use one of the new file formats (.accdb, .accde, .accdc, .accdr).
=>如何阅读该DB的架构?
编辑:
这是我在Linqpad中的代码:
var stringBuilder = new OleDbConnectionStringBuilder();
stringBuilder.Provider = "Microsoft.ACE.OLEDB.12.0";
stringBuilder.DataSource = @"C:\Recommendations.accdb";
using (var connection = new OleDbConnection(stringBuilder.ToString().Dump()))
{
connection.Open();
var schemaTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] {null, null, null, "TABLE"});
var sheetName = schemaTable.AsEnumerable().Select(row => row.Field<string>("TABLE_NAME")).First();
schemaTable.Dump();
string namesQuery = "SELECT DISTINCT szRelationship, szReferencedObject, szObject FROM MSysRelationships";
string namesQuery2 = string.Format("select Name, Age from [{0}]", "Users");
using (var command = new OleDbDataAdapter(namesQuery, connection))
{
var dataSet = new DataSet();
command.Fill(dataSet, sheetName);
dataSet.Dump();
}
connection.Close();
}
答案 0 :(得分:1)
根据对类似早期问题here的回复判断,我怀疑您无法通过OleDb连接直接读取Access中的系统表。但是,您可以通过OleDbConnection.GetSchema
方法获取所需信息(详情here)。
答案 1 :(得分:1)
在“连接”字符串中,设置“用户ID =管理员”。
使用Access打开数据库,使用Ctrl-G获取“立即”窗口,然后执行以下命令:
CurrentProject.Connection.Execute "GRANT SELECT ON MSysRelationships TO Admin;"
这将赋予“用户ID”从该表读取(SELECT)的权限。 这同样适用于其他系统表,例如'MSysObjects'。