INSERT查询 - Null与空字符串..这有关系吗?

时间:2013-08-28 18:43:45

标签: c# ms-access

我有以下代码将一些数据插入Access表。它以逗号分隔的行开头,我将其拆分为字符串数组,然后将数组元素添加为参数:

string line = "one\ttwo\t\tfour";  

string[] values = line.Split('\t');  

using (OleDbCommand com = new OleDbCommand("INSERT INTO [MyTable] (" +  
    "[Field1], [Field2], [Field3], [Field4] "  
    ") VALUES (" +  
    "?, ?, ?, ?" +  
    ")", con))  
{
    com.Parameters.Add("@p0", OleDbType.Char, 255).Value = (object)values[0] ?? DBNull.Value;
    com.Parameters.Add("@p1", OleDbType.Char, 255).Value = (object)values[1] ?? DBNull.Value;
    com.Parameters.Add("@p2", OleDbType.Char, 255).Value = (object)values[2] ?? DBNull.Value;
    com.Parameters.Add("@p3", OleDbType.Char, 255).Value = (object)values[3] ?? DBNull.Value;

    com.ExecuteNonQuery();
}

在上面的示例中,@p2没有值。它作为空值而不是空值插入到Access表中。至少我认为我正确地解释了这一点。如果我查询Field3 is Null,我就没有结果。如果我查询Field3 = "",我会得到结果。它是空白还是空是否重要?是否有“首选”选项?

谢谢!

2 个答案:

答案 0 :(得分:2)

好吧,null绝对不是一个空字符串。所以,是的,这很重要。但只限于您的域名。换句话说,如果字段不是真的可空,并且Access将DBNull.Value解释为空字符串,那么在查找没有值的行时,您必须牢记这一点。如果该列在Access中可以为空,那么您将无法看到此行为。

但是,如果该字段可以为空,那么我建议您实际上只是发送null而不是DBNull.Value。所以,换句话说:

values[0];

而不是:

(object)values[0] ?? DBNull.Value;

答案 1 :(得分:1)

原始声明:

com.Parameters.Add("@p2", OleDbType.Char, 255).Value = (object)values[2] ?? DBNull.Value;

根据说明,它从values[2]发送空字符串'',而不是DBNull.Value。我会显式转换空字符串(或null)而不是使用null-coalescing运算符(??):

com.Parameters.Add("@p2", OleDbType.Char, 255).Value = String.IsNullOrEmpty(values[2]) ? DBNull.Value : values[2];

已添加:由于类型规范(OleDbType.Char)阻止此将DBNull发送到数据库,我将恢复为AddWithValue

com.Parameters.AddWithValue("@p2", String.IsNullOrEmpty(values[2]) ? DBNull.Value : values[2]);

这不指定类型,因此应接受DBNull或字符串。无论如何,我更喜欢这种方法:如果我们指定类型,我们需要确保它与字段数据类型完全一致 - >让C#解决这个问题。