我经常要处理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 }