我遇到了一个问题:在运行基于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 ");
谁可以告诉我这些代码的目的? 如何解决数据类型转换错误?
答案 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时,会出现类型不匹配错误。