【发布时间】:2014-01-11 00:49:34
【问题描述】:
我从 db 获取一个值,当该值为 NULL 时出现错误
无法将类型 (null) 的变体转换为类型 (Integer)
如果我用 0 而不是什么都没有(NULL)填充数据库,错误就会消失
所以说我有这个
OneSpell.PerCent := FQuery.Recordset.Fields[ DB_FLD_PER_CENT ].Value;
OneSpell.Plus := TCardPlus ( FQuery.Recordset.Fields[ DB_FLD_PLUS ].Value );
OneSpell.Quantity := FQuery.Recordset.Fields[ DB_FLD_QUANTITY ].Value;
有没有办法判断该值是否为 NULL 然后使其为 0?还是必须通过数据库来完成。
FQuery 是 adoquery 并且 db 是访问权限
我知道我能做到
if .... = null then
onespell.plus := 0
else
.........
但我想为 onespell 的每个值在一行中执行此操作
【问题讨论】:
-
什么是
OneSpell?PerCent、Plus和Quantity是什么类型?FQuery是TADOQuery还是别的什么?你能说得更具体一些吗,以便我们尝试帮助你? (是的,如果你想要 0 而不是 NULL,减少代码的最简单的解决方案是在 SQL 本身中使用IsNull()或Coalesce()或在你使用的任何未指定的数据库系统中的任何等效项,因为这样您的应用程序代码就不需要担心返回的内容 - 它知道这将是一个有效的数值。) -
@kenWhite 很难解释 onespell 到底是什么,但是百分比、加号和数量的类型应该是整数。 db 很大,要扔掉所有 0 都需要一些时间。如果它为空,则不使用百分比,加上数量,因此我认为 0 来压缩错误。我希望有一种方法可以在一行中添加类似
oneSpell.plus := if(null)then 0 else ....的 if 语句,但我认为有一种方法可以做到这一点,是的,它是一个 adoquery,使用 access db。但如果可能的话,宁愿在这些代码行中做到这一点......曾经是一个巨大的数据库...... -
再一次,
FQuery是什么?是TADOQuery吗? (这有所不同,因为可用的内容因类而异。另外,如果是TADOQuery,是否真的有多个记录集?如果没有,则无需使用FQuery.RecordSet,这样更容易。 ) -
@KenWhite 抱歉,我将其添加到最后一条评论中,但在您阅读后可能会出现问题,但是 FQuery 是一个 TADOQuery,是的,有多个记录集。就像在某些代码中一样,您可以使用 ?并保持在同一行
-
我不知道如何避免它,因为你没有解释为什么你的查询首先有多个记录集。大多数 SQL 查询不会返回超过一个,除非您使用
TADOCommand而不是在一个脚本中执行一系列SELECT语句。 (我假设您知道多个 recordsets 与多个 records(行)不同。)
标签: delphi delphi-xe2 ado