【问题标题】:Problem about SQLite's integer and int datatype关于 SQLite 的整数和 int 数据类型的问题
【发布时间】:2010-11-22 03:51:42
【问题描述】:

我遇到一个问题:基于 SQLite 提供程序运行 SubSonic.Examples.SimpleRepo 项目时,“System.Int64”类型的对象无法转换为“System.Int32”类型。 p>

我喜欢表Categories列CategoryID的数据类型是'integer',同时SQLite中的'integer'会返回为Int64 Class Category中CategoryID的数据类型为int,出现上述错误。

我查看了SubSonic的源码:\SubSonic.Core\SQLGeneration\Schema\SQLiteSchema.cs,发现如下代码:

else if (column.IsPrimaryKey && column.DataType == DbType.Int32
    || column.IsPrimaryKey && column.DataType == DbType.Int16
    || column.IsPrimaryKey && column.DataType == DbType.Int64
    )
    sb.Append(" integer ");

谁能告诉我这些代码的用途? 数据类型转换错误如何解决?

【问题讨论】:

    标签: c# sqlite subsonic subsonic3


    【解决方案1】:

    有趣的是,大约一个小时前,我刚刚阅读了有关这方面的 sqlite3 文档。所以你很幸运:)

    See the doc yourself(滚动到底部,64 位 ROWID 部分)。

    摘录如下:

    为了最小化存储空间,将 64 位 rowid 存储为变量 长度整数。 0 到 127 之间的 Rowid 仅使用一个字节。 0 到 16383 之间的行仅使用 2 个字节。最多 2097152 使用三个 字节。等等。允许使用负 rowid,但它们总是使用 九个字节的存储空间,因此不鼓励使用它们。当 rowids 是 由 SQLite 自动生成,它们将始终为非负数。

    第三方编辑

    我很惊讶Id-column 尽管被创建为 int 列,但也被映射到 long

    CREATE TABLE "Example" (
        "Id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
        "Foo" TEXT NULL,
        "SomeDate" DATETIME NULL
    )  
    

    解释也在64-bit ROWID section

    表的每一行都有一个唯一的 rowid。如果表定义了一个列 类型为“INTEGER PRIMARY KEY”,则该列成为别名 为rowid。但是有或没有 INTEGER PRIMARY KEY 列, 每行仍然有一个 rowid。

    在 SQLite 3.0 版中,rowid 是一个 64 位有符号整数。

    【讨论】:

    • 非常感谢您的回复,我想我需要详细阅读 SQLite 文档。
    【解决方案2】:

    在 SQLite 中,PrimaryKey 设置为 int 64(long) - 所以你也需要将你的设置为 long。

    【讨论】:

    • 似乎使用 long 是唯一的解决方案。
    【解决方案3】:

    我只是结结巴巴地完成了一个合并过程,获取了一个 SQL Server 数据表并将其与一个 SQLite 数据表(c# .NET win forms 应用程序)合并(更新插入)。您肯定需要将 SQL Server 数据库中的整数 PK 列设置为 BIGINT 才能使其正常运行。否则,当您在 SQLite DataTable 上调用 merge 时,会出现类型不匹配错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 2013-11-17
      • 1970-01-01
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多