SQLite Int64与Int32问题和SubSonic ActiveRecord

时间:2009-08-26 13:24:36

标签: sqlite activerecord subsonic subsonic3

我认为这在其他地方有所涉及,但我现在还没有看到。无论如何,有一个简单的v3查询的问题。使用SQLite ADO.NET提供程序1.0.65.0。我的表结构如下所示:

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

我的Structs1.cs文件中包含此内容:

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

我在WPF代码隐藏中有一个查询,如下所示:

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

设置为显示sqlsql值的断点显示:

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

然后代码抛出:

{“'System.Int64'类型的对象无法转换为'System.Int32'类型。”}

Visual Studio中的“查找”没有显示Int64转换发生的位置。我知道SQLite使用Int64作为标识列,但不知道为什么/如何在Structs将Int32变为Int32时处理转换。

帮助?!

谢谢..

2 个答案:

答案 0 :(得分:9)

我们用最新版本修复了这个问题 - SQLite.tt文件没有正确地将整数PK转换为long(int 64)。如果您在Github上获取最新位,则应该解决。确保从模板项目中获取。

答案 1 :(得分:4)

我对SubSonic了解不多,但sqlite的ADO.NET客户端对所有整数列使用int64。在不知道SubSonic的情况下,这只是猜测,但您可能希望将DbType.Int32列更改为DbType.Int64。

最有可能的是,查询实际上正常运行,但返回值(最初以ADO.NET方式进行非类型化)被拆箱到一些SubSonic数据结构中 - 它认为应该是32位整数的结构,基于您的DbType .Int32声明。你不能将一个长整数拆分成一个int(即(int)(object)(long)0将抛出异常) - 所以你需要告诉SubSonic期望64位整数,因为这就是SQLite给你的东西。