我有一个SQLite double字段,用于显示日期。该字段没有默认值。当没有输入日期时,我需要将该字段值设置为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?
答案 0 :(得分:1)
这个问题似乎真的是关于FireDAC的,这是您在C ++中用于与数据库接口的技术。那个数据库到底是什么(SQLite或其他)并不重要。
The official documentation I found并没有多大帮助,但是我们已经可以假定,像这样编写C宏NULL
并不能满足您的要求。那是C代码的实用程序,当转换为数字时,它是零。
FireDAC库不可能注意到您给了表达式NULL
而不是0
,因为表达式NULL
没有任何类型信息,也就是说(充其量只能是void*
,因此您可能会得到一些奇怪的类似于字符串的语义-这就是为什么在C ++ 11中添加nullptr
的原因。)
因此,NULL
不是适合该工作的工具。是的,我知道SQL具有一个名为NULL
的关键字,该关键字看起来相同并且可以执行SQL查询中所需的操作,但是我们不是在编写SQL。我们正在编写C ++。这样我们就可以忘记了。
我发现一些旧的Delphi chatter似乎在讨论相同(或相似)的接口,并建议在字段上使用Clear()
方法来擦除其值,从而隐式地使其为“ null”。 / p>
去吧。
所以,像这样:
FDQuery1->FieldByName("DateLeft")->Clear();