Сохранение порядка строк MS Access при использовании DataAdapter.Fill в 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 для сохранения порядка?
2 ответа
Fill()
метод DataAdapter
эквивалентно ExecuteReader(CommandBehavior.Default)
так что вы ничего не получите, когда речь заходит о сохранении порядка одним или другим методом.
CommandBehavior
перечисление, по-видимому, не дает никакой возможности явно указать, что таблица должна читаться в естественном порядке.
Я нахожу это запутанным, хотя это DataAdapter.Fill
следует изменить порядок естественного порядка данных, хранящихся в базе данных.
РЕДАКТИРОВАТЬ: Подробнее о естественном порядке
Есть ли какие-либо индексы, определенные в вашей таблице? MS Access покажет данные в таблице, упорядоченные по любым заданным индексам, и, следовательно, не сохранит естественный порядок при визуализации данных (порядок вставки).
С другой стороны,.Fill() будет сохранять естественный порядок независимо от того, какие индексы определены в исходной таблице, поэтому то, что вы можете считать не читающим в естественном порядке, может быть связано с индексом в исходной таблице, а не с проблемой в Fill()
метод.
Я сделал несколько быстрых тестов, и во всех них DataAdapter
возвращает строки, сохраняя естественный порядок.
В реляционной базе данных нет такого понятия, как "естественный порядок".
Существует тот факт, что Jet/ACE хранит таблицы с первичным ключом, кластеризованным на ПК, но это не то же самое, что кажется, что вы определяете "естественный порядок", так как PK может привести к тому, что записи, не вставленные в порядок PK, будут отображаться в другом месте.
Таблица без PK просто не принадлежит ни к одной базе данных, поскольку к ней нельзя надежно обращаться и манипулировать с помощью SQL. Конечно, это можно сделать, но это ошибка.
Я думаю, вам нужно переосмыслить то, что вы пытаетесь сделать. Вы, кажется, зависите от причудливых вещей, которые просто иногда работают для вашего заказа. Если этот порядок важен, вы должны структурировать свои данные так, чтобы их можно было упорядочить таким образом.