Ste*_*son 48 c# null ado.net dbnull nullable
我有一个DateTime?我正在尝试使用a插入字段DbParameter.我正在创建这样的参数:
DbParameter datePrm = updateStmt.CreateParameter();
datePrm.ParameterName = "@change_date";
Run Code Online (Sandbox Code Playgroud)
然后我想把s 的值DateTime?放到dataPrm.Valuewhile中null.
我以为我最初很聪明:
datePrm.Value = nullableDate ?? DBNull.Value;
Run Code Online (Sandbox Code Playgroud)
但是因错误而失败
接线员'??' 不能应用于'System.DateTime?'类型的操作数 和'System.DBNull'
所以我想这只有在第二个参数是第一个参数的非可空版本时才有效.那么我去了:
datePrm.Value = nullableDate.HasValue ? nullableDate.Value : DBNull.Value;
Run Code Online (Sandbox Code Playgroud)
但这也不起作用:
无法确定条件表达式的类型,因为'System.DateTime'和'System.DBNull'之间没有隐式转换
但我不想在这些类型之间进行转换!
到目前为止,我唯一可以上班的是:
if (nullableDate.HasValue)
datePrm.Value = nullableDate.Value;
else
datePrm.Value = DBNull.Value;
Run Code Online (Sandbox Code Playgroud)
这真的是我写这个的唯一方法吗?有没有办法使用三元运算符来实现单线程?
更新:我真的不明白为什么?? 版本不起作用.MSDN说:
?? ?? 如果左侧操作数不为null,则运算符返回左侧操作数,否则返回右侧操作数.
这正是我想要的!
Update2:最后有点明显:
datePrm.Value = nullableDate ?? (object)DBNull.Value;
Run Code Online (Sandbox Code Playgroud)
Ste*_*son 62
啊哈!我找到了比@ Trebz更有效的解决方案!
datePrm.Value = nullableDate ?? (object)DBNull.Value;
Run Code Online (Sandbox Code Playgroud)
如果您使用的是SQLServer,则System.Data.SqlTypes命名空间包含一些避免恼人的类型转换的实用程序类.例如,而不是这样:
var val = (object) "abc" ?? DBNull.Value;
Run Code Online (Sandbox Code Playgroud)
你可以这样写:
var val = "abc" ?? SqlString.Null;
Run Code Online (Sandbox Code Playgroud)
如果你使用它会工作
datePrm.Value = nullableDate.HasValue ? (object)nullableDate.Value : DBNull.Value;
Run Code Online (Sandbox Code Playgroud)
如果您使用的是C#3.0,则可以创建一个扩展方法来轻松实现:
public static class DBNullableExtensions
{
public static object ToDBValue<T>(this Nullable<T> value) where T:struct
{
return value.HasValue ? (object)value.Value : DBNull.Value;
}
}
class Program
{
static void Main(string[] args)
{
int? x = null;
Console.WriteLine( x.ToDBValue() == DBNull.Value );
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
33246 次 |
| 最近记录: |