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

时间:2012-01-09 16:32:43

标签: c# sql file-upload

我有一个要求,我必须将文件上传到db。 文件每天将有大约100K的记录,每月有一个800到1000万条记录。

还有一些字段级别的验证要执行。

验证如下:所有字段都存在,数字字段包含有效数字,日期包含有效日期,指定范围内的数字,字符串格式匹配等。

有三种方式。

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。

3种方式中哪一种最好?

2 个答案:

答案 0 :(得分:2)

我会选择2。

100k行 peanuts 进行批量和查询验证。

答案 1 :(得分:1)

正如@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

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