Frage

Haben 2 MySQL Datenbanken. Eine davon ist die Hauptdatenbank, die andere für die Entfernung zu kennen verwendet wird. Nun, für SubSonic schön mit den erzeugten Dateien über Subcommander zu spielen, ich machte es einfach und nur eine Ansicht erstellt, dass die Karten auf die Entfernung zu kennen in der anderen Datenbank (auf diese Weise alle Tabellen und die Entfernung zu kennen ist technisch in einer Datenbank).

Nun, das Problem, das ich in laufen lasse, ist dies: In der Geolocation-Tabelle gibt es zwei Felder (Breitengrad, longtitude), die beide Schwimmer.

Wenn ich Ihren Standard SubSonic Anweisung ausführen, um die Daten zu erhalten:

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

bekomme ich diese Ausnahme in meinen Tests Projekt: 'TestCanGetZipData' ist fehlgeschlagen: System.ArgumentException: Objekt des Typs 'System.Single' kann nicht auf den Typ 'System.Decimal' umgewandelt werden

.

Es sieht aus wie SubSonic vergleicht float Felder dezimal. Aber diese Ausnahme ist mir zu werfen für eine Schleife. Jede Art und Weise, dies zu umgehen? FWIW, auf alle anderen 200 + Tabellen wir dezimal für unsere Felder verwenden, die solche benötigen. Aber da dies eine 3rd-Party-Datenbank-Tabelle ist, sie verwenden Schwimmer und es verursacht Probleme.

Jeder Lauf in dieser Situation?

War es hilfreich?

Lösung

Eine Lösung wäre, die ExecuteTypedList Methode zu verwenden.

  1. Sie haben eine DTO-Klasse zu erstellen:

    public class ZipDatumHelperClass
    {
        public int Id {get;set;}
        public string ZipCode {get;set;}
        public single Latitude {get;set;}
        public single Longitude {get;set;}
    }
    
  2. umschreiben Sie Ihre Frage an

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

Die ExecuteTypedList Methode ist ein sehr generischer Ansatz, da es versucht, Spalten Eigenschaften Ihrer Klasse von einem Datareader zu entsprechen. Es ist sehr spezifisch, da sie

ist

a Case Sensitive
b Ihre Eigenschaften haben genau den Systemtyp durch die Datareader

retured übereinstimmen

Sie Ihren Testlauf lassen und das Ergebnis ändern, bis Sie keine Fehlermeldungen erhalten.

Eine andere Lösung wäre, die SubSonic Quelle zu ändern System Single für die Ansichten zu erzeugen MySQL geben.

https://github.com/subsonic/ SubSonic-2.0 / Blob / Master / SubSonic / Dataprovider / MySqlDataProvider.cs

public override DbType GetDbType(string mySqlType) { }

get ist der DbType von mysqltype (dezimal für dezimal erstellt wird, Schwimmer, newdecimal, numerisch, Doppel, real) Sie müssen herausfinden, welche man hier falsch ist und das Rück DbType.Single statt.

https://github.com/subsonic/SubSonic- 2.0 / Blob / Master / SubSonic / Utility.cs

public static string GetSystemType(DbType dbType) { }

Zur Info: get ist das System.Type für den angegebenen DbType. Sie sollten das nicht ändern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top