我想在访问中使用多值以使用户更容易。
但是当使用将它读入 c# 时,oledb
我得到第一个值,然后是垃圾,使用columnname.value
得到多行完全相同的数据,只有那一列不同,这对我来说似乎是一种浪费。
有没有更好的办法?
我知道 sql 和 Oracle 不支持多值,但它会让用户更容易,所以如果可能的话我想保留它。
我想在访问中使用多值以使用户更容易。
但是当使用将它读入 c# 时,oledb
我得到第一个值,然后是垃圾,使用columnname.value
得到多行完全相同的数据,只有那一列不同,这对我来说似乎是一种浪费。
有没有更好的办法?
我知道 sql 和 Oracle 不支持多值,但它会让用户更容易,所以如果可能的话我想保留它。
已经很久了,但是你解决了这个问题吗?多值数据库可以但不需要将数据存储在多值属性中。
一种选择是在导出之前使用 BASIC 规范化 DBMS 中的数据,以关系工具(ADO.NET 等)可以理解的平面格式写入新的工作文件。
根据您用于从 DBMS 中提取数据的工具,您可能已经能够将多值记录标准化为数据集。此类工具的示例包括适用于 Universe 和 Unidata 的 UniObjects 或 U2.NET Toolkit、适用于 D3 和 mvBase 的 MVSP、适用于 QM 的 QMClient 以及适用于所有 MV 平台的 MVSP。
如果您必须导出多值,您可以对值标记 (xFD) 进行简单的拆分并将它们转换为字符串 [] 或列表。
正如您所说,RDBMS/SQL 工具不支持多个值。因此,要将这些数据转换为关系/规范化格式,您要么需要创建具有某些数据重复的多条记录,要么创建另一个表并使用外键连接到它。这是各种产品用来使 MV 看起来具有关联性的一种技术。例如,您将有一个 Customer 记录指向一个 CustomerPhones 表,该表为该客户的每部电话都有一个记录......当它们最初只是您的单个客户记录中的多值时。
有没有更好的办法?
是: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
然后可以将其拆分为分号 ( ;
) 字符并进行适当处理。
使用 msdatashape 提供程序。这提供了一个 ; 分隔列表。示例连接字符串:Provider=MsDataShape;Data Provider=Microsoft.ACE.OleDb.12;Data Source=(Your Path)