Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中将数据从一个表(所有varchar)复制和验证到另一个表(键入的)?_C#_Entity Framework_Sqlbulkcopy - Fatal编程技术网

如何在C#中将数据从一个表(所有varchar)复制和验证到另一个表(键入的)?

如何在C#中将数据从一个表(所有varchar)复制和验证到另一个表(键入的)?,c#,entity-framework,sqlbulkcopy,C#,Entity Framework,Sqlbulkcopy,[注意:需要使用代码,因为无法使用SSI或类似工具] 我可能需要使用C#和EF将数据从一个数据库大容量复制到另一个数据库——尽管这不是一成不变的 问题是源数据都在varchar(max)中,我希望目标数据的数据类型正确。源代码来自一个旧的ETL工作,它工作得非常好,我无法被替换。我见过的最常见的问题是数字字段中的字母-例如货币字段中的“无”。这些在源代码中很好,因为它们都是varchar 我想复制数据并验证它:源->验证->目标 以尽可能简单的方式。如果验证失败,那么我需要知道失败的确切行(理想

[注意:需要使用代码,因为无法使用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]”
)。返回的行是验证失败的行。