2009-08-26 8 views
3

Je pensais que c'était couvert ailleurs, mais je ne le vois pas maintenant. Quoi qu'il en soit, avoir un problème avec une simple requête v3. À l'aide du fournisseur SQLite ADO.NET 1.0.65.0. Ma structure de table ressemble à ceci:SQLite Int64 vs Int32 Problème et SubSonic ActiveRecord

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

Mon fichier Structs1.cs a cela il:

 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 
     }); 

J'ai une requête dans un codebehind WPF qui ressemble à ceci:

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

Un point d'arrêt défini pour afficher la valeur de sqlsql montre ceci:

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

ensuite le code avec lancers francs:

{ "Objet de type 'System.Int64' ne peut pas être convertie en type 'System.Int32'"}

A "trouver" dans Visual Studio n » ai pas t montrez moi où la conversion Int64 se passait. Je comprends que SQLite utilise Int64 pour les colonnes d'identité, mais pas pourquoi/comment SubSonic gère la conversion quand le Structs le fait de toute façon Int32.

Aide ?!

Merci ..

Répondre

4

Je ne sais pas beaucoup sur subsonique, mais le client ADO.NET pour SQLite utilise int64 pour toutes les colonnes entières. Sans connaître SubSonic, c'est juste une supposition, mais vous voudrez peut-être changer les colonnes DbType.Int32 en DbType.Int64. Il est probable que la requête s'exécute correctement, mais les valeurs de retour (initialement non typées, dans le mode ADO.NET) sont en train d'être déballées dans certaines structures de données SubSonic - des structures qui devraient être des entiers 32 bits, en fonction de votre DbType.Int32 instruction. Vous ne pouvez pas unbox un long dans un int (c'est-à-dire (int)(object)(long)0 lèvera une exception) - vous devez donc dire à SubSonic d'attendre des entiers 64 bits, puisque c'est ce que SQLite va vous donner.

9

Nous l'avons corrigé avec la dernière version - le fichier SQLite.tt ne traduisait pas correctement l'entier PK en long (int 64). Si vous prenez les derniers morceaux à Github, il devrait être résolu. Assurez-vous de saisir dans le projet de modèles.

+1

Word up. Merci Rob! – Snowy