加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

SQLite Int64与Int32问题和SubSonic ActiveRecord

发布时间:2020-12-12 18:52:51 所属栏目:百科 来源:网络整理
导读:我认为这在其他地方有所涉及,但我现在还没有看到.无论如何,有一个简单的v3查询的问题.使用SQLite ADO.NET提供程序1.0.65.0.我的表结构如下所示: CREATE TABLE "SamplerData" ("RowId" INT PRIMARY KEY NOT NULL,"SampName" VARCHAR(128),"SampPurpose" VARC
我认为这在其他地方有所涉及,但我现在还没有看到.无论如何,有一个简单的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给你的东西.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读