数据集字段DBNull - >诠释?
题
SQLServer int字段。价值有时为空。 DataAdapter填充数据集确定,可以在DatagridView中显示数据。
当尝试从数据集以编程方式检索数据时,数据集字段检索代码会抛出StronglyTypedException错误。
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public int curr_reading {
get {
try {
return ((int)(this[this.tableHistory.curr_readingColumn]));
}
catch (global::System.InvalidCastException e) {
throw new global::System.Data.StrongTypingException("The value for column \'curr_reading\' in table \'History\' is DBNull.", e);
}
通过检查get访问器中的DBNull并返回null但是... 当数据集结构被修改(仍处于开发阶段)时,我的更改(不出所料)就消失了。
处理这种情况的最佳方法是什么? 似乎我在数据集级别处理它时遇到困难。 是否有某种属性可以告诉自动代码生成器将更改保留在原位?
解决方案
数据集将具有布尔属性以指示null。
int curr_reading = ( Iscurr_readingColumnNull) ?
<default_value> : row.curr_readingColumn;
其他提示
在类型化数据集设计器中,有 nullvalue
属性。
默认情况下,它的值是 throw exception
(因此生成的代码)
您可以将其设置为所需的默认值
..即。 0。
然后它将返回0而不是异常。 (生成其他代码)
VS2008:这直接在数据集设计器中起作用。
VS2005:它仅适用于设计器中的字符串,但您可以直接编辑XSD设置属性msprop:nullValue =&quot; 0&quot;
-
单独保留自动生成的代码。没有办法“拦截”它会产生,所以你做的任何改变都会被保证迟早会被吹走。
-
.NET(至少.NET 2.0 system.data位)不会从DBNull转换为其他任何东西。这很糟糕,但你无能为力。
-
编写一个名为ToNullable()或类似的扩展方法:它可以这样做:
醇>
public static Nullable<T> ToNullable(this object x){
if(x == DBNull.Value)
return default(T); // return null thing
else
return (T)x;
}
然后你可以做
int? thing = DataRow["column"].ToNullable<int>();
如果内存服务,你需要将行标记为正在编辑 - 使用.BeginEdit()或类似 - 然后进行编辑并保存行,可能使用.EndEdit()或类似。您可能想要对这些方法进行一些阅读(它们可能在DataSet,DataTable或DataRow上) - 我的内存有点模糊。
希望这有助于至少一点点。
if(row["curr_reading"] is DBNull){
}else{
row.curr_reading;
}