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但是... 当数据集结构被修改(仍处于开发阶段)时,我的更改(不出所料)就消失了。
处理这种情况的最佳方法是什么? 似乎我在数据集级别处理它时遇到困难。 是否有某种属性可以告诉自动代码生成器将更改保留在原位?
答案 0 :(得分:6)
在类型化数据集设计器中,有nullvalue
属性。
默认情况下,其值为throw exception
(因此生成的代码)
您可以将其设置为所需的default value
..即。 0。
然后它将返回0而不是异常。 (生成其他代码)
VS2008:这直接在数据集设计器中起作用。
VS2005:它只适用于设计器中的字符串,但你可以直接编辑XSD一套属性msprop:nullValue =“0”
答案 1 :(得分:3)
单独保留自动生成的代码。没有办法“拦截”它的生成,所以你所做的任何改变都会被保证迟早会被吹走。
.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>();
答案 2 :(得分:1)
数据集将具有布尔属性以指示null。
int curr_reading = ( Iscurr_readingColumnNull) ?
<default_value> : row.curr_readingColumn;
答案 3 :(得分:0)
如果内存服务,你需要将行标记为正在编辑 - 使用.BeginEdit()或类似 - 然后进行编辑并保存行,可能使用.EndEdit()或类似。您可能想要对这些方法进行一些阅读(它们可能位于DataSet,DataTable或DataRow上) - 我的内存有点朦胧。
希望这有助于至少一点点。
答案 4 :(得分:0)
if(row["curr_reading"] is DBNull){
}else{
row.curr_reading;
}