2012-01-06 93 views
1

我需要一个问题,我的工作思路:从CSV文件同步数据库

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

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

由于可能有很多文件(大约20个)并且每个文件中可能有很多行,我怎样才能使这种可扩展?此时读取一行,连接到数据库以确保具有相同ID的行是否存在(以确定它是否为更新或插入),然后再进行实际更新或插入的连接看起来很浪费。

+0

,我们谈论的是什么数据量?我正在尝试确定在谈论规模时是否过早。 – Oded 2012-01-06 11:38:28

+0

我试图将它分开,尝试批量处理,一次查找现有数据库中的500行。然后将它们映射回代码,然后执行更新/插入(没有理由不能重复使用相同的连接)。当处理这么多的数据时,值得思考如果失败会怎么做,交易是值得考虑的 – ChrisFletcher 2012-01-06 11:42:56

+1

您应该阅读[SSIS](http://en.wikipedia.org/wiki/SQL_Server_Integration_Services) - 这就是它对于。 – Oded 2012-01-06 11:43:58

回答

3
  1. 负载一切都在一个临时表(批量插入)

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

+0

一个可行的方法 - 简单而高效!假设你对SQL方面没有任何限制(例如你可以修改现有的模式,可以处理额外的表,不介意编写T-SQL)。 – 2012-01-06 11:40:58

+0

您不需要添加任何索引。它只会减慢总处理时间。如果SQL Server需要输入排序,则可以对其进行即时排序(因为合并源表只会被读取一次)。 – usr 2012-01-06 21:19:13

+0

@usr:你说得对。关键查找将是另一种方式,因此不需要索引。已经从我的答案中删除了该步骤。 – vstrien 2012-01-09 12:29:17

0

也是一个很好的来源,以作为参考用途是CsvReader

2

您应该使用SQL Server Integration Services这种工作的。

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

0

的最佳方式将是使用SSIS。在SSIS我们有CSV阅读器组件(平面文件源)处理所有类型的平面文件(管道或制表符分隔。等)。采用查找ü可以用检查表中的现有行,然后可以使用Oledb组件更新,插入或删除。

如果你不想使用SSIS,还有一种使用XML存储过程的方法。而不是每行都击中数据库,你可以将数据作为XML传递,然后在存储过程中进行操作。

例如:要使用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)