4

我有以下代码将一些数据插入到 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 = ""我会得到结果。它是空白还是空有关系吗?有“首选”选项吗?

谢谢!

4

2 回答 2

2

嗯,null肯定和空字符串不一样。所以,是的,这很重要。但仅在您的域中。因此,换句话说,如果该字段不是真正可以为空的并且 Access 将其解释DBNull.Value为空字符串,那么在查找没有值的行时,您只需牢记这一点。如果该列在 Access 中可以为空,您将不会看到此行为。

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

values[0];

代替:

(object)values[0] ?? DBNull.Value;
于 2013-08-28T18:46:44.210 回答
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# 解决这个问题。

于 2013-08-28T19:38:14.580 回答