处理 DBNull.Value

2024-04-29

我经常需要处理连接到网格控件的数据表,自定义更新似乎总是产生大量与 DBNull.Value 相关的代码。我在这里看到了类似的问题,但认为必须有更好的答案:

处理 DBNull 的最佳方法是什么 https://stackoverflow.com/questions/26809/what-is-the-best-way-to-deal-with-dbnulls

我发现我倾向于将数据库更新封装在方法中,因此我最终得到如下代码,其中我将 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", SqlDbType.Char, 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
    }

这只是流程的一个示例,而不是工作代码。我意识到我可以做一些事情,比如传递对象或使用“as type”吞掉潜在的转换问题,使 DBUll 直接为 null,但这对我来说似乎隐藏了潜在的错误,我喜欢具有可为 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, studentID, 
        FromDB<Boolean?>(grdMainLevel1.GetFocusedRowCellValue(colASRequiresSupport)));
}

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", SqlDbType.Char, 11) { Value = studentID });
    parameters.Add(new SqlParameter("@requires_support", SqlDbType.Bit) { Value = ToDB(requiresSupport) });

    //execute sql query here to do update
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理 DBNull.Value 的相关文章

随机推荐