Старая версия SQLite DB + BOOL + странный браузер БД - PullRequest
0 голосов
/ 06 марта 2019

Я взял на себя работу над проектом C #, в котором использовалась база данных SQLite, созданная не менее 3 лет назад. Предыдущий разработчик использовал некоторый плагин для FireFox для управления БД.

Когда я вступил во владение, я установил DB Browser и открыл DB, чтобы добавить несколько новых полей. Когда я выбираю изменить таблицу, я вижу ряд полей типа BOOL Когда я создаю новые поля, BOOL не вариант. Я читал, где SQLite не имеет родной BOOL, например, t-sql, и это нормально. Я могу легко сохранить значения bool как int 1 или 0.

1) Но почему DB Browser показывает мне BOOL как тип некоторых существующих полей?

2) И почему этот C # работает с этими полями BOOL? rs - это набор записей в этой таблице SQLite, а EnableNFCTools - одно из полей, которое отображается как тип BOOL. Этот код правильно устанавливает переменную enableNFCTools из значения DB.

bool.TryParse(string.Format("{0}", rs["EnableNFCTools"]), out enableNFCTools);

Приведенные выше коды не работают с новыми полями INTEGER, которые я добавил, и теперь мне нужно использовать что-то подобное, чтобы правильно получить настройки из этих полей INTEGER.

if ((long)rs["BadgePrintingEnabled"] == 1)
 badgePrintingEnabled = true;
else
 badgePrintingEnabled = false;

Опять же, если в действительности нет типа BOOL, то почему DB Browser показывает BOOL для некоторых из существующих полей в этой базе данных, по крайней мере, трехлетней давности? И почему C # bool работает с этими типами BOOL?

1 Ответ

0 голосов
/ 06 марта 2019

Очевидно, что SQLite имеет тип BOOL, и он работает как настоящий тип БД BOOL (по крайней мере, в моем коде C #).

Если вы используете Create Table, вы можете установить тип BOOL и DB Browser БУДЕТ показывать тип как BOOL, но вы не можете изменить любые существующие столбцы на Type BOOL.

И в вашем коде C # вы должны обработать этот столбец BOOL из БД Как тип BOOL, НЕ как тип INTERGER.

И NUMERIC - не действует как тип BOOL. Когда я пытаюсь установить переменную C # из поля NUMERIC, ни один из указанных выше способов получения значения из базы данных не работает.

Под капотом SQLite что-то делает с типом BOOL, который мы здесь не совсем понимаем.

Использование GetType (). ToString () Я обнаружил, что эти типы SQLite отображаются в C # как эти типы: Debug.Write (rs ["Поле проверяемого типа"]. GetType (). ToString ());

SQLite Type / C# GetType().ToString()
------------------------------------
NUMERIC = System.Decimal
INTEGER = System.Int64
BOOL = System.Boolean 

Да, в SQlite действительно есть тип BOOL, или, по крайней мере, действует как BOOL в C # ...

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