我需要一个问题,我的工作思路:从CSV文件同步数据库
我写在C#.NET中的数据同步器将接收CSV文件,一个用于在SQL Server数据库中的每个表。
csv文件中的某些行将引用数据库中的现有行,需要更新,有些会引用新行,需要插入。
由于可能有很多文件(大约20个)并且每个文件中可能有很多行,我怎样才能使这种可扩展?此时读取一行,连接到数据库以确保具有相同ID的行是否存在(以确定它是否为更新或插入),然后再进行实际更新或插入的连接看起来很浪费。
我需要一个问题,我的工作思路:从CSV文件同步数据库
我写在C#.NET中的数据同步器将接收CSV文件,一个用于在SQL Server数据库中的每个表。
csv文件中的某些行将引用数据库中的现有行,需要更新,有些会引用新行,需要插入。
由于可能有很多文件(大约20个)并且每个文件中可能有很多行,我怎样才能使这种可扩展?此时读取一行,连接到数据库以确保具有相同ID的行是否存在(以确定它是否为更新或插入),然后再进行实际更新或插入的连接看起来很浪费。
也是一个很好的来源,以作为参考用途是CsvReader
您应该使用SQL Server Integration Services这种工作的。
SSIS是一个数据集成和工作流应用程序的平台。它具有用于数据提取,转换和加载(ETL)的快速灵活的数据仓库工具。
的最佳方式将是使用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)
,我们谈论的是什么数据量?我正在尝试确定在谈论规模时是否过早。 – Oded 2012-01-06 11:38:28
我试图将它分开,尝试批量处理,一次查找现有数据库中的500行。然后将它们映射回代码,然后执行更新/插入(没有理由不能重复使用相同的连接)。当处理这么多的数据时,值得思考如果失败会怎么做,交易是值得考虑的 – ChrisFletcher 2012-01-06 11:42:56
您应该阅读[SSIS](http://en.wikipedia.org/wiki/SQL_Server_Integration_Services) - 这就是它对于。 – Oded 2012-01-06 11:43:58