Delphi XE2:如何传递空值的字段?

时间:2014-04-24 12:55:20

标签: delphi nullif

我正在将一个应用程序从Delphi 5转换为Delphi XE2,并遇到了使用BDE的情况。

在Delphi XE2中,他不接受传递null为一个外键的字段,以下是当前在Delphi 5中工作的方式:

ParamByName('id').datatype: = ftInteger;

使用BDE在Delphi XE2中发生错误: 在表YY中的外键'XX'的主键值

使用相同的错误以下列方式进行测试:

ParamByName('id').datatype: = ftInteger;
ParamByName('id').value: = NULL;

ParamByName('id').DataType: = ftstring;
ParamByName('id').clear;

ParamByName('id').DataType: = ftstring;
ParamByName('id').Bound: = true;

ParamByName('id').Value: = null;

ParamByName('id').IsNull;

如何传递空值的字段?

更新

数据库:

CREATE TABLE TEST_1 (
    ID_1 INTEGER NOT NULL,
    ID_TEST_2 INTEGER NULL,
    DESC_1 VARCHAR(10) NULL,
    PRIMARY KEY (ID_1)
);

CREATE TABLE TEST_2 (
    ID_2 INTEGER NOT NULL,
    DESC_2 VARCHAR(10) NULL,
    PRIMARY KEY (ID_2)
);

ALTER TABLE TEST_1 ADD FOREIGN KEY FK_TEST(ID_TEST_2) REFERENCES TEST_2(ID_2);

Delphi XE2:

Close;
SQL.Clear;
SQL.Add('insert into test_1 (id_1, id_test_2, desc_1) values (:id_1, :id_test_2, :desc_1)');
ParamByName('ID_1').AsInteger := 1;
ParamByName('ID_TEST_2').DataType := ftInteger;
ParamByName('ID_TEST_2').Clear;
ParamByName('ID_TEST_2').Bound := True;
ParamByName('DESC_1').AsString := 'DESCRIPTION TEST';
ExecSQL;

结果: 密钥违规。

2 个答案:

答案 0 :(得分:8)

要将NULL作为参数值传递,请使用TParameter.Clear

ParamByName('id').Clear;

顺便说一下:你现在应该已经摆脱了BDE。它已经被弃用了十多年,很难在现代版本的Windows上进行配置和使用,并且可能随时从Delphi发行版中消失,恕不另行通知。 (我个人感到惊讶的是,这还没有发生。)它也不支持现在可用的任何跨平台目标。当然,10年足以让它取代它。

答案 1 :(得分:1)

传递NULL时,即使调用Bound=True,也必须手动设置Clear(),如果是第一次使用参数,则通常需要手动设置DataType好。我倾向于使用这样的代码:

Param := ParamByName('id');
if (shound assign a value) then
begin
  Param.AsInteger := ...;
end else
begin
  Param.DataType := ftInteger;
  Param.Clear;
  Param.Bound := True;
end;