Pregunta

Tiene 2 bases de datos MySQL. Una de ellas es la base de datos principal, el otro se utiliza para los datos de geolocalización. Ahora, por SubSonic jugar agradable con los archivos generados a través subcomandante, lo hice fácil y simplemente crea una vista que se asigna a los datos de geolocalización en la otra base de datos (de esa manera todas las tablas y los datos de geolocalización es técnicamente en una base de datos).

Ahora, el problema que estoy corriendo en es la siguiente: En la mesa de geolocalización, hay 2 campos (latitud, longtitude), que son ambos flotadores.

Al ejecutar su estado de SubSonic estándar para obtener los datos:

return new Select()
            .From(ZipDatum.Schema)
            .Where(ZipDatum.Columns.Zipcode).IsEqualTo(zipCode)
            .ExecuteSingle<ZipDatum>();

Me conseguir esta excepción en mi proyecto de pruebas: 'TestCanGetZipData' falló: System.ArgumentException: objeto de tipo 'System.Single' no se puede convertir al tipo 'System.Decimal'

.

Parece que SubSonic Likens campos float a decimal. Sin embargo, esta excepción me está tirando para un bucle. Cualquier forma de evitar esto? Fwiw, en todos los otros más de 200 mesas que estamos usando decimal para los campos que requieren tales. Pero como esto es una tercera tabla de la base del partido, que están usando flotador y está causando problemas.

Cualquier carrera en esta situación?

¿Fue útil?

Solución

Una solución sería utilizar el método ExecuteTypedList.

  1. Hay que crear una clase DTO:

    public class ZipDatumHelperClass
    {
        public int Id {get;set;}
        public string ZipCode {get;set;}
        public single Latitude {get;set;}
        public single Longitude {get;set;}
    }
    
  2. reescribir su consulta a

    List<ZipCodeHelperClass> result = new Select()
        .From(ZipDatum.Schema)
        .Where(ZipDatum.Columns.Zipcode).IsEqualTo(zipCode)
        .ExecuteTypedList<ZipDatumHelperClass>();
    

El método ExecuteTypedList es un enfoque muy genérico, ya que intenta hacer coincidir las columnas de un DataReader para propiedades de su clase. Es muy específico ya que es

un caso delicado
b sus propiedades tienen que coincidir exactamente con el tipo de sistema retured por el DataReader

Deja que tu prueba de funcionamiento y modificar el resultado hasta que no recibe ningún error.

Otra solución sería modificar la fuente SubSonic para generar el tipo de sistema único para las vistas MySQL escribir.

https://github.com/subsonic/ SubSonic-2,0 / blob / master / SubSonic / DataProviders / MySqlDataProvider.cs

public override DbType GetDbType(string mySqlType) { }

get es el DbType de mysqltype (decimal se crea para decimal, float, newdecimal, numérico, doble, real) Usted tiene que averiguar cuál es incorrecto aquí y regresar DbType.Single lugar.

https://github.com/subsonic/SubSonic- 2,0 / blob / master / SubSonic / Utility.cs

public static string GetSystemType(DbType dbType) { }

Para su información: get es el System.Type para la DbType especificado. No debe modificar eso.

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