OleDbDataAdapter Обновить вопрос - PullRequest
0 голосов
/ 27 февраля 2009

У меня есть DataTable с большим количеством строк (более ста миллионов), и я пишу приложение, которое необходимо вставить в эту таблицу.

Я буду использовать OleDbDataAdapter для этой работы, и я озадачен, каков наилучший способ сделать это. Мне нужно только вставить в эту огромную таблицу, однако я не хочу жестко кодировать оператор вставки в приложение.

Я подумал, что смогу использовать

OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.SelectCommand = new OleDbCommand("select * from table_name");
OleDbCommandBuilder cb = new OleDbCommandBuilder(adapter);
...
adapter.Fill(data_set_name, "Table_name");

Но это было бы действительно плохо , так как мне не нужны / не нужны данные, а использование памяти было бы ужасным. Мне было интересно, если бы я мог изменить SelectCommand с помощью TOP? Это будет выглядеть так:

adapter.SelectCommand = new OleDbCommand("select TOP 1 * from table_name");

Теперь команда Fill будет очень быстрой, и у меня будут данные, необходимые для всех будущих операторов вставки. Я мог бы добавить строки в datatable, а затем просто вызвать

adapter.Update(data_set_name, "Table_name");

Будет ли это работать? И это действительный / рекомендуемый способ сделать это? Очень важно, чтобы приложение работало быстро и использовало только необходимые ресурсы. Есть ли лучший способ сделать это?

Спасибо за ваш вклад!

Ответы [ 2 ]

1 голос
/ 27 февраля 2009

ИМО, лучший способ будет:

  1. Используйте метод OleDbDataAdapter.FillSchema(data_set_name, SchemaType.Source) для создания DataTable со структурой, сопоставленной с источником данных. По сути, вы пытаетесь сделать то же самое, потянув одну строку в операторе Select. Ваше утверждение Select в этом случае может остаться "select * from table_name". Я считаю, что вам не нужно вызывать метод OleDbDataAdapter.Fill сейчас.

  2. Вместо использования CommandBuilder создайте заявление InsertCommand самостоятельно.

1 голос
/ 27 февраля 2009

Если вам не нужны данные, вы можете изменить команду выбора на

SELECT * FROM Table_Name WHERE 1=2

Тогда вы не получите никаких строк назад

...