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;

  1. 单独保留自动生成的代码。没有办法“拦截”它会产生,所以你做的任何改变都会被保证迟早会被吹走。

  2. .NET(至少.NET 2.0 system.data位)不会从DBNull转换为其他任何东西。这很糟糕,但你无能为力。

  3. 编写一个名为ToNullable()或类似的扩展方法:它可以这样做:

  4. 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;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top