В настоящее время я пытаюсь импортировать текстовый файл с разделителями с запятой в базу данных на C#, используя OleDb, где я не знаю тип (SQL Server, Access, Oracle, MySQL, postgreSQL и т. д.). В настоящее время я читаю в файл в качестве базы данных с помощью средства чтения текста Jet, затем создает подготовленный оператор вставки, заполняет поля и в конце фиксирует. Хотя это работает, это медленно и занимает слишком много времени для миллионов строк.
Итак, мой вопрос: есть ли у кого-нибудь другие мысли о том, как лучше всего импортировать текстовый файл в общую базу данных, или комментарии к моим подходам, которые приведут к более быстрому импорту?
Я не могу использовать сторонние библиотеки или программное обеспечение для этого, поскольку это часть более крупного проекта.
Я пытаюсь найти лучший способ получить данные из текста в базе данных, тип которой я не знаю. Если слияние - лучший способ, как это сделать без ключа.


Лучше всего купить готовое приложение для этого.
Профессиональные готовые приложения используют собственные драйверы и точно настраиваются для каждого типа источника данных, с которым они столкнутся. Это всегда под прикрытием, поэтому вы не видите, как они это делают. Например, массовое копирование используется против SQL Server; У Oracle есть Data Pump.
Проблема с развертыванием собственного заключается в том, что вы можете либо потратить деньги на точную настройку своего приложения для работы с каждым из типов источников, с которыми вы, вероятно, столкнетесь, либо сильно снизите производительность, используя общие драйверы ODBC / ADO / Whatever. .
В конце концов, вам лучше либо исключить это из своего продукта, либо просто иметь дело с неизбежным медленным подходом, который вы вынуждены использовать. В данном случае это означает использование отдельных операторов вставки для всего.
Итак, сколько у вас денег на ресурсы для разработки?
К сожалению, это зелье гораздо более крупной программы, так что это не вариант.
См. Мой комментарий к Irongoofy, я на самом деле делаю это, но это уловка, и я пытаюсь сделать это быстрее
Попробуй это
http://filehelpers.sourceforge.net
.... зачем вам загружать базу данных в набор данных? Попросите другую базу данных отслеживать уникальность (если есть такое слово). Во время импорта проверьте, существует ли в базе данных журналов, если нет, то загрузите в Generic Database.
Подождите, пока не появятся другие ответы на эту тему, возможно, мы получим лучшее представление.
Я хочу загрузить оба в базу данных, чтобы они были одного формата, конечной целью было бы загрузить текст в набор данных, скопировать его в набор данных db, а затем вставить эти данные в базу данных.
Не совсем элегантно, но производительность может быть лучше:
Пока вы все еще вставляете каждую строку по отдельности, вы не создадите такой большой сетевой трафик.
Чтобы уточнить, исходный метод генерирует операторы на клиенте, а затем выполняет их на клиенте, что приводит к сетевому трафику для каждой строки. Я предлагаю сгенерировать операторы на сервере (в хранимой процедуре) и выполнить их на сервере, не создавая нового сетевого трафика.
«Правильным» решением было бы использовать специальный инструмент импорта для базы данных (например, SQL Loader для Oracle). Прирост производительности огромен. (Мы загружаем огромные таблицы с 20 миллионами строк примерно за 5 минут). Но, конечно, это не очень типично.
Верно, это было бы «правильным» решением, и это действительно то, что я делаю, но мне нужен универсальный инструмент, который работает со всеми базами данных в случае возникновения ошибки или отсутствия поддержки. Похоже, ваше недовольство составляет прибл. чем я сейчас занимаюсь, вы можете указать на различия?
Подготовленные операторы и сохраненные запросы выполняются в этом контексте одинаково. Хотя оператор создается на клиенте, как только выполняется Prepare (), он обрабатывается как сохраненный запрос на сервере.
Что ж, мне удалось получить строки текстового файла в наборе данных базы данных, и пока этот метод кажется более быстрым. я использовал
Dataset.Tables[x].ImportRow(DataRow)
Конечно, теперь нужно просто заставить DataAdapter.Update (Dataset) работать. Будет весело искать в Интернете ...
Обновлять
Этот метод не дает более быстрых результатов, поскольку команда DataAdapter.Update выполняет построчную вставку.
НАСОСНАЯ ВСТАВКА dbo.ImportTest ОТ 'C: \ ImportData.txt' С (FIELDTERMINATOR = ',', FIRSTROW = 2)
Это похоже на SQL Server
Где конкретно у вас проблемы? Вопрос довольно общий. Проблема с объединением данных без ключа? Или проблема в механике использования набора данных. Также - не уверен, что вы имеете в виду, загружая пустую базу данных в набор данных.