我经常要处理连接到网格控件的DataTables,自定义更新似乎总会产生很多与DBNull.Value相关的代码.我在这里看到了类似的问题,但认为必须有一个更好的答案:
我找到的是我倾向于在方法中封装我的数据库更新,所以我最终得到如下代码,我将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
}
Run Code Online (Sandbox Code Playgroud)
这只是流程的一个例子而不是工作代码.我意识到我可以做一些事情,比如传递对象或者使用"as type"来吞下潜在的转换问题,以使DBUll直接为null,但这两个对我来说似乎隐藏了潜在的错误,我喜欢具有可空类型的方法的类型安全性.
有没有更清洁的方法来保持类型安全?
Fre*_*örk 16
一些(非常)简单的通用辅助方法可能至少将测试集中在一段代码中:
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;
}
Run Code Online (Sandbox Code Playgroud)
然后可以在适当的地方使用这些方法:
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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16238 次 |
| 最近记录: |