2

SQLServer int 字段。值有时为空。DataAdapter 填充数据集 OK 并可以在 DatagridView 中显示数据 OK。

尝试以编程方式从数据集中检索数据时,Dataset 字段检索代码会引发 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 解决了这个问题,但是......当数据集结构被修改(仍在开发中)时,我的更改(不出所料)消失了。

处理这种情况的最佳方法是什么?看来我被困在数据集级别处理它。是否有某种属性可以告诉自动代码生成器保留更改?

4

5 回答 5

6

在类型化的数据集设计器中有nullvalue属性。默认情况下,它的值是throw exception(因此您生成的代码)您可以将其设置为所需的default value.. 即。0. 然后它将返回 0 而不是异常。(生成其他代码)

VS2008:这直接在数据集设计器中工作。

VS2005:它仅适用于设计器中的字符串,但您可以直接编辑 XSD 并设置属性 msprop:nullValue="0"

于 2009-03-03T07:47:41.637 回答
3
  1. 不理会自动生成的代码。没有办法“拦截”它的生成,因此您所做的任何更改都保证迟早会被吹走。

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

  3. 编写一个名为 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>();
于 2009-03-02T02:53:52.910 回答
1

数据集将有一个布尔属性来指示空值。

int curr_reading = ( Iscurr_readingColumnNull) ? 
                   <default_value> : row.curr_readingColumn;
于 2009-03-02T02:52:28.653 回答
0

如果有记忆,您需要将该行标记为正在编辑 - 使用 .BeginEdit() 或类似的 - 然后进行编辑并保存该行,可能使用 .EndEdit() 或类似的。您可能想稍微了解一下这些方法(它们可能在 DataSet、DataTable 或 DataRow 上)——我的记忆有点模糊。

希望这至少有一点帮助。

于 2009-03-02T02:49:44.310 回答
0
if(row["curr_reading"] is DBNull){

}else{
    row.curr_reading;
}
于 2009-09-07T06:33:25.493 回答