将访问多值字段列迁移到 C#

问题描述

我正在尝试使用 Microsoft.ACE.OLEDB.12.0 驱动程序从访问数据库读取数据。遇到了一个奇怪的情况。 access 数据库中的一列显示为逗号分隔的 ID 列表。

Wells
________
345,456,7
6,387

当我查看 access 中的列定义时,我以为它会显示字符串,但它不会显示,它显示的是数字。所以我猜它是在单列中存储一个整数数组?

我很难找到数据阅读器。

使用

var w = DB_Reader.GetValue(DB_Reader.Getordinal("Wells"));

导致错误

提供者无法确定对象值。例如, 行刚刚创建,对象列的认值不是 可用,并且消费者尚未设置新的 Object 值。

解决方法

好吧,归根结底,您可以将多值列视为实际上是一个子表。

因此,如果您希望迁移主表和子表,那么在您的数据库中,您需要一组关系表来重新创建 Access 在幕后所做的工作。

那么,让我们举一个多值示例和查询。

假设我们在 Access 中有这个 sql 查询:

SELECT ID,Person_Name,FavorateColors FROM tPerson;

但是,“最喜欢的颜色”是那些 MV 专栏之一。 (我应该指出,朝着 no-sql 数据库的巨大发展——它们也经常以这种方式工作——对于 XML 或 JSON 数据也是如此。但是,是一些 XML、JSON 还是 Access 多值功能?嗯? ,如果您要采用关系数据模型来表示此数据,则需要该子表。

好的,所以我们运行上面的查询,你会得到这个输出:

enter image description here

事实上,当我使用查找向导时 - 我选择了一个名为 tblColors 的子表。

但是,我们如何分解上面的查询来挖掘数据?

将上面的查询改成这样:

SELECT ID,FavorateColors.Value FROM tPerson

注意我们如何在 MV 列名称后添加“.value”。现在,当您运行查询时,您会得到相同的结果,就像您有两个表并执行左连接一样。父表行会像任何关系数据库一样对每个子表值简单重复,你会得到:

enter image description here

注意现在每个子 mv 值的 PK 值和行是如何重复的。

因此,您可以按照上述方式自由地进行查询 - 您会得到相当于左连接表的内容,当然父记录会重复。

那么,就像 XML、JSON 一样,或者实际上是具有重复父行和子行的查询或数据表?好吧,您不得不编写代码来拆分这些数据,或重新规范化数据。这当然在接收 JSON/XML 数据时更常见,或者实际上通常是从 Excel 工作表接收数据。

因此,您必须处理子记录数据,并为该数据创建关系。

因此现在我们的问题变成了如何导入真正应该使用两个关系数据库表的 JSON/XML/Excel 数据。

那么,假设我们要处理这些数据?您可以像处理任何本来应该是两个相关表的数据一样处理它。

这真的取决于这是一次性导入,还是您必须一直这样做?

如果是一次性交易,那么我会使用 Access,并使用基于上述查询的 make table 查询。实际上,您必须从子表中提取 PK ID。在上面有一个名为颜色的子表 - 我们只是在自动创建的 Access 之间缺少那个“连接”表。隐藏的表没有暴露,因此我会简单地在访问中使用一个制作表查询,然后添加一个 FK 列,它是 tblColors 的 PK 值。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...