У меня есть двойное поле 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?
Казалось бы, этот вопрос действительно о 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();
Других решений пока нет …