Int64 выбрасывает «переполнение номера» с использованием SQLite - PullRequest
1 голос
/ 10 января 2012

Я создал базу данных SQLite (в Windows) со столбцом Int64.Я скопировал базу данных в свою программу 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 

Любая идея, почему и как я мог это исправить?

Ответы [ 3 ]

1 голос
/ 11 января 2012

Исключение обусловлено числом, которое нельзя преобразовать в int (т. Е. Оно будет работать с небольшими значениями long).Каким-то образом код в

в Mono.Data.Sqlite.SQLite3.GetValue (Mono.Data.Sqlite.SqliteStatement stmt, индекс Int32, Mono.Data.Sqlite.SQLiteType typ) [0x0011e] в /Разработчик / MonoTouch / Source / mono / mcs / class / Mono.Data.Sqlite / Mono.Data.Sqlite_2.0 / SQLite3.cs: 990

решают, что типом является System.Int32 вместоSystem.Int64.Это означает, что что-то выше, чем в стеке, принимает неверное решение или структура данных, которая неверно читается.

К сожалению, я не уверен, как вы можете обойти это.Лучший способ решить эту проблему - открыть отчет об ошибке по номеру http://bugzilla.xamarin.com и приложить простой контрольный пример с базой данных, которая показывает проблему.Это позволит нам увидеть, где именно проблема, и предоставить вам исправление.

1 голос
/ 20 февраля 2015

Я столкнулся с той же проблемой в SQLite в Microsoft Visual Studio. Выбор в любом столбце Int64 приводит к переполнению. Я похож на ошибку в System.Data.DataTable. Метод с ошибкой dtTable.Load (aSQLDataReader);

Мой обходной путь - привести все столбцы Int64 к TEXT в запросе.

вместо SELECT columName FROM tableName

Я сделал SELECT CAST(columnName as TEXT) columName FROM tableName

Затем Sqlite возвращает значение в виде текстового поля.

0 голосов
/ 10 января 2012

Кажется, что вы читаете значение Int64 из SQLLite и конвертируете в Int32 при сериализации в mongodb, что приведет к выходу за пределы диапазона и выдаче ошибки. Вот ссылка для JIRA, поднятая для Монго и возможного обходного пути. Ошибка переполнения номера Mongodb

...