C#SqlCommand插入空值

时间:2014-01-06 14:08:51

标签: c# sql sql-server

我有一个CSV文件,其中包含大约400万行干净数据,我需要将其导入SQL Server 2008 R2数据库。

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

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

所有这一切都说,这就是我遇到的问题,而不能为我的生活弄明白。我使用旧的SqlCommand类进行批量插入。我无法弄清楚如何在db中获取null值。例如,走这条线

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 个答案:

答案 0 :(得分:3)

您确定item2.Value尚未== null吗?你试过了吗?

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

答案 1 :(得分:1)

你应该这样试试:

您必须从'NULL'删除单引号,同时添加item2.Value的检查为空或空。

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+"'") + "),";

答案 2 :(得分: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

答案 3 :(得分:0)

使用SqlParameters并指定DbNull.Value。真的,没有任何借口。在这样的公共论坛上发布SQL注入代码是一种冒犯。一些无辜的白痴会在2年后复制/粘贴它......

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