-1

我有一个用于显示日期的 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?

4

1 回答 1

2

看起来这个问题实际上是关于 FireDAC,这是您在 C++ 中使用的与数据库交互的技术。该数据库是什么(SQLite 或其他)并不重要。

我找到的官方文档没有多大帮助,但我们已经可以假设NULL像这样编写 C 宏不会做你想做的事。这是 C 代码的实用程序,当转换为数字时为零

FireDAC 库不可能注意到您给出了表达式NULL而不是0,因为表达式NULL不包含表明它是什么的类型信息(充其量是 a void*,因此您可能会得到一些奇怪的字符串语义——这种怪异是为什么nullptr在 C++11 中添加的!)。

所以,NULL这不是工作的正确工具。是的,我知道 SQL 有一个名为的关键字NULL,它看起来相同并且可以在 SQL 查询中执行您想要的操作,但我们不是在编写 SQL。我们正在编写 C++。所以我们可以忘记这一点。

我发现了一些旧的Delphi 喋喋不休,似乎讨论了相同(或相似)的接口,并建议Clear()在字段上使用该方法来擦除其值,隐含地将其设为“null”。

试一试。

所以,像:

FDQuery1->FieldByName("DateLeft")->Clear();
于 2018-11-05T18:58:13.843 回答