Int64 使用 SQLite 抛出“数字溢出”

问题描述 投票:0回答:4

我创建了一个带有

Int64
列的 SQLite 数据库(在 Windows 中)。我将数据库复制到我的 MonoTouch 程序中。

当我尝试读取 MonoTouch (Mono.Data.Sqlite) 中的列时,它会抛出“数字溢出”...

System.OverflowException: Number overflow.
  at System.Convert.ToInt32 (Int64 value) [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System/Convert.cs:1109 
  at System.Int64.System.IConvertible.ToInt32 (IFormatProvider provider) [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System/Int64.cs:553 
  at System.Convert.ToType (System.Object value, System.Type conversionType, IFormatProvider provider, Boolean try_target_to_type) [0x00139] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System/Convert.cs:2596 
  at System.Convert.ChangeType (System.Object value, System.Type conversionType, IFormatProvider provider) [0x00017] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System/Convert.cs:2204 
  at Mono.Data.Sqlite.SQLite3.GetValue (Mono.Data.Sqlite.SqliteStatement stmt, Int32 index, Mono.Data.Sqlite.SQLiteType typ) [0x0011e] in /Developer/MonoTouch/Source/mono/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLite3.cs:990 
  at Mono.Data.Sqlite.SqliteDataReader.GetValue (Int32 i) [0x00033] in /Developer/MonoTouch/Source/mono/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLiteDataReader.cs:796 
  at Mono.Data.Sqlite.SqliteDataReader.get_Item (Int32 i) [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLiteDataReader.cs:1023 
  at System.Data.Common.DbDataAdapter.FillFromReader (System.Data.DataTable table, IDataReader reader, Int32 start, Int32 length, System.Int32[] mapping, LoadOption loadOption) [0x0003e] in /Developer/MonoTouch/Source/mono/mcs/class/System.Data/System.Data.Common/DbDataAdapter.cs:365 
  at System.Data.DataTable.Load (IDataReader reader, LoadOption loadOption) [0x0002f] in /Developer/MonoTouch/Source/mono/mcs/class/System.Data/System.Data/DataTable.cs:2857 
  at System.Data.DataTable.Load (IDataReader reader) [0x00011] in /Developer/MonoTouch/Source/mono/mcs/class/System.Data/System.Data/DataTable.cs:2838 

知道为什么以及如何解决它吗?

ios sqlite mono xamarin.ios system.data
4个回答
1
投票

例外是由于数字无法转换为

int
(即它可以使用较小的
long
值)。不知怎的,代码在

在/Developer/MonoTouch/Source/mono/mcs/class/中的Mono.Data.Sqlite.SQLite3.GetValue(Mono.Data.Sqlite.SqliteStatement stmt,Int32索引,Mono.Data.Sqlite.SQLiteType典型)[0x0011e] Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLite3.cs:990

确定类型是

System.Int32
而不是
System.Int64
。这意味着堆栈上方的某些东西正在做出错误的决定或者数据表结构被误读。

遗憾的是我不知道如何解决这个问题。解决此问题的最佳方法是在 http://bugzilla.xamarin.com 打开错误报告,并附加一个简单的测试用例以及显示问题的数据库。这将使我们能够准确地了解问题所在并为您提供解决方案。


1
投票

我在 Microsoft Visual Studio 中的 SQLite 中遇到了同样的问题。对任何 Int64 列的选择都会导致溢出。我看起来像是 System.Data.DataTable 中的错误。出现错误的方法是dtTable.Load(aSQLDataReader);

我的解决方法是将查询中的所有 Int64 列转换为 TEXT。

代替

SELECT columName FROM tableName

我做到了

SELECT CAST(columnName as TEXT) columName FROM tableName

Sqlite 然后将值作为文本字段返回。


0
投票

您似乎正在从 SQLLite 读取 Int64 值并在序列化到 mongodb 时转换为 Int32,这将导致超出范围并引发错误。这是为 mongo 提出的 JIRA 链接和可能的解决方法。 Mongodb号码溢出错误


0
投票

我也遇到了同样的问题,经过彻底的调试后,我发现将数据库字段数据类型从“INT”更改为“INTEGER”解决了它。

客户端似乎误用了数据库数据类型来进行转换,即使对于数据库来说是相同的。

© www.soinside.com 2019 - 2024. All rights reserved.