在C#中使用DataAdapter.Fill时保留MS Access行顺序

时间:2011-06-20 16:19:09

标签: c# ms-access oledbdatareader

这是一个棘手的问题...我在查询代码时注意到,当我使用.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方法保留订单?

2 个答案:

答案 0 :(得分:1)

Fill()的{​​{1}}方法相当于DataAdapter,因此在使用一种方法或另一种方法保留顺序时,您将无法获得任何收益。

ExecuteReader(CommandBehavior.Default)枚举显然没有给出任何选项来明确指定应该按自然顺序读取表。

虽然CommandBehavior应重新排序DataBase中存储的数据的自然顺序,但我觉得很困惑。

编辑:更多关于自然顺序

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

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

我做了一些快速测试,其中Fill() 返回保留自然顺序的行。

答案 1 :(得分:0)

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

事实上Jet / ACE存储的表格中存在一个主键密集在PK上,但这与您似乎定义“自然顺序”的方式不同,因为PK可能导致未按PK顺序插入记录出现在其他地方。

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

我认为你需要重新思考你想要做的事情。你似乎依赖于古怪的东西,恰好在你的演示文稿订单上有时间工作。如果该顺序很重要,那么您必须构建数据,以便以这种方式对其进行排序。