SQLite Int64与Int32问题和SubSonic ActiveRecord

前端之家收集整理的这篇文章主要介绍了SQLite Int64与Int32问题和SubSonic ActiveRecord前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我认为这在其他地方有所涉及,但我现在还没有看到.无论如何,有一个简单的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,IsForeignKey = false
        });

        Columns.Add(new DatabaseColumn("SampPurpose",IsForeignKey = false
        });

        Columns.Add(new DatabaseColumn("ActiveState",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时处理转换的原因.

救命?!

谢谢..

解决方法

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

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

猜你在找的Sqlite相关文章