我有以下代码将一些数据插入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 = ""
,我会得到结果。它是空白还是空是否重要?是否有“首选”选项?
谢谢!
答案 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#解决这个问题。