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 值(例如来自数据库)?的主要内容,如果未能解决你的问题,请参考以下文章
C#/JSON 如何处理从数据库查询返回的 NULL 值? [复制]