将文本文件导入数据库的最快方法

时间:2010-11-01 18:58:07

标签: c# database import

我有一个文本文件,其中包含自定义格式的数据库表转储记录,此文本在特定位置有一个字符,用于标识记录的操作:

  • M =插入或更新
  • D =删除记录

因此,如果我在文本文件中找到D记录,我需要将记录删除到数据库中,相反,如果我找到M记录,我需要插入记录,如果数据库中不存在,如果已经存在,我需要更新它。

使用.NET Framework和c#在数据库表中导入类似文本文件的更好,最快的方法是什么? 我在这个文本文件中有300000条平均记录。

由于

5 个答案:

答案 0 :(得分:2)

最简单的方法可能是使用ADO.NET创建一个类型化的数据表来加载数据并相应地设置datarowstate,然后通过DataAdapter刷新数据。

最快的方法可能是创建一个要执行的批量SQL脚本。 LinQ可以在选择数据时为您节省大量时间(您可以随时对其进行转换)。

还应考虑特定于平台的解决方案。在这里看到SQLServer的批量插入。

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

答案 1 :(得分:1)

为什么不解析文本并生成插入,更新和删除语句,然后运行您生成的脚本?

答案 2 :(得分:0)

没有简单的方法可以做到这一点,无论如何确定需要运行的SQL语句,都必须解析文本。你必须自己决定它是否是更新或插入声明,希望你可以批量生成,否则每次你点击“M”时都会点击数据库,所以经常不会是一个好主意。

答案 3 :(得分:0)

如果您使用的是SQL Server,则可以利用Bulk Insert functionality。这应该是将文件中的数据插入数据库的最快方法。我要做的第一件事是将文件中的数据插入“登陆表”(即一个结构与文件结构相匹配的表)。另请注意:.NET 2.0 introduced 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

快速搜索后找到的链接:

答案 4 :(得分:0)

插入临时表,然后JOIN到UPDATE或DELETE。