Используя System.Data.SQLite
, я создаю таблицу с целочисленными столбцами без знака:
@"CREATE TABLE widgets (" +
@"id unsigned integer(10) PRIMARY KEY, " +
@"fkey unsigned integer(10), " + ...
а затем вставьте такие значения, как
INSERT INTO widgets (id, fkey, ...) VALUES (4294967295, 3456, ...
Однако, перебирая строки и столбцы этой таблицы, я обнаруживаю, что row["id"]
имеет тип System.Int32
(а не UInt32
) и, что неудивительно, 4294967295 интерпретируется как -1. На самом деле, все беззнаковые целые поля в таблице (не только идентификатор первичного ключа неправильно набран как System.Int32
)
Между тем спецификация типа SQLite говорит, что целые числа хранятся в 1, 2, 3, 4, 6 или 8 байтах в зависимости от величины значения. 4294967295 = 0xFFFFFFFF занимает всего четыре байта. Это также кажется несовместимым с так называемой «динамической типизацией» SQLite. Когда я вставляю больше, чем 4294967295 положительных значений, тип остается System.Int32
.
Это баг или фича?
PS1:
моя таблица содержит 1 строку с идентификатором столбца = 2 ^ 32-1 = 4294967295 (или больше), и я печатаю типы всех столбцов с помощью
public void PrintDataTypes(DataTable dt) {
foreach (DataRow row in dt.Rows) {
foreach (DataColumn col in dt.Columns)
Console.WriteLine("name={0}, type={1}",
col.ToString(),
row[col].GetType().ToString());
return; // after 1st row is done
}
}
И я неизменно получаю
name=id, type=System.Int32
name=fkey, type=System.Int32
...
Int32
, вы можете опубликовать код, который вы используете для чтения из таблицы. - person C.Evenhuis   schedule 18.11.2013Int32
выглядит как ошибка в драйвере БД. - person CL.   schedule 18.11.2013uint val = (uint)signedIntegerValue
. - person Erik   schedule 31.03.2014