1

这是一个棘手的问题......我在查询我的代码时注意到,当我使用如下所示的 .NET DataAdapter.Fill 方法查询 Access 数据库时,记录的顺序不是记录的“自然”顺序(因为它们最初被插入到表中)。

OleDbDataAdapter oleDbAdapter = new OleDbDataAdapter("SELECT * FROM SomeTable ", oleDbConnection);
oleDbAdapter.Fill(sourceData, "SomeTable" );
foreach(DataRow theRow in sourceData.Tables["SomeTable"].Rows)
{ ... }

在一张桌子上,我有一个主键,所以我只能按主键排序。我有一个没有任何主键的新表,我想查询该表并按自然表顺序对记录进行排序。我应该使用 OleDbDataReader 来保留订单,还是有办法让 OleDbDataAdapter.Fill 方法来保留订单?

4

2 回答 2

1

a的Fill()方法DataAdapter等效于,ExecuteReader(CommandBehavior.Default)因此在使用一种方法或另一种方法来保持顺序时,您将不会获得任何收益。

显然,CommandBehavior枚举没有给出任何选项来明确指定表应该以自然顺序读取。

我觉得这很令人困惑,尽管这DataAdapter.Fill应该重新排序存储在数据库中的数据的自然顺序。

编辑:更多关于自然秩序

您的表中是否定义了任何索引?MS Access 将显示按任何定义的索引排序的表中的数据,因此在可视化数据时不会保留自然顺序(插入顺序)。

另一方面, .Fill()保留自然顺序,无论源表中定义了什么索引,因此您可能认为未按自然顺序读取的可能是由于源表中的索引而不是源表中的问题Fill()方法。

我做了一些快速测试,所有测试都DataAdapter 返回保留自然顺序的行。

于 2011-06-20T16:29:19.847 回答
0

关系数据库中没有“自然顺序”之类的东西。

事实是 Jet/ACE 存储具有聚集在 PK 上的主键的表,但这与您定义“自然顺序”的方式不同,因为 PK 可能会导致未按 PK 顺序插入的记录出现别处。

没有 PK 的表根本不属于任何数据库,因为它不能通过 SQL 可靠地访问和操作。当然可以,但这是一个错误。

我认为你需要重新考虑你想要做什么。您似乎依赖于在您的演示文稿订单中偶尔会起作用的古怪事物。如果该顺序很重要,那么您必须对数据进行结构化,以便以这种方式对其进行排序。

于 2011-06-21T00:15:42.610 回答