1つのテーブル(すべてvarchar)から別の(型付けされた)C#にデータをコピーして検証する方法は?

c# entity-framework sqlbulkcopy

質問

[注:SSISなどを使用できないコードにする必要があります]

おそらく、C#とEFを使用して、あるデータベースから別のデータベースに一括してデータをコピーする必要があります。

問題は、ソースデータがすべてvarchar(max)であり、正しいデータ型の宛先を欲しいということです。ソースは、非常にうまく動作し、交換することができない古いETLジョブの履歴です。私が見てきた最も一般的な問題は、数値フィールドのアルファです - たとえば、マネーフィールドの "none"です。これらはすべてvarcharなので、これらはソースで問題ありません。

私はデータをコピーしてそれを検証したいと思います:
source - > validate - > destination
可能な限りシンプルな方法で。検証に失敗した場合は、失敗した行を知る必要があり(理想的には何が失敗したのか)、ソース内で手動で修正してデータを再コピーできるようにする必要があります。

10から1.7Mの行におよぶ50のテーブルがあります!速度も重要です。

これには賢明な方法がありますか? DTO、検証属性、およびautomapを作成しますか? 2つの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 、àla CSVで使用可能なフォーマットにまっすぐ進みます。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ