从访问c#中读取多值列

时间:2013-09-13 11:58:10

标签: c# ms-access odbc oledb ms-jet-ace

我想在访问中使用多值,以方便用户使用。

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

有更好的方法吗?

我知道sql和Oracle都不支持多个值,但它会让用户更容易,所以我希望尽可能保留它。

3 个答案:

答案 0 :(得分:1)

已经很长时间但你解决了这个问题吗? MultiValue数据库可以但不需要将数据存储在多值属性中。

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

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

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

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

答案 1 :(得分: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

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

答案 2 :(得分:0)

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