2016-10-11 6 views
3

Ich verwende fastcrud und dapper, um meine Abfrageergebnisse meinem benutzerdefinierten Typ zuzuordnen. Ich untersuchte die Dapper-Bibliothek und kam zu dem Schluss, dass dies ein Problem mit dem Microsoft.Data.Sqlite-Paket ist. Ich bin mir nicht sicher, ob es dort repariert werden muss, aber das ist das Problem.Sqlite mit Dapper. Fehler beim Analysieren der Spalte. Objekt des Typs System.Int64 kann nicht in den Typ System.Double geschrieben werden

Vor dem Analysieren jeder Zeile aus dem Abfrageergebnis verwendet Dapper die GetFieldType-Methode aus der SqliteDataReader-Klasse, um die richtigen Spaltentypen zu ermitteln.

die folgende Tabelle Stellen Sie sich vor:

Id | MinTemp | MaxTemp 

1 | 10.5 | 18.2 

2 | 10.6 | 20 

Die sqlitedatareader.GetFieldType Methode gibt Ihnen die folgenden Arten:

System.Int64 für Id und System.Double für beide MinTemp und MaxTemp Diese scheint korrekt zu sein, aber beim Parsen der Ergebnisse tritt der folgende Fehler in Zeile 2 auf:

Fehler beim Analysieren der Spalte 10 (MaxTemp = 20 - Int64) Das Objekt vom Typ 'System.Int64' konnte nicht in den Typ 'System.Double' umgewandelt werden.

Aufgrund der dynamic type system of SQLite ändert es den Typ für MaxTemp in Zeile 2 zu System.Int64. Aber da Dapper den Typ für MaxTemp definiert hat, um ihn zu verdoppeln, verursacht dies den oben genannten Fehler.

Wenn ich meinen MaxTemp-Wert in meiner SQLite-Datenbank auf 20.00001 ändern, ist das Problem behoben, aber das ist nicht korrekt.

Gebraucht Pakete: "Microsoft.Data.Sqlite": "1.0.0"

Jeder weiß, wie dieses Problem zu lösen?

+0

In einem ähnlichen Problem selbst mit Microsoft.Data.Sqlite und Dapper. Ich habe eine SQLite-Spalte als Ganzzahl definiert, aber mein Modell verwendet eine Bool. Für den Moment habe ich diese spezifische Abfrage neu geschrieben, um SqliteConnection, SqliteCommand und SqliteDataReader zu verwenden. Nicht mein Favorit, aber schneller als das Wurzelproblem zu erforschen. –

+0

Sieht aus wie ein bekanntes Problem. https://github.com/StackExchange/Dapper/issues/642 – Eric

+0

Habe gerade das gleiche Problem in einem ähnlichen Beispiel gesehen. Reihe # 2 wirft. – DaveInCaz

Antwort

1

Dies scheint ein Bug/Fehler in Dapper zu sein:

https://github.com/StackExchange/Dapper/issues/642

Da SQLite Wert Affinität verwendet, wird der Wert 20 in der zweiten Reihe des Beispiels wie ein INT behandelt wird. (Auch wenn es wörtlich als '20.0' oder '20.00' usw. eingefügt wurde)

Scheinbar Dapper versäumt es, die verschiedenen Typen einzeln zu behandeln, die für jedes einzelne Feld zurückkommen.

Eine Problemumgehung für dieses Problem scheint eine SQL CAST() zu verwenden. Beispiel:

SELECT CAST(field123 AS REAL) AS field123 FROM ...

Dies erscheint, um den Fehler zu erhalten.

Verwandte Themen