【问题标题】:Difference between Null and Empty String in Delphi 7 and Delphi XE4Delphi 7 和 Delphi XE4 中 Null 和 Empty 字符串的区别
【发布时间】:2014-03-03 11:33:14
【问题描述】:

我有以下 firebird 数据集:

ds1 : TpFIBDataset;

DFM 文件:

object ds1ID: TFIBIntegerField
 FieldName = 'ID'
end
object ds1FIELD_VALUE: TFIBStringField
  FieldName = 'FIELD_VALUE'
  Size = 250
end

在我的 Firebird 数据库中:ID 是整数字段,FIELD_VALUE 是 varchar 字段。

Delphi 7:数据是这样插入的

ds1.InsertRecord([123, anyValue]);

这里anyValue : variant;

如果 anyValue = null,则将 null 插入到数据库中,这是必需的功能。

在 Delphi XE4 中,我也是这样做的:

ds1.Insert;
ds1.FieldByName('ID').AsInteger := 123;
ds1.FieldByName('FIELD_VALUE').AsString := anyValue;
ds1.Post;

我收到错误:could not convert variant of type (null) into type (OleStr)

当我这样尝试时

ds1.Insert;
ds1.FieldByName('ID').AsInteger := 123;
ds1.FieldByName('FIELD_VALUE').AsString := VarToStr(anyValue);
ds1.Post;

空字符串被插入到数据库中,但我需要空字符串。为了完成这项任务,我应该在哪里进行更改。

【问题讨论】:

  • 不要转换它AsString,然后使用Value。或者,如果 TpFIBDataset 支持将空字符串转换为 NULL 的某些设置,请使用该设置并尝试保持 AsString 强制转换。
  • 当你说“我也在做同样的事情”时,这似乎不是真的。您的 D7 代码是 ds1.InsertRecord([123, anyValue]);。您不会在 XE4 代码中这样做。
  • @DavidHeffernan - 这么说,我的意思是我正在尝试以 Delphi XE4 方式实现相同的功能。很抱歉造成混乱。
  • @TLama - 我们可以在数据集中设置字段 FIELD_VALUE 的 EmptyStrToNull 属性,但根本不起作用。
  • ds1.FieldByName('FIELD_VALUE').Clear 会将值设置为NULL,我认为

标签: delphi firebird delphi-xe4


【解决方案1】:

你需要使用

ds1.FieldByName('FIELD_VALUE').Value := anyValue;

而不是

ds1.FieldByName('FIELD_VALUE').AsString := anyValue;

这个 delphi 版本有一些不同。从 delphi2006 开始,还有另一个更精确的内存管理器。在 delphi 7 及更低版本的示例中,您可以将 NULL 分配给字符串或整数值。并且 NULL 与 0 的比较将返回 true。在更大的版本中,您不能这样做。 Null 不等于 0 或空字符串。

【讨论】:

  • 与内存管理器无关。另外,您确定可以在 Delphi 中将 NULL 分配给整数值吗?我确定在上面的 Delphi 7(关于哪个问题)中你不能。但现在最糟糕的是,FieldByName 返回一个对TField 对象的引用,并且您正在为它分配一个变量值。那不会以幸福的结局告终。我没有投反对票,但这个答案是错误的。
  • Tnx 很多,我忘记了 .Value。现在添加它。
猜你喜欢
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多