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

migrating an access multi valued field column to c#

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

Wells
________
345,456,7
6,387

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

我很难获取数据 reader 来选择它。

使用

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

导致错误

The provider could not determine the Object value. For example, the row was just created, the default for the Object column was not available, and the consumer had not yet set a new Object value.

好吧,在一天结束时,您可以将 mutli-value 列实际上视为 child table.

所以,如果你想迁移一个 master 和 child table,那么在你的数据库中,你需要一组 table 到 re-create 什么Access 正在幕后进行。

所以,让我们举一个 multi-value 例子和查询。

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

SELECT ID, Person_Name, FavorateColors FROM tPerson;

但是,“最喜欢的颜色”是那些 MV 栏目之一。 (我应该指出 no-sql 数据库的巨大变化 - 它们也经常以这种方式工作 - 对于 XML 或 JSON 数据也是如此。然而,无论是一些 XML、JSON 或访问 mutli-value 功能?嗯,如果您要采用关系数据模型来表示此数据,则需要 child table。

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

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

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

将上面的查询改为:

SELECT ID, Person_Name, FavorateColors.Value FROM tPerson

请注意我们是如何在 MV 列名称后添加“.value”的。现在,当您 运行 查询时,您会得到相同的结果,就好像您有两个 table 并且进行了左连接。 parent table 行将像任何关系数据库一样简单地重复每个 child table 值,你会得到这个:

请注意现在 PK 值和行对于每个 child mv 值是如何重复的。

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

所以,就像 XML、JSON,或者实际上是一个查询或 table 具有重复 parent 行和 child 的数据行?好吧,您非常被迫编写代码来拆分这些数据,或者 re-normalize 数据。这当然在接收 JSON/XML 数据时更为常见,或者实际上经常说来自 Excel sheet.

的数据

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

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

那么,假设我们要处理这些数据?您处理它的方式与处理您拥有的任何数据一样,这些数据首先应该是两个相关的 table。

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

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

的 PK 值