加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 处理DBNull.Value

发布时间:2020-12-15 03:54:33 所属栏目:百科 来源:网络整理
导读:我经常要处理DataTables连接到网格控件,自定义更新总是似乎产生了很多与DBNull.Value相关的代码.我在这里看到一个类似的问题,但认为必须有一个更好的答案: What is the best way to deal with DBNull’s 我发现的事情是我倾向于将数据库更新封装在方法中,所
我经常要处理DataTables连接到网格控件,自定义更新总是似乎产生了很多与DBNull.Value相关的代码.我在这里看到一个类似的问题,但认为必须有一个更好的答案:

What is the best way to deal with DBNull’s

我发现的事情是我倾向于将数据库更新封装在方法中,所以我最终得到了下面的代码,我将DBNull.value移动到可空类型,然后返回进行更新:

private void UpdateRowEventHandler(object sender,EventArgs e)
{
    Boolean? requiresSupport = null;
    if (grdMainLevel1.GetFocusedRowCellValue(colASRequiresSupport) != DBNull.Value)
        requiresSupport = (bool)grdMainLevel1.GetFocusedRowCellValue(colASRequiresSupport);

    AdditionalSupport.UpdateASRecord(year,studentID,requiresSupport)
}

internal static void UpdateASRecord(
        string year,string studentID,bool? requiresSupport)
    {
        List<SqlParameter> parameters = new List<SqlParameter>();

        parameters.Add(new SqlParameter("@year",SqlDbType.Char,4) { Value = year });
        parameters.Add(new SqlParameter("@student_id",11) { Value = studentID });

        if (requiresSupport == null)
            parameters.Add(new SqlParameter("@requires_support",SqlDbType.Bit) { Value = DBNull.Value });
        else
            parameters.Add(new SqlParameter("@requires_support",SqlDbType.Bit) { Value = requiresSupport });

        //execute sql query here to do update
    }

这只是流程而不是工作代码的一个例子.我意识到我可以像传递对象或吞下潜在的铸造问题,使用“类型”来获取DBUll直到null,但这两个我似乎隐藏潜在的错误,我喜欢类型的可靠类型的方法的安全性.

在保持类型安全的同时,是否有更干净的方法?

解决方法

一些(非常)简单的通用助手方法可能至少将测试集中在一个代码中:
static T FromDB<T>(object value)
{
    return value == DBNull.Value ? default(T) : (T)value;
}

static object ToDB<T>(T value)
{
    return value == null ? (object) DBNull.Value : value;
}

然后可以在适当的地方使用这些方法:

private void UpdateRowEventHandler(object sender,EventArgs e)
{
    AdditionalSupport.UpdateASRecord(year,FromDB<Boolean?>(grdMainLevel1.GetFocusedRowCellValue(colASRequiresSupport)));
}

internal static void UpdateASRecord(
        string year,bool? requiresSupport)
{
    List<SqlParameter> parameters = new List<SqlParameter>();

    parameters.Add(new SqlParameter("@year",4) { Value = year });
    parameters.Add(new SqlParameter("@student_id",11) { Value = studentID });
    parameters.Add(new SqlParameter("@requires_support",SqlDbType.Bit) { Value = ToDB(requiresSupport) });

    //execute sql query here to do update
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读