Pregunta

Tengo una columna doble que acepta valores NULL en mi base de datos SQLite.

Al leer de la base de datos (para columnas de tipo doble), me gustaría convertir valores nulos en "doble.NaN".

Actualmente, Dapper establece valores nulos en 0, lo cual no quiero.

¿Cuáles son mis opciones?

  1. Modifique el código fuente de Dapper.
  2. ¿No puedo usar Dapper, necesito escribir mi propio código ADO.NET a la antigua usanza?
  3. cambiar la forma en que llamo al método cnn.Query, para modificar la forma en que ocurre el mapeo.

Mi primera opción es la opción 1, pero necesito ayuda para modificar Dapper.

¿Fue útil?

Solución

Personalmente, desaconsejaré esto;un valor nulo no es exactamente lo mismo que NaN.Si realmente quieres hacer esto, tendrías que mirar GetTypeDeserializer.El código para hacer esto se genera dinámicamente usando ILGenerator, y es bastante complejo.Si buscas una línea:

il.MarkLabel(isDbNullLabel); // incoming stack: [target][target][value]

aquí es donde el código se ramifica si un DbNull se detecta.Lo que hace actualmente es simplemente sacar los dos valores (el valor y el objetivo) de la pila, dejarlos caer al suelo y continuar.Deberías comprobar si float/double como caso especial, aplique su conversión y luego asigne el NaN al miembro.

Sin embargo, repito mi afirmación de que esto simplemente no es algo válido.Una opción mucho más sencilla sería:

public double? Value {get;set;}

que no requiere cambios y funcionará actualmente.Si realmente desea que se trate como un doble no anulable, tal vez:

private double foo = double.NaN;
public double Foo { get { return foo; } set { foo = value; } }

esto ahora será predeterminado NaN, y materializarse correctamente cuando hay valores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top