Самый быстрый способ импортировать текстовый файл в базу данных - PullRequest
0 голосов
/ 01 ноября 2010

У меня есть текстовый файл, содержащий запись дампа таблицы базы данных в произвольном формате, этот текст имеет символ в определенной позиции, который идентифицирует операцию с записью:

  • M =Вставить или обновить
  • D = Удалить запись

Поэтому, если я нахожу D-запись в текстовом файле, мне нужно удалить запись в базу данных, вместо этого, если я нахожу M-запись, мне нужноВставьте запись, если она не существует в базе данных, если она уже существует, мне нужно обновить ее.

Какой самый лучший и быстрый способ импортировать аналогичный текстовый файл в таблицу базы данных с использованием .NET Framework и c #?У меня 300000 записей среднего в этом текстовом файле.

Спасибо

Ответы [ 5 ]

2 голосов
/ 01 ноября 2010

Самый простой способ - это, вероятно, использовать ADO.NET для создания типизированной таблицы данных для загрузки данных и соответствующей установки состояния данных, а затем сбрасывать данные через DataAdapter.

Самый быстрый способ - это, вероятно, создать массовый SQL-скрипт для выполнения. LinQ может сэкономить вам много времени при выборе данных (вы можете преобразовать их на лету).

Существуют также решения для конкретных платформ, которые следует учитывать. Смотрите здесь массовую вставку для SQLServer.

http://dotnetslackers.com/Community/blogs/xun/archive/2008/04/15/sql-bulk-insert-and-ado-net-sqlbulkcopy.aspx

1 голос
/ 01 ноября 2010

Почему бы не проанализировать текст и сгенерировать операторы вставки, обновления и удаления, а затем просто запустить созданный вами сценарий?

0 голосов
/ 02 ноября 2010

Вставить во временную таблицу, затем присоединиться к ОБНОВЛЕНИЮ или УДАЛИТЬ.

0 голосов
/ 02 ноября 2010

Если вы используете SQL Server, вы можете воспользоваться функцией Массовая вставка .Это должен быть самый быстрый способ вставить данные из файла в базу данных.Первое, что я хотел бы сделать, это вставить данные из вашего файла в «целевую таблицу» (то есть таблицу, структура которой соответствует структуре вашего файла).Также обратите внимание: .NET 2.0 представил SqlBulkCopy , который был бы аналогичным образом полезен, если у вас уже есть данные в памяти или вы читаете их с помощью какого-либо типа DataReader.

Как только содержимое вашего файлавставлены в вашу целевую таблицу, затем вы можете выполнить серию SQL-операторов, чтобы объединить вашу целевую таблицу с вашими целевыми таблицами.Ниже приведен пример реализации этих операторов SQL (Отказ от ответственности: я не проверял их на правильность):

DELETE FROM MyTable
WHERE EXISTS (
    SELECT 1
    FROM LandingTable
    WHERE
        LandingTable.RecordType = 'D'
        AND LandingTable.KeyField1 = MyTable.KeyField1
        AND LandingTable.KeyField2 = MyTable.KeyField2


UPDATE MyTable SET
    MyTable.Field1 = LandingTable.Field1,
    MyTable.Field2 = LandingTable.Field2,
    -- ...
FROM MyTable
INNER JOIN LandingTable ON
    LandingTable.KeyField1 = MyTable.KeyField1
    AND LandingTable.KeyField2 = MyTable.KeyField2
where
    LandingTable.RecordType = 'U'

INSERT INTO MyTable (
    Field1,
    Field2,
    -- ...
)
SELECT
    LandingTable.Field1,
    LandingTable.Field2,
    -- ...
FROM LandingTable
WHERE
    LandingTable.RecordType = 'I'

-- Consider how to handle "Insert" records where there is already a record in MyTable with the same key
-- Possible solution below: treat as an "Update"
UPDATE MyTable SET
    MyTable.Field1 = LandingTable.Field1,
    MyTable.Field2 = LandingTable.Field2,
    -- ...
FROM MyTable
INNER JOIN LandingTable ON
    LandingTable.KeyField1 = MyTable.KeyField1
    AND LandingTable.KeyField2 = MyTable.KeyField2
where
    LandingTable.RecordType = 'I'

-- Now only insert records from LandingTable where there is no corresponding record in MyTable with the same key (determined with a left outer join)
INSERT INTO MyTable (
    Field1,
    Field2,
    -- ...
)
SELECT
    LandingTable.Field1,
    LandingTable.Field2,
    -- ...
FROM LandingTable
LEFT OUTER JOIN MyTable ON
    MyTable.KeyField1 = LandingTable.KeyField1
    AND MyTable.KeyField2 = LandingTable.KeyField2
WHERE
    LandingTable.RecordType = 'I'
    and MyTable.KeyField1 is null

Ссылки, которые я нашел после выполнения быстрого поиска:

0 голосов
/ 01 ноября 2010

Нет простого способа сделать это, вам придется анализировать текст независимо от того, что нужно определить, какой оператор SQL вам нужно выполнить.Вы должны решить для себя, будет ли это обновление или оператор вставки, надеюсь, вы сможете делать пакеты, иначе попадание в базу данных каждый раз, когда вы нажимаете «М», так часто не будет хорошей идеей.*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...