如何在C#中将数据从一个表(所有varchar)复制并验证到另一个表(类型)?

c# entity-framework sqlbulkcopy

[注意:需要在代码中,因为不能使用SSIS或类似的]

我需要使用C#和EF将数据从一个数据库批量复制到另一个数据库 - 尽管这不是一成不变的。

问题是源数据全部在varchar(max)中,我希望目标在正确的数据类型中。来源是旧ETL工作的历史,工作得非常好,我无法取代。我见过的最常见的问题是数字字段中的alpha - 例如money field中的“none”。这些都很好,因为它都是varchar。

我想复制数据并验证它:
source - > validate - > destination
以最简单的方式。如果验证失败,那么我需要知道失败的确切行(理想情况下失败),以便可以在源中手动修复它,并重新复制数据。

大约有50个表,行数在10到1.7M之间!所以速度也很重要。

什么是明智的方法来解决这个问题?创建DTO,验证属性和自动化?两个EF实体并逐行映射并验证每个实体? SPROC和手动插入?

一般承认的答案

在带有链接服务器的 T-SQL中执行此操作。

即:

--begin a transaction to wrap validation and load
BEGIN TRAN

--Validate that no tickets are set to closed without a completion date
SELECT * 
FROM bigTableOnLocalServer with (TABLOCKX) -- prevent new rows
WHERE ticketState = '1' /* ticket closed */ and CompletionDate = 'open' 

--if validation fails, quit the transaction to release the lock
COMMIT TRAN

--if no rows in result set 1, execute the load
INSERT INTO RemoteServerName.RemoteServerDBName.RemoteSchema.RemoteTable (field1Int, Field2Money, field3text)
SELECT CAST(Field1 as int), 
    CASE Field2Money WHEN 'none' then null else CAST(Field2Money as money) END,
    Field3Text
FROM bigTableOnLocalServer
WHERE recordID between 1 and 1000000

-- after complete, commit the transaction to release the lock
COMMIT TRAN

如果无法在服务器之间直接通信,仍然在SQL中进行验证,但使用C#客户端将数据写入磁盘并在目标服务器上点击批量插入功能。由于C#组件除了传输数据之外什么都不做,我只想直接使用BULK INSERT可用的格式,即CSV。




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因