使用Npgsql传递空值的形式如下:
using (NpgsqlCommand cmd = new NpgsqlCommand("insert into foo values (:TEST)", conn))
{
cmd.Parameters.Add(new NpgsqlParameter("TEST", NpgsqlDbType.Varchar));
cmd.Parameters[0].Value = DBNull.Value;
cmd.ExecuteNonQuery();
}
这很好用。
Npgsql 4.0的新文档建议像这样使用强类型声明参数:
using (NpgsqlCommand cmd = new NpgsqlCommand("insert into foo values (:TEST)", conn))
{
cmd.Parameters.Add(new NpgsqlParameter<string>("TEST", NpgsqlDbType.Varchar));
cmd.Parameters[0].Value = DBNull.Value;
cmd.ExecuteNonQuery();
}
当传递DBNull.Value时,会抛出一个一般性的异常:
使用新的无装箱参数仍然可以正常工作,但是新的语法似乎很有意义,我们想要使用它......但如何解决这种数据类型不匹配的问题?无法将类型为 'System.DBNull' 的对象强制转换为类型 'System.String'。
上面的示例是针对字符串的。我认为这也会影响数字和日期。
TypedValue
的部分。感谢您的澄清和所有额外的信息。这太完美了。我希望另一个优点是它会在类型不匹配时发出编译时错误/警告,所以我会找出是否是这种情况。至于不可移植性,对我来说,更好就是更好,所以我宁愿使用它而不是不使用它。同样也可以说PostgreSQL数组--不是很便携,但仍然很棒。说到惊人的事情,NpgSql真是太棒了。感谢您为这个卓越的产品做出的所有贡献。 - HamboneTypedValue
是有类型的,它将防止一些不匹配的问题(严格类型总比弱类型更好...) - Shay Rojansky