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

Posted

技术标签:

【中文标题】从访问中读取多值列到c#【英文标题】:reading multi valued columns from access into c# 【发布时间】:2013-09-13 11:58:09 【问题描述】:

我想在访问中使用多值以使用户更容易。

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

有没有更好的办法?

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

【问题讨论】:

【参考方案1】:

有没有更好的办法?

是: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

然后可以在分号 (;) 字符上拆分并进行适当处理。

【讨论】:

太棒了,谢谢@Gord。不过为时已晚,整个访问的想法都被废弃了。 :( @AngelicCore 哦,好吧,至少这个问题可能会帮助下一个人。无论如何,感谢您接受答案。【参考方案2】:

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

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

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

如果您必须导出多值,您可以对值标记 (xFD) 进行简单的拆分并将它们转换为字符串 [] 或列表。

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

【讨论】:

很遗憾,我放弃了这个想法,因为它没有任何结果。 如果你又拍了 MV,请告诉我。根据您的平台、位置和其他因素,有大量资源可用于执行此类操作。您并不孤单,但此查询已发布到此处的 MV 人员不常光顾的站点。现在开始改变了。【参考方案3】:

使用 msdatashape 提供程序。这提供了一个 ;分隔列表。示例连接字符串:Provider=MsDataShape;Data Provider=Microsoft.ACE.OleDb.12;Data Source=(Your Path)

【讨论】:

以上是关于从访问中读取多值列到c#的主要内容,如果未能解决你的问题,请参考以下文章

在多值列中查找值

Bigquery 表嵌套多值列在查询时出错

如何使用类型化数据集将多值列拆分为单独的行?

Pandas 数据框:如何按多值列将一行拆分为多行? [复制]

使用类型在过程的输入参数中传递多值

如何检查多值字段是不是包含值 MS Access