没有MSysObject错误的读取权限

时间:2014-01-20 13:32:08

标签: c# ms-access oledb

我正在尝试通过OleDb连接到MS Access数据库(.mdb)。我的问题是

SELECT * FROM ListQueries

提取错误

  

SQL执行错误。

     

执行的SQL语句:SELECT * FROM ListQueries   错误源:Microsoft JET数据库引擎   错误消息:无法读取记录;没有'MSysObjects'的读取权限。

然后我尝试this answer,但没有帮助。然后我看到另一个答案说要做到这一点。

strDdl = "GRANT SELECT ON MSysObjects TO Admin;"
CurrentProject.Connection.Execute strDdl

我不知道如何在web project中实现这一点。根据{{​​3}}

的建议写了这样的东西
  

或者,如果从OleDb连接到Access db

运行它,它应该从c#开始工作

代码是,

OleDbConnection con;
using (con = new OleDbConnection(Connection.connectionString()))
{
    con.Open();
    using (var com = new OleDbCommand("GRANT SELECT ON MSysObjects TO Admin", con))
    {
        com.ExecuteNonQuery();
    }
    using (var com = new OleDbCommand("Select * from ListQueries", con))
    {
        using (var dr = com.ExecuteReader())
        {
            while (dr.Read())
            {
                qryList.Add(SQLReaderExtensions.SafeGetString(dr, "Name"));
            }
            dr.Close();
        }
    }
    con.Close();
}

第一个com.ExecuteNonQuery()给了我这个错误。

  

无法打开Microsoft Jet引擎工作组信息文件。

我真的很想知道如何授予OleDb调用工作的权限。任何建议都会很精彩

P.S:顺便说一下,我正在使用MS Access 2010。

1 个答案:

答案 0 :(得分:8)

我强烈建议您不要使用MS Access系统对象。还有其他更好的方法来获取信息。

您可以选择ADO和DAO。你更喜欢哪个?请注意,在ADO中,action(adSchemaProcedures)和select查询(adSchemaViews)之间存在差异。

例如,

public static List<string> GetAllQueriesFromDataBase()
{
    var queries = new List<string>();
    using (var con = new OleDbConnection(Connection.connectionString()))
    {
        con.Open();
        var dt = con.GetSchema("Views");
        queries = dt.AsEnumerable().Select(dr => dr.Field<string>("TABLE_NAME")).ToList();
    }

    return queries;
}