在 C# 中使用 MS Access 查找字段

Posted

技术标签:

【中文标题】在 C# 中使用 MS Access 查找字段【英文标题】:Using an MS Access Lookup field in C# 【发布时间】:2015-10-06 18:10:51 【问题描述】:

我正在构建对现有 Access 数据库的扩展以及用 C# 编程的随附前端。最初的 Access 数据库设计得不是很好,当然也没有考虑到未来的扩展。为简单起见,假设遗留数据库有 2 个表:tblEmployee [empId(AutoNumber), empName(Text)] 和 tblProjects [prjId(AutoNumber), prjName(Text), prjEmps(Number/Lookup)]。两个表都有一个自动编号主键。 Projects 表有一个多值查找字段,允许用户将多个员工分配给一个项目。当我在 Access SELECT prjId, prjName, prjEmps FROM tblProject; 中查询 tblProjects 表时,prjEmps 字段列出了所有用逗号分隔的员工姓名。但是,问题是当我在 C# 中使用相同的查询时,prjEmps 返回一个数字的字符串版本,而不是员工的empId。我不确定它是否有区别,但我在 C# 中使用 System.Data.OleDbSystem.Data 命名空间。这是我的 C# 代码的要点:

    string connStr = @"Provider = Microsoft.ACE.OLEDB.12.0; " +
        @"Data Source=" + dbFilePath;
    string query = "SELECT prjId, prjName, prjEmps FROM tblProject;";
    OleDbConnection dbConn = new OleDbConnection(connStr);
    OleDbCommand Cmd = new OleDbCommand(query, dbConn);
    OleDbDataAdapter adp = new OleDbDataAdapter(query, dbConn);
    DataTable dt = new DataTable();
    adp.Fill(dt);
    dbConn.Close();
    foreach (DataRow row in dt.Rows)
    
        int prjId = row.Field<int>("prjId");
        string prjName = row.Field<string>("prjName");
        string prjEmps = row.Field<string>("prjEmps");
            MessageBox.Show("Project ID: " + prjId.ToString() + "\n" +
                            "Project Name: " + prjName + "\n" +
                            "Employees: " + prjEmps);
    

如果我能得到串联的名称列表,我会很高兴,但我更喜欢整数键数组等。有关如何解决此问题的任何想法?

【问题讨论】:

您可以尝试使用System.Data.Odbc 而不是System.Data.OleDb,看看是否有什么不同。 Access ODBC 驱动程序的行为有时与 OleDB 提供程序有些不同。 【参考方案1】:

使用 ODBC 提供程序,OLEDB 不支持多值查找字段,如果使用它读取多值查找字段会得到垃圾值,使用 ODBC 会得到“;”分隔值,然后可以拆分为单独的值或替换为“,”。

【讨论】:

以上是关于在 C# 中使用 MS Access 查找字段的主要内容,如果未能解决你的问题,请参考以下文章

在 MS Access 中查找哪个表单字段指向哪个数据库字段

如何将日期从 C# 存储到 MS-Access 以及如何检索它?

MS Access 在多个表的列字段中查找和替换文本

如何使用 MS Access 在 C# 中的两个日期之间进行搜索

如何在 C# 中获取 Ms Access 表的主键

在 Visual Studio 2013 中使用 MS Access (C#) 生成发票