关于SQLite的整数和int数据类型的问题

时间:2009-08-24 02:56:20

标签: c# sqlite subsonic subsonic3

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

我喜欢表类别的列CategoryID的数据类型是'整数',而SQLite中的'整数'将作为 Int64 返回,同时ClassID中ClassID的数据类型是 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 ");

谁可以告诉我这些代码的目的? 如何解决数据类型转换错误?

3 个答案:

答案 0 :(得分:7)

主键在SQLite中设置为int64(long) - 所以你需要将你的设置为long。

答案 1 :(得分:6)

有趣的是,我刚刚在一小时前阅读了sqlite3文档。所以你很幸运:))

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

以下是摘录:

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

答案 2 :(得分:0)

我只是通过合并程序结结巴巴,使用SQL Server DataTable并将其与SQLite DataTable(c#.NET win forms app)合并(upsert)。您肯定需要将SQL Server数据库中的整数PK列设置为BIGINT以使其飞行。否则,当您在SQLite DataTable上调用merge时,会出现类型不匹配错误。