Question

Have 2 bases de données MySQL. La première est la base de données principale, l'autre est utilisé pour les données de géolocalisation. Maintenant, pour SubSonic jouer agréable avec les fichiers générés par Subcommander, je l'ai fait facile et vient de créer une vue que les cartes aux données de géolocalisation dans l'autre base de données (de cette façon toutes les tables et les données de géolocalisation est techniquement dans une base de données).

Maintenant, la question que je suis en cours d'exécution en est la suivante: Dans le tableau de géolocalisation, il y a 2 champs (latitude, Longtitude) qui sont tous les deux flotteurs.

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 convertie en type 'System.Decimal'

.

On dirait que les champs de flotteur de subsonique décimal. Mais cette exception me lancer pour une boucle. De toute façon de contourner ce problème? FWIW, sur toutes les autres tables 200+ que nous utilisons pour nos champs décimales qui nécessitent tel. Mais puisque c'est une 3ème table de base de données de partie, ils utilisent float et il est à l'origine des problèmes.

run Toute personne dans cette situation?

Était-ce utile?

La solution

Une solution serait d'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. réécrire 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 les colonnes d'une 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

Il suffit de laisser votre essai et de modifier le résultat jusqu'à ce que vous ne recevez pas d'erreur.

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

https://github.com/subsonic/ SubSonic-2,0 / blob / maître / 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 savoir lequel est faux ici et retour DbType.Single à la place.

https://github.com/subsonic/SubSonic- 2,0 / blob / maître / SubSonic / Utility.cs

public static string GetSystemType(DbType dbType) { }

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top