C++:如何处理 NULL 值(例如来自数据库)?

Posted

技术标签:

【中文标题】C++:如何处理 NULL 值(例如来自数据库)?【英文标题】:C++: How to deal with NULL values (e.g. from a database)? 【发布时间】:2011-05-05 10:03:50 【问题描述】:

在 C++ 中,如何在我们可能期望字符串或整数的上下文中处理 NULL 值?

通常,上下文是从数据库中检索数据时,例如使用 LEFT JOIN,其中某些列中的一些不存在的值将由 NuLL 值而不是预期的字符串或整数表示。

C++ 中的强转换使得这种场景比 php 更难处理。

在 PHP 中,我们可以使用 === 运算符轻松地进行 if/else 切换:

if ($value === NULL) 
  // No data.
 else 
  // We have some valid data.

等价物在 C++ 中会是什么样子?

我已搜索并找不到与 C++ 相关的问题。

这个问题通常是有效的。在我的特殊情况下,我使用的是dbixx SQL library。

【问题讨论】:

库首先如何表示 NULL 值? 嗯? 1) 这不是 PHP。你可以在 PHP 中“轻松做”什么并不重要,因为不管你信不信,C++ 不是 PHP。那为什么还要提呢? “C++ 中的等价物会是什么样子?”谁说一定有任何对等?出于某种原因,它们可能是不同的语言... 2)您是否有实际情况要尝试制作?然后发布那个。不要问理论上的问题,尤其是在语言方面没有意义的地方(C++ 变量没有通用的“null”状态,它们总是持有一个值或未初始化)。 3) 关于第二点,如果您发布了您的真实代码,我们可以使用您的库的文档来尝试解决您的问题。但现在,它只是没有意义。所以:你的真实情况是什么?您正在使用哪些实际代码,总体情况如何? 相关:Nullable values in C++ 【参考方案1】:

对于字符串指针(以及一般的对象指针),这很简单,它们可以保持 0 以表明它们为空。

对于整数,您必须依赖一个外部变量来判断返回的对象是否为空。或者如果你将它作为指针传递,你可以像上面一样使用 0 指针。

【讨论】:

您的语言令人困惑。我认为您的意思是“对于字符串指针(以及一般的对象指针)......” 是的,我指的是两者的指针。现在太习惯C#了,忘了可以在栈上分配。【参考方案2】:

来自http://art-blog.no-ip.info/wikipp/en/page/ref_dbixx_row:

函数cols() 返回数量 行中的列。 isnull() 返回 如果特定字段为空,则使用它 列号(从 1 开始)或 列名;

bool operator[] 只是句法 isnull() 的糖。

在您的问题中,您说您使用的是 dbixx,因此我已链接到他们的文档。这将始终特定于您正在使用的库。

【讨论】:

谢谢。相信我,我不止一次地检查过文档。但是,由于我仍然是初学者,因此我无法立即了解如何使用您引用的内容。我可能需要重构我的代码以利用它。我的问题更笼统:经验丰富的 C++ 开发人员如何处理类似情况。正如你所说,它是特定于库的(它本身就是一种与 PHP 不同的思维方式)。 尽管我在 dbixx 文档中看到了这一点,但我仍然很高兴我提出了这个问题,因为我的具体问题的解决方案可以通过使用 TokenMacGuy 建议的 boost::optional 来解决。跨度> 【参考方案3】:

这听起来像是一个笼统的概念,但对于 C++ 没有通用的答案。语言本身没有真正通用的“NULL”值,可以与所有类型一起使用,以区别于已设置为实际值。

因此,任何情况下的答案都完全取决于库或您正在使用的任何东西,以及它是如何设计来指示“NULL”值的。用于访问数据的函数的返回值可能指示数据是否为 ​​NULL 或其他。或者可能有一个单独的 IsNull() 函数。或者图书馆可能会使用其他一些不同的方案。有很多可能性。

唯一可能的一般性答案是:阅读该库的文档以了解他们具体如何处理它。

【讨论】:

谢谢。我是 C++ 的初学者,但我仍在努力学习基础知识。我过去在 PHP 中自然而然地做的事情不再适用于 C++ 世界。我必须学会以不同的方式思考一些关键问题。 @augustin:那么你应该得到一个introductory level book。你不会以任何其他方式学习。你是对的:忘记你知道任何其他语言。你会开车并不意味着你会开飞机,那么在你想成为一名飞行员的同时考虑开车有什么用呢? @GMan,谢谢。我提到 PHP 是因为它是我所知道的,它的优点是完美地解释了我的困境。【参考方案4】:

boost::optional 是在 c++ 中通过强类型检查来表示可能类型的自然方式(必须检查可能为 null 的类型是否为 null)

【讨论】:

谢谢。我正在阅读 boost::optional 文档,我可能最终会使用它。非常感谢。

以上是关于C++:如何处理 NULL 值(例如来自数据库)?的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 中该如何处理NULL值,你真的清楚么?

C#/JSON 如何处理从数据库查询返回的 NULL 值? [复制]

HiveQL 逻辑过滤语句如何处理 NULL 值

如何处理来自用户输入的偶数数组并在 C++ 中用空格显示它们

服务器返回<null>值 iOS 端如何处理

1 周后如何处理来自分布式日志代理(例如 Kafka)的日志?