“表”没有读取权限 - OleDb 和 Microsoft Access 数据库

问题描述 投票:0回答:1

我想使用 C# 获取存储在 Access 数据库中的一些信息。

这是我的代码:

using System.Data.OleDb;

OleDbConnection connection = new OleDbConnection(
       @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\tmp\bch\data.mdb;Persist Security Info=False"
);

connection.Open();

OleDbCommand command = new OleDbCommand("SELECT DesignId from Design WHERE Design='Bamboo'", connection);
OleDbDataReader reader = command.ExecuteReader();
int? id = null;
while (reader.Read())
{
   id = int.Parse(reader[1].ToString()!);
}

connection.Close();

我尝试连接 OleDbConnection,它工作得很好,但我无法从数据库获取任何数据,我总是收到以下错误:

System.Data.OleDb.OleDbException:'无法读取记录;没有“设计”的读取权限。'

我可以手动打开.mdb文件并查看数据,但是如果我使用同一用户执行代码,它就不起作用...

在某些线程中,我看到了首先将选择命令授予用户的解决方案,如下所示:

OleDbCommand grantCommand = new OleDbCommand("GRANT SELECT ON TABLE Design TO Admin", connection);
grantCommand.ExecuteNonQuery();

不幸的是,这引发了另一个异常,我不知道该怎么办......

System.Data.OleDb.OleDbException:“无法打开 Microsoft Access 数据库引擎工作组信息文件。”

c# database ms-access oledb
1个回答
0
投票

好的,第一步是设置工作连接。

因此,在项目中,我们添加一个与 Access 数据库的新连接。

也不太清楚为什么使用 mdb 代替 accDB 文件,但是 mdb 文件格式应该可以工作,但是非常“旧”的 mdb 文件通常无法被 ACE 数据引擎读取/使用,并且您有选择+使用JET数据引擎。

因此,在项目设置中,添加一个新连接。

不要忘记在上面点击“高级”按钮,因为您想要选择(或检查并验证)是否选择了 ACE 来代替 JET。但是,如前所述,对于 mdb 文件,您可以使用 JET,但现在让我们使用 ACE 数据引擎。

因此,点击上面的“高级”,我们可以查看(并检查)是否选择了 ACE 数据引擎。

因此,在高级选项卡上,检查此设置:

您还会注意到,我没有使用测试连接按钮。原因是我使用的是vs2022,vs2022是x64位产品,但我的office/Access安装的是x32位版本的office。

您必须设置 .net 项目的位大小并使其与您已安装的 Office/Access 版本的位大小相匹配。

所以,这就是这个设置:

因此您不能(不应该)使用任何 CPU,并且您必须强制项目与您正在使用的 Access 的位大小相匹配。

好的,通过上述设置,我们现在可以说提取一些数据了。

(在尝试更新某些数据之前,我会先测试提取一些数据)。

因此,一个带有按钮和 DataGridView 的表单。

我们得到了这个结果:

请注意,如果您使用 vs2022 之前的 Visual Studio 版本,则测试连接按钮将起作用,但在 vs2022 中,除非您运行/使用 x64 位版本,否则按照上述创建连接时的测试连接按钮将不起作用访问权限。

因此,请按照上述步骤操作,并设置一个连接,以便您可以在整个应用程序中使用。

© www.soinside.com 2019 - 2024. All rights reserved.