2010-12-04 33 views
1

Avoir 2 bases de données MySQL. L'un est la base de données principale, l'autre est utilisé pour les données de géolocalisation. Maintenant, pour que SubSonic joue bien avec les fichiers générés via Subcommander, je l'ai simplifié et créé une vue qui correspond aux données de géolocalisation de l'autre base de données (ainsi toutes les tables et données de géolocalisation sont techniquement dans une base de données).SubSonic: MySql, Float et Single-> Decimal issues

Maintenant, le problème que je rencontre est le suivant: Dans la table de géolocalisation, il y a 2 champs (latitude, longtitude) qui sont tous deux flottants.

Quand je lance votre énoncé de la norme subsonique pour obtenir les données:

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

Je reçois cette exception dans mon projet tests: 'TestCanGetZipData' a échoué: System.ArgumentException: objet de type 'System.Single' ne peut pas être converti en type 'System.Decimal'.

Il semble que SubSonic compare les champs flottants à décimaux. Mais cette exception me lance pour une boucle. Un moyen de contourner cela? FWIW, sur toutes les autres tables de plus de 200+, nous utilisons des décimales pour nos champs qui en ont besoin. Mais comme il s'agit d'une table de base de données tierce, ils utilisent float et cela pose des problèmes.

Quelqu'un se heurte-t-il à cette situation?

Répondre

1

Une solution consisterait à utiliser la méthode ExecuteTypedList.

  1. Vous devez créer une classe 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. Ressaisissez votre requête pour

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

La méthode ExecuteTypedList est une approche très générique car il essaie de faire correspondre colonnes d'un DataReader aux propriétés de votre classe. Il est très spécifique car il est

un cas sensible
b vos propriétés doivent correspondre exactement au type de système retured par le DataReader

laissez votre essai et de modifier le résultat jusqu'à ce que vous ne recevez pas des erreurs.

Une autre solution serait de modifier la source SubSonic pour générer un type de système unique pour les vues de type mysql.

https://github.com/subsonic/SubSonic-2.0/blob/master/SubSonic/DataProviders/MySqlDataProvider.cs

public override DbType GetDbType(string mySqlType) { } 

get DbType de mysqltype (décimal est créé pour décimal, float, newdecimal, numérique, double, réel) Vous devez comprendre que l'on ne va pas ici et retour DbType.Single au lieu.

https://github.com/subsonic/SubSonic-2.0/blob/master/SubSonic/Utility.cs

public static string GetSystemType(DbType dbType) { } 

Pour votre information: get est le System.Type pour le DbType spécifié. Vous ne devriez pas le modifier.