2014-01-06 45 views
0

我有一个CSV文件,其中有大约400万行干净的数据,我需要将它导入SQL Server 2008 R2数据库。C#SqlCommand插入空值

我试图通过仅TSQL,SSIS和其他几个方法来做到这一点,但最终我总是遇到同样的问题,每行都有2000多列。 SQL服务器在读取CSV文件中的许多列时遇到问题。

因此,我最终编写了一个小小的C#控制台程序来解析csv文件并完成所有工作,将2000多列分解到我的数据库中的关系表中。一切都很好,但有了400万行的CSV文件,效率是关键。

所有这一切说,这里是我遇到的问题,不能为我的生活弄清楚。我正在使用旧的SqlCommand类来执行批量插入。我无法弄清楚如何获得空值到数据库。例如,采取这一行

var PreparedCommand = "insert into person_modeling_info (person_id, modeling_info,  response) values "; 

PreparedCommand += "(" + info[0] + ",'" + info[1] + "'," + (item2.Value == "" ? "'NULL'" : "'"+item2.Value+"'") + "),"; 

我不担心SQL注入,因为我100%确定数据是干净的。我知道我可以使用参数插入null,但参数比较慢,因为我必须一次插入一条记录,而不是使用大容量插入,如 insert into table (values), (values), (values)

当我使用串联执行插入时,它会插入数据库作为一个空字符串。

如果任何人有想法,任何帮助将不胜感激。

+4

_I我不担心SQL注入_你应该是我的朋友,你应该.. –

+3

为什么,它将数据从一个系统移到另一个系统。 – mituw16

+3

不带引号的'NULL'应该做。当然,注射问题仍然如此。 – Abhitalks

回答

3

你确定item2.Value还没有== null吗?您是否尝试过:

PreparedCommand += "(" + info[0] + ",'" + info[1] + "'," + (item2.Value == null ? "'NULL'" : "'"+item2.Value+"'") + "),"; 
+2

我建议使用'String.IsNullOrEmpty'而不是简单的空检查(假设你正在做的是改变空字符串的行为),但是,这似乎是一个似是而非的解释。 – Chris

+0

@Chris:在数据库中,像C#一样,'null'和''''是不同的。 – Andomar

+0

就是这样。不能相信我错过了这一点。谢谢!!! – mituw16

0

使用SqlParameters并分配DbNull.Value。真的,没有任何借口。在这样的公共论坛上,SQL注入代码是一种攻击。一些无辜的白痴会复制/粘贴两年后......

当然,从CSV移动有效 4M行确实是一个问题,关于bcp.exeSSIS或者,在最坏的情况,SqlBulkCopy。我建议您阅读The Data Loading Performance Guide并了解Operations That Can Be Minimally Logged

+3

这不是一种冒犯,你错了。我不是一个白痴,我很清楚这是SQL注入漏洞。不过,我并不担心,因为这个程序只是将CLEAN数据从内部平面文件移动到关系数据库中。 – mituw16

1

你应该尝试这种方式:

,你必须从'NULL'删除单引号,也为item2.Value增加检查为null或空。

var PreparedCommand = "insert into person_modeling_info (person_id, modeling_info,  response) values "; 

    PreparedCommand += "(" + info[0] + ",'" + info[1] + "'," + (string.IsNullOrEmpty(item2.Value)==true? "NULL" : "'"+item2.Value+"'") + "),"; 
1

使用了同样的想法你可以只让你插入列条件:

var PreparedCommand = "insert into person_modeling_info (person_id, modeling_info" + (item2.Value == "" ? "" : ",response") + ") values "; 

PreparedCommand += "(" + info[0] + ",'" + info[1] + "'" + (item2.Value == "" ? "" : ",'"+item2.Value+"'") + "),"; 

最好,你想使用SQL参数和使用DbNull.Value

+0

对,我最初尝试过,但速度较慢,因此需要我逐一插入每一行。当我通过批量插入移动到* shudder *字符串连接时,它将运行时间缩短约40秒。 – mituw16