如何在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合法嗎? 是的,了解原因