Установите значение базы данных в NULL

У меня есть двойное поле SQLite, которое используется для отображения даты. Для этого поля нет значения по умолчанию. Мне нужно, чтобы значение поля было ПУСТО (NULL), когда дата не введена, потому что, когда поле отображается как дата, оно показывает «12/30/1899». По какой-то причине я не могу установить поле в NULL. Я использую C ++ Berlin 10.1. Вот код:

FDQuery1->First();
while (!FDQuery1->Eof) {
if (!VarIsNull(FDQuery1->FieldByName("DateLeft")->Value))
if (FDQuery1->FieldByName("DateLeft")->Value < 100) {
FDQuery1->Edit();
FDQuery1->FieldByName("DateLeft")->Value = NULL;
FDQuery1->Post();
}
FDQuery1->Next();
}

«FDQuery1-> FieldByName (« DateLeft ») -> Value» по-прежнему равен 0 после выполнения этого кода.

Как я могу установить значение в NULL?

-1

Решение

Казалось бы, этот вопрос действительно о FireDAC, технологии, которую вы используете в C ++ для взаимодействия с базой данных. Неважно, что это за база данных (SQLite или что-то еще).

Официальная документация, которую я нашел не сильно помогает, но мы уже можем предположить, что написание макроса C NULL как это не будет делать то, что вы хотите. Это утилита для кода C, которая при преобразовании в число нуль.

Библиотека FireDAC не может заметить, что вы дали выражение NULL скорее, чем 0потому что выражение NULL не содержит никакой информации о типе, которая говорит, что это то, что это такое (в лучшем случае это будет void*, так что вы можете извлечь из этого странную семантику, похожую на строку — вот почему nullptr был добавлен в C ++ 11!).

Так, NULL это не правильный инструмент для работы. Да, я знаю, что в SQL есть ключевое слово NULL это выглядит так же и делает то, что вы хотите в запросе SQL, но мы не пишем SQL. Мы пишем C ++. Так что мы можем забыть это.

Я нашел какой-то старый Delphi Chatter который, кажется, обсуждает тот же (или похожий) интерфейс и предлагает использовать Clear() метод на поле, чтобы стереть его значение, неявно делая его «нулевым».

Дай что-нибудь.

Итак, что-то вроде:

FDQuery1->FieldByName("DateLeft")->Clear();
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]