从CSV文件同步数据库

时间:2012-01-06 11:32:41

标签: c# .net sql-server csv sql-server-2008-r2

我需要解决我正在处理的问题:

我在C#.Net中编写一个数据同步器,它将接收CSV文件,一个用于SQL Server数据库中的每个表。

csv文件中的某些行将引用数据库中的现有行,需要更新,有些行将引用新行,需要插入。

由于可能有很多文件(大约20个),并且每个文件中可能包含很多行,我如何才能使其可扩展?此时读取一行,连接到数据库以确定是否存在具有相同ID的行(以确保它是更新还是插入)然后再进行实际更新或插入的连接似乎很浪费

4 个答案:

答案 0 :(得分:3)

  1. 将所有内容加载到临时表(批量插入)

  2. 对目标表执行合并更新。

答案 1 :(得分:2)

您应该使用SQL Server Integration Services进行此类工作。

  

SSIS是数据集成和工作流应用程序的平台。它具有快速灵活的数据仓库工具,用于数据提取,转换和加载(ETL)。

答案 2 :(得分:0)

也可以使用CsvReader

作为参考

答案 3 :(得分:0)

最好的方法是使用SSIS。在SSIS中我们有csv阅读器组件(平面文件源),它处理所有类型的平面文件(管道或制表符分隔等)。使用查找你可以查看现有的行该表然后你可以使用Oledb组件更新,插入或删除。

如果您不想使用SSIS,则可以采用另一种方式使用XML存储过程。而不是为每一行访问数据库,您可以将数据作为XML传递,然后在存储过程中进行操作。 / p>

示例:使用XML作为源将数据插入表中

            CREATE PROCEDURE [dbo].[sp_Insert_XML]
        @XMLDATA xml

AS

BEGIN

SET NOCOUNT ON;
-- Insert statements for procedure here
Insert into RCMReport(
   ProjectName
  ,Category
  ,EndTime)
    Select  
        XMLDATA.item.value('@ProjectName[1]', 'varchar(255)') AS ProjectName,   
        XMLDATA.item.value('@Category[1]', 'varchar(200)') AS Category,
        XMLDATA.item.value('@EndTime[1]', 'datetime') AS EndTime
            FROM @XMLDATA.nodes('//RCMReport/InsertList') AS XMLDATA(item)