我想使用 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 数据库引擎工作组信息文件。”
好的,第一步是设置工作连接。
因此,在项目中,我们添加一个与 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 位版本,否则按照上述创建连接时的测试连接按钮将不起作用访问权限。
因此,请按照上述步骤操作,并设置一个连接,以便您可以在整个应用程序中使用。