Когда я выбираю из столбца sqlite типа 'int', я могу привести к .net int, но когда я выбираю из столбца 'integer', я не могу - PullRequest
7 голосов
/ 07 февраля 2011

Я использую System.Data.SQLite, выбирая из таблицы базы данных sqlite, где столбец имеет тип 'integer', и когда я делаю что-то вроде этого:

int x = (int)reader["myColumn"];

, это не удается.Проблема не в том, что значение равно нулю;столбец не обнуляется.Если я изменю тип данных столбца на 'int', он будет работать нормально.Значения в столбце: «2», «3», «4» и т. Д .;ничего очень большого.

Кто-нибудь знает, является ли это ожидаемым поведением?

Ответы [ 3 ]

10 голосов
/ 08 февраля 2011

Как упомянул другой ответчик, целое число SQLite хранится в 1, 2, 3, 4, 6 или 8 байтах. Однако вы не получите переполнения или исключений из диапазона.

В этом контексте (int) - это приведение, а не преобразование. Если reader[] не возвращает объект типа integer, если он возвращает другой числовой тип, вы получите исключение приведения независимо от значения, которое оно содержит.

Исходя из диапазона допустимых значений для целого числа SQLite, я предполагаю, что оно возвращает значение в виде 64-разрядного целого числа, long. Чтобы проверить, попробуйте это:

object x = reader["myColumn"];
Debug.WriteLine(x.GetType().Name);
2 голосов
/ 22 марта 2011

Исключение возникает из-за того, что datareader.Item[] возвращает object.

Проблема связана с упаковкой / распаковкой.Это не имеет ничего общего с самой базой данных ...

long a = 1; 
int b = 2; 
object objectA = a; 
object objectB = b; 
Console.WriteLine((int)a); 
Console.WriteLine((long)b); 
Console.WriteLine((int)objectA); 
Console.WriteLine((long)objectB); 

Консоль выводит 2, а затем 1, но выдает исключение при приведении objectA, objectB.Это характеристика .NET, не имеющая ничего общего с драйверами ODBC.

0 голосов
/ 07 февраля 2011

SQLite http://www.sqlite.org/datatype3.html INTEGER. Значение представляет собой целое число со знаком, сохраняемое в 1, 2, 3, 4, 6 или 8 байтах в зависимости от величины значения.

.NET http://msdn.microsoft.com/en-us/library/cs7y5x0x(VS.90).aspx int -2 147 483 648 .. 2 147 483 647

Таким образом, можно ожидать ошибки переполнения или выхода за пределы диапазона для больших целочисленных значений SQlite.

...