我有一个文本文件,其中包含自定义格式的数据库表转储记录,此文本在特定位置有一个字符,用于标识记录的操作:
因此,如果我在文本文件中找到D记录,我需要将记录删除到数据库中,相反,如果我找到M记录,我需要插入记录,如果数据库中不存在,如果已经存在,我需要更新它。
使用.NET Framework和c#在数据库表中导入类似文本文件的更好,最快的方法是什么? 我在这个文本文件中有300000条平均记录。
由于
答案 0 :(得分:2)
最简单的方法可能是使用ADO.NET创建一个类型化的数据表来加载数据并相应地设置datarowstate,然后通过DataAdapter刷新数据。
最快的方法可能是创建一个要执行的批量SQL脚本。 LinQ可以在选择数据时为您节省大量时间(您可以随时对其进行转换)。
还应考虑特定于平台的解决方案。在这里看到SQLServer的批量插入。
答案 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。