Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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# 上传到db,然后验证或验证每一行,然后上传到db_C#_Sql_File Upload - Fatal编程技术网

C# 上传到db,然后验证或验证每一行,然后上传到db

C# 上传到db,然后验证或验证每一行,然后上传到db,c#,sql,file-upload,C#,Sql,File Upload,我有一个要求,我必须上传一个文件到数据库。 该文件每天大约有10万条记录,每月有一条记录,从800万条到1000万条 此外,还需要执行一些字段级验证 验证如下:是否所有字段都存在,do number字段包含有效数字,date包含有效日期,is number在指定范围内,字符串格式是否匹配,等等 有三种方法 1: Upload to temp and then validate - Create a temp table (all string columns), have extra error

我有一个要求,我必须上传一个文件到数据库。 该文件每天大约有10万条记录,每月有一条记录,从800万条到1000万条

此外,还需要执行一些字段级验证

验证如下:是否所有字段都存在,do number字段包含有效数字,date包含有效日期,is number在指定范围内,字符串格式是否匹配,等等

有三种方法

1: Upload to temp and then validate
- Create a temp table (all string columns), have extra error column
- upload all entries to temp table
- run validation, populate error column if needed
- move valid entries to correct table
缺点:条目必须在db中写入两次,即使是正确的条目

2: Upload to db directly
- upload all entries directly to table
- check which entries are not uploaded
缺点:即使在上传后也需要阅读每一行,所以最好是重复阅读

3: Validate and then Upload
- read each line, run all validations on all columns
- if valid then write to db
缺点:文件读取速度必须比批量上传到db慢

我正在C#&ASP.NET中编写应用程序,DB是Oracle

三种方法中哪一种最好?

我选择选项2


10万行对于批量验证和查询验证来说是微不足道的。

正如@aF所说的,选项2增加了以下内容:
添加可以将“无效”行转储到的表。然后,运行如下语句:

INSERT INTO InvalidData
SELECT *
FROM InputData
WHERE restrictedColumn NOT IN ('A', 'B')
OR NOT IS_NUMERIC(numberColumn)  -- I'm assuming some version of SQL Server...
然后将“已验证”行转储到实际表中,排除“无效”行:

INSERT INTO Destination
SELECT a.*
FROM InputData as a
EXCEPTION JOIN InvalidData as b
ON b.id = a.id

如果遇到任何(其他)“无效”数据,插入将失败,但应可发现。然后可以清理并重新插入“无效”表。

如何验证,什么验证?应该是数字的东西不包含非数字?字段是否在某个范围内(未通过检查约束指定)?选项1可能需要一个存储过程或“外部”代码。选项2可以像SQL语句一样运行—在insert上也可以进行一些真正基本的验证(但是,如果出现错误,它通常会立即终止—并不是所有有效行都会被写入)。3的速度特别慢,可能需要在“外部”运行。验证方法如下:对于num字段:检查其编号、范围或位置等。对于文本字段:检查字段格式或其所有字符等,在这个月有一个特定的上传,上传将有大约800万到1000万行。验证必须在SQL端。使用c#读取和验证1000万行需要很长时间。在选项1和2之间是您的调用,但您仍然必须读取所有记录并验证它们。如果我理解正确,我应该将文件上载到表InputData,然后运行验证,将无效行移到InvalidData表,将有效行移到目标。但这需要将每个记录写入两次,首先输入数据,然后输入InvalidData/目的地。有没有办法避免在数据库中重复写入数据?或者这是我们所能达到的最好效果?据我所知,大多数RDBMS都有某种
import
实用程序,允许大规模上传。问题是,它们通常无法执行任何验证—它们所做的只是将信息转储到这些表—但是,与单个(甚至正常阻塞的)插入相比,它们的速度非常快。如果遇到“对于列无效”的数据(例如,对于数字列为非数字字符),它们确实会失败,但(据我所知)不会太多。因此,导入(所有列char)'temp'表,然后拉出行。