2009-08-26 10 views
3

Ich dachte, dies wurde anderswo abgedeckt, aber ich sehe es jetzt nicht. Wie auch immer, ein Problem mit einer einfachen v3-Abfrage. Verwenden von SQLite ADO.NET-Provider 1.0.65.0. Meine Tabellenstruktur sieht wie folgt aus:SQLite Int64 vs Int32 Problem und SubSonic ActiveRecord

CREATE TABLE "SamplerData" ("RowId" INT PRIMARY KEY NOT NULL ,"SampName" VARCHAR(128),"SampPurpose" VARCHAR(2048),"ActiveState" INTEGER NOT NULL DEFAULT 1) 

Meine Structs1.cs Datei hat das darin:

 Columns.Add(new DatabaseColumn("RowId", this) 
     { 
       IsPrimaryKey = true, 
       DataType = DbType.Int32, 
       IsNullable = false, 
       AutoIncrement = false, 
       IsForeignKey = false 
     }); 

     Columns.Add(new DatabaseColumn("SampName", this) 
     { 
       IsPrimaryKey = false, 
       DataType = DbType.AnsiString, 
       IsNullable = true, 
       AutoIncrement = false, 
       IsForeignKey = false 
     }); 

     Columns.Add(new DatabaseColumn("SampPurpose", this) 
     { 
       IsPrimaryKey = false, 
       DataType = DbType.AnsiString, 
       IsNullable = true, 
       AutoIncrement = false, 
       IsForeignKey = false 
     }); 

     Columns.Add(new DatabaseColumn("ActiveState", this) 
     { 
       IsPrimaryKey = false, 
       DataType = DbType.Int32, 
       IsNullable = false, 
       AutoIncrement = false, 
       IsForeignKey = false 
     }); 

ich eine Abfrage in einer WPF-Code-Behind haben, die wie folgt aussieht:

SqlQuery sqlsql = new Select() 
    .From("SamplerData") 
    .Where("ActiveState") 
    .IsEqualTo(1); 
List<SamplerDatum> sampAll = sqlsql .ExecuteTypedList<SamplerDatum>(); 

Ein Haltepunkt, der den Wert von sqlsq anzeigt, zeigt dies:

{SELECT * FROM `SamplerData` WHERE ActiveState = @0} 

Dann wird der Code wirft mit:

{ "Objekt vom Typ 'System.Int64' nicht konvertiert werden kann 'System.Int32' eingeben"}

A "finden" in Visual Studio didn‘ t zeigen Sie mir, wo die Int64-Konvertierung stattfand. Ich verstehe, dass SQLite Int64 für Identitätsspalten verwendet, aber nicht warum/wie SubSonic die Konvertierung verarbeitet, wenn Structs es trotzdem zu Int32 macht.

Hilfe ?!

Dank ..

Antwort

4

Ich weiß nicht viel über SubSonic, aber das ADO.NET-Client für SQLite verwendet int64 für alle Integer-Spalten. Ohne SubSonic zu kennen, ist dies nur eine Vermutung, aber Sie möchten vielleicht die DbType.Int32-Spalten in DbType.Int64 ändern.

Wahrscheinlich wird die Abfrage tatsächlich gut ausgeführt, aber die Rückgabewerte (untypisiert in ADO.NET-Mode) werden in einige SubSonic-Datenstrukturen entpackt - Strukturen, die nach Ihrer Meinung 32-Bit-Ganzzahlen sein sollten DbType.Int32-Anweisung. Sie können eine long in ein int auflösen (d. H. (int)(object)(long)0 wird eine Exception auslösen) - also müssen Sie SubSonic mitteilen, 64-Bit-Integer zu erwarten, da dies SQLite Ihnen geben wird.

9

Wir haben dies mit der neuesten Version behoben - die Datei SQLite.tt hat die Ganzzahl PK nicht korrekt in long konvertiert (int 64). Wenn Sie die neuesten Bits bei Github greifen, sollte es gelöst werden. Stellen Sie sicher, dass Sie aus dem Vorlagenprojekt greifen.

+1

Wort hoch. Danke Rob! – Snowy