SQLite ADO .NET и ExecuteScalar () - PullRequest
       15

SQLite ADO .NET и ExecuteScalar ()

3 голосов
/ 28 ноября 2009

В документации по SQLite ADO .Net (sqlite.phxsoftware.com) для метода запроса ExecuteScalar () написано: «Выполните команду и верните первый столбец первой строки набора результатов (если имеется) или ноль, если нет набора результатов был возвращен. Я создал таблицу:

create table users ( id integer primary key, name text )

И выполнил очередь с ExecuteScalar ():

select ( id ) from users where name = @name

Но, очень странно - я не могу привести значение retur к 'int', только к 'long'! Почему так, поле «id» определяется как «целое» в базе данных, а не «bigint»?

Ответы [ 2 ]

5 голосов
/ 28 ноября 2009

Это потому, что SQLite "INTEGER PRIMARY KEYS" на самом деле не целые числа, а long (64-битные целые числа). Из документации :

Каждая строка каждой таблицы SQLite имеет 64-разрядный целочисленный ключ со знаком уникальный в той же таблице. это Целое число обычно называется «rowid». Rowid - это фактический ключ, используемый в B-дерево, которое реализует SQLite Таблица. Ряды хранятся в порядке строк. Значение rowid можно получить с помощью одно из специальных имен "ROWID", «OID» или « ROWID ».

Если столбец объявлен как INTEGER PRIMARY KEY, тогда этот столбец это не "реальный" столбец базы данных, но вместо этого становится псевдонимом для ROWID. В отличие от обычных столбцов SQLite, rowid должен быть ненулевым целым числом значение. Rowid не может удерживать значения с плавающей точкой, строки, BLOB, или NULL.

Столбец INTEGER PRIMARY KEY является псевдоним для 64-разрядного целого числа со знаком ROWID.

Это побочный эффект механизма динамической типизации SQLite .

На практике, чтобы ответить на ваш вопрос, вы должны извлечь значение как можно дольше и по возможности поработать с ним, используя только операторы приведения или класс Convert, если значение соответствует 32-битному. Поскольку это в точности идентификатор, вам не нужно преобразовывать или приводить его к 32-разрядному целому числу.

2 голосов
/ 28 ноября 2009

Я не знаком с SQLite, поэтому не могу комментировать его поведение, но это должно работать, пока значение соответствует 32 битам:

Convert.ToInt32(...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...