如何在C#中将数据从一个表(所有varchar)复制和验证到另一个表(键入的)?
[注意:需要使用代码,因为无法使用SSI或类似工具] 我可能需要使用C#和EF将数据从一个数据库大容量复制到另一个数据库——尽管这不是一成不变的 问题是源数据都在varchar(max)中,我希望目标数据的数据类型正确。源代码来自一个旧的ETL工作,它工作得非常好,我无法被替换。我见过的最常见的问题是数字字段中的字母-例如货币字段中的“无”。这些在源代码中很好,因为它们都是varchar 我想复制数据并验证它:如何在C#中将数据从一个表(所有varchar)复制和验证到另一个表(键入的)?,c#,entity-framework,sqlbulkcopy,C#,Entity Framework,Sqlbulkcopy,[注意:需要使用代码,因为无法使用SSI或类似工具] 我可能需要使用C#和EF将数据从一个数据库大容量复制到另一个数据库——尽管这不是一成不变的 问题是源数据都在varchar(max)中,我希望目标数据的数据类型正确。源代码来自一个旧的ETL工作,它工作得非常好,我无法被替换。我见过的最常见的问题是数字字段中的字母-例如货币字段中的“无”。这些在源代码中很好,因为它们都是varchar 我想复制数据并验证它:源->验证->目标 以尽可能简单的方式。如果验证失败,那么我需要知道失败的确切行(理想
源->验证->目标
以尽可能简单的方式。如果验证失败,那么我需要知道失败的确切行(理想情况下是失败的行),以便可以在源中手动修复该行,并重新复制数据 大约有50张桌子,从10行到170万行不等!所以速度也很重要 什么是明智的方法?创建DTO、验证属性和自动映射?两个EF实体,逐行映射并验证每个实体?存储过程和手动插入?在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#组件只会传输数据,因此我将直接使用一种可用的格式,即CSV。这个问题有什么不对或不清楚的地方?这里的问题到底是什么?你想让别人帮你写代码吗?一点也不想——我想问的是,什么是一种明智的方法?创建DTO、验证属性和自动映射?两个EF实体,逐行映射并验证每个实体?存储过程和手动插入?好吧,问题还不是很清楚。请编辑您的问题,并将该文本以粗体显示在底部。表格位于同一服务器上,因此这应该相当容易。我如何知道哪一行失败?您可以在插入本身之前作为一组主动完成的查询进行验证。例如:如果您要查找的字段应仅为整数,则会有一个查找非0-9值的条件(
IntegerTextColumn,如“[^0-9]”
)。返回的行是验证失败的行。