Con frecuencia tengo que lidiar con DataTables conectados a controles de cuadrícula, la actualización personalizada siempre parece producir una gran cantidad de código relacionado con DBNull.Value. Vi a una pregunta similar aquí, pero creo que debe haber una respuesta mejor:Tratando con DBNull.Value
What is the best way to deal with DBNull's
Lo que me parece es que tiendo a encapsular mis actualizaciones de la base de métodos, así que termino con un código como por debajo de donde muevo el DBNull.Value a un tipo anulable y luego de vuelta para la actualización:
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
}
Eso fue sólo un ejemplo del flujo y el código no funciona. Me doy cuenta de que podría hacer cosas como pasar objetos o tragar posibles problemas de conversión usando "como tipo" para obtener DBUll directo a nulo, pero ambos me parecen ocultar posibles errores, me gusta el tipo de seguridad del método con tipos que aceptan nulos.
¿Existe un método más limpio para hacer esto mientras se mantiene el tipo de seguridad?
¿Por qué no utiliza DataRow fuertemente tipado directamente? Mencionaste que debes usar DataTables. Si esas tablas de datos están fuertemente tipadas, puede enviar una fila de datos a su método. La fila de datos ya usa DBNull. –