Tinyint mapeado con campos booleanos en C #

c# dapper mysql

Pregunta

Intento mapear el campo 'tinyint' con 'booleano', pero me da el problema por debajo. Este problema está llegando con la base de datos local solo con la base de datos activa funciona bien. No entiendo dónde está el problema, podría ser su problema de la región. Estoy usando dapper para el propósito de mapeo. Por favor, ayúdenme si tiene alguna idea, a continuación se copia excepción.

Se produjo una excepción de primera oportunidad del tipo 'System.Data.DataException' en DAL.dll. Información adicional: Error al analizar la columna 15 (IsBold = 1 - SByte).

Respuesta experta

Hmmm, eso suena como un error. Manejamos muchas conversiones similares.

La IL sin procesar (usando OpCodes.Conv_Ovf_I4 ) funciona bien en una prueba local; Estoy un poco obstaculizado aquí, porque no tengo MySQL a nivel local, y todos los servidores que contamos: sólo tienen tinyint sin signo. ¿Hay alguna excepción interna aquí, o algo más con lo que pueda trabajar? Pero: esta es probablemente una pregunta para la lista de problemas de github .


Respuesta experta

Instalé la edición de comunidad 5.7.11-log ( @@version reports 5.7.11-log ). Lo siguiente funciona bien en 1.50-beta9.

[FactMySql]
public void SO36303462_Tinyint_Bools()
{
    using (var conn = GetMySqlConnection(true, true, true))
    {
        try { conn.Execute("drop table SO36303462_Test"); } catch { }
        conn.Execute("create table SO36303462_Test (Id int not null, IsBold tinyint not null);");
        conn.Execute("insert SO36303462_Test (Id, IsBold) values (1,1);");
        conn.Execute("insert SO36303462_Test (Id, IsBold) values (2,0);");
        conn.Execute("insert SO36303462_Test (Id, IsBold) values (3,1);");

        var rows = conn.Query<SO36303462>("select * from SO36303462_Test").ToDictionary(x => x.Id);
        rows.Count.IsEqualTo(3);
        rows[1].IsBold.IsTrue();
        rows[2].IsBold.IsFalse();
        rows[3].IsBold.IsTrue();
    }
}
class SO36303462
{
    public int Id { get; set; }
    public bool IsBold { get; set; }
}

Por favor intente con 1.50-beta9. Si eso no lo soluciona, ayúdeme a reproducir una prueba fallida.


Respuesta popular

Puede hacer una extensión rápida del tipo de datos tinyint así:

public static class IntExtensions
{
   public static bool AsBool(this int value)
  {
     return value != 0;
  }
}

Entonces puede usar esto en cualquier parte de su código como tal:

IsBold == 1.AsBool()


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué