Tenemos nuestro propio ORM que utilizamos aquí, y ofrecemos envoltorios fuertemente tipados para todas nuestras tablas db. También permitimos que se ejecute SQL ad hoc débilmente tipeado, pero estas consultas aún pasan por la misma clase para obtener valores de un lector de datos.Acceso a la base de datos C#: DBNull vs null
Al ajustar esa clase para trabajar con Oracle, nos hemos encontrado con una pregunta interesante. ¿Es mejor usar DBNull.Value o null? ¿Hay algún beneficio al usar DBNull.Value? Parece más "correcto" usar null, ya que nos hemos separado del mundo de DB, pero hay implicaciones (no se puede simplemente a ciegas ToString()
cuando un valor es nulo, por ejemplo), así que definitivamente es algo que necesitamos hacer. decisión consciente acerca de.
Creo que todavía hay algunos usos para DBNull. Al menos con sqlite puedo probar si un valor devuelto por ExecuteScalar() se almacena explícitamente en la base de datos o no. Considere la tabla foo (a int, b int); con una sola fila (1, nulo). Si tuviéramos que EjecutarScalar en un comando "SELECCIONE b FROM foo WHERE A = 1", devolvería DBNull.Value (la fila existe se almacena un valor nulo). Si tuviera que llamar a ExecuteScalar en "SELECCIONAR b FROM foo DONDE A = 2" devolvería nulo (no existe tal fila). Es de suponer que podría lograr el mismo resultado con un DataReader pero aprecio la conveniencia. – fostandy
Interesante. Al utilizar un ORM para el acceso a la base de datos, a menudo no uso explícitamente ExecuteScalar en mi código. Por lo general, termino recuperando objetos de entidad completos y mirando sus valores de esa manera. Entonces, si la entidad misma es nula, eso es una cosa, y si el valor es nulo, eso es otra cosa. Solo diferentes formas de hacerlo.Reconozco que ExecuteScalar es más eficiente si solo necesitas un solo valor. – jeremcc