Вопрос об обновлении OleDbDataAdapter

У меня есть 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");

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

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


person David Božjak    schedule 27.02.2009    source источник


Ответы (2)


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

SELECT * FROM Table_Name WHERE 1=2

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

person Rune Grimstad    schedule 27.02.2009

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

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

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

person Cerebrus    schedule 27.02.2009
comment
Что ж, я уверен, что это сработает, но это бесполезно, так как я не хочу сам писать оператор InsertCommand. Также я хотел бы вызвать метод fill, с тех пор я мог бы использовать DataSet для обновления таблицы. Если что-то мне не хватает, дайте мне знать. - person David Božjak; 27.02.2009