使用DataAdapter时保留MS访问行顺序.填写C#



这里有一个棘手的问题。。。我在对代码的查询中注意到,当我使用如下所示的.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方法来保存订单?

DataAdapterFill()方法等效于ExecuteReader(CommandBehavior.Default),因此在使用一种或另一种方法来保持顺序时,您不会获得任何好处。

显然,CommandBehavior枚举没有提供任何选项来明确指定应按自然顺序读取表。

然而,我发现DataAdapter.Fill应该对存储在数据库中的数据的自然顺序进行重新排序是令人困惑的。

编辑:关于自然顺序的更多信息

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

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

我做了一些快速测试,在所有这些测试中,DataAdapter都是返回保持自然顺序的行

在关系数据库中没有"自然顺序"这回事。

事实上,Jet/ACE存储的表具有聚集在PK上的主键,但这与定义"自然顺序"的方式不同,因为PK可能会导致未按PK顺序插入的记录显示在其他地方。

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

我认为你需要重新思考你想做什么。你似乎依赖于一些奇怪的事情,而这些事情在某些时候恰好对你的演讲顺序有效。如果该顺序很重要,那么您必须对数据进行结构化,以便以这种方式对其进行排序。

相关内容

  • 没有找到相关文章

最新更新