Проблема с целочисленным и типом данных SQLite - PullRequest
3 голосов
/ 24 августа 2009

Я сталкиваюсь с проблемой: Объект типа 'System.Int64' не может быть преобразован в тип 'System.Int32' при запуске проекта SubSonic.Examples.SimpleRepo на основе поставщика SQLite.

Мне нравится, что тип данных для столбца CategoryID таблицы CategoryID равен ' integer ', а 'integer' в SQLite будет возвращаться как Int64 , в то же время CategoryID тип данных в категории классов - 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 ]

7 голосов
/ 24 августа 2009

PrimaryKey в SQLite имеет значение int 64 (long), поэтому вам также необходимо установить long.

6 голосов
/ 24 августа 2009

Забавно, я только что прочитал документацию по sqlite3 об этом около часа назад. Так что вам повезло:)

См. Документ самостоятельно (Прокрутите до конца раздел 64-битных ROWID).

Вот выдержка:

Чтобы минимизировать объем памяти, 64-битный rowid хранится как целое число переменной длины. Rowids от 0 до 127 используют только один байт. Rowids от 0 до 16383 использует всего 2 байта. До 2097152 используется три байта. И так далее. Отрицательные строки допускаются, но они всегда используют девять байтов памяти, поэтому их использование не рекомендуется. Когда rowite автоматически генерируется SQLite, они всегда будут неотрицательными.

0 голосов
/ 30 ноября 2011

Я только запнулся, запустив процедуру слияния, взяв таблицу данных SQL Server и объединив ее (upsert) с таблицей данных SQLite (приложение c # .NET win forms). Вам определенно нужно установить целочисленные PK-столбцы в базе данных SQL Server на BIGINT, чтобы это работало. В противном случае при вызове слияния для таблицы данных SQLite вы получите ошибку несоответствия типов.

...