从访问到 C# 中读取多值列

本文关键字:读取 访问 | 更新日期: 2023-09-27 18:31:08

我想在访问中使用多值,以使用户更轻松。

但是当使用oledb将其读入 c# 时,我得到第一个值,后跟垃圾使用columnname.value可以让我获得多行完全相同的数据,只有该列不同,这对我来说似乎是一种浪费。

有没有更好的方法?

我知道sql和Oracle不支持多值,但它会使用户更容易,所以如果可能的话,我想保留它。

从访问到 C# 中读取多值列

有没有更好的方法?

是:ODBC。

在处理多值字段(由 Access 中的"查找向导"创建)时,Odbc似乎比OleDb做得更好。对于名为 [multiValueTest] 的表中的测试数据

+----+-------------+------------+
| ID | Description | Attributes |
+----+-------------+------------+
|    |             | attribute1 |
|  1 | foo         | attribute2 |
|    |             | attribute4 |
+----+-------------+------------+

查询

SELECT Attributes FROM multiValueTest WHERE ID=1
确实在由

OleDbDataReader 对象检索时返回垃圾字符。

但是,OdbcDataReader对象检索到的相同查询,特别是

using (OdbcConnection con = new OdbcConnection())
{
    con.ConnectionString =
            @"Driver={Microsoft Access Driver (*.mdb, *.accdb)};" +
            @"Dbq=C:'Users'Public'Database1.accdb;";
    con.Open();
    using (OdbcCommand cmd = new OdbcCommand())
    {
        cmd.Connection = con;
        cmd.CommandText = "SELECT Attributes FROM multiValueTest WHERE ID=1";
        OdbcDataReader rdr = cmd.ExecuteReader();
        rdr.Read();
        Console.WriteLine(rdr[0]);
        rdr.Close();
    }
    con.Close();
}

返回如下所示的单个字符串值

attribute1;attribute2;attribute4

然后可以拆分为分号(;)字符并适当处理。

已经

很久了,但你解决了这个问题吗?多值数据库可以但不需要在多值属性中存储数据。

一种选择是在导出之前使用 BASIC 规范化 DBMS 中的数据,以关系工具(ADO.NET 等)可以理解的平面格式写入新的工作文件。

根据用于从 DBMS 中提取数据的工具,您可能已经能够将多值记录规范化为数据集。此类工具的示例包括 UniObjects 或 U2.NET Toolkit for Universe and Unidata、MVSP for D3 和 mvBase、QM QMClient 以及所有 MV 平台的 MVSP

如果必须导出多值,则可以对值标记 (xFD) 执行简单的拆分,并将其转换为字符串 [] 或 List。

正如你所说,RDBMS/SQL工具不支持多个值。因此,要将这些数据移动到关系/规范化格式,您需要创建具有一些数据重复的多个记录,或者创建另一个表并使用外键连接到它。这是各种产品用来使MV看起来具有关系的一种技术。例如,您将有一个客户记录,该记录指向一个客户电话表,该表为该客户的每部电话都有一条记录...当它们最初只是单个客户记录中的多值时。

使用 msdatashape provider。 这将提供一个 ;分隔列表。 示例连接字符串:提供程序=MsDataShape;数据提供程序=Microsoft.ACE.OleDb.12;数据源=(您的路径)