德尔福XE2 : How to pass a field with null value?

标签 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);

德尔福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;

结果: 关键违规。

最佳答案

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

ParamByName('id').Clear;

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

关于德尔福XE2 : How to pass a field with null value?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23269537/

相关文章:

sql - ssrs nullif 完全限定名称

mysql select count 多个条件

Delphi:将 IMAP 连接到 gmail 帐户

string - 在 Delphi 中将行添加到备忘录顶部

delphi - Delphi XE2 中自动重命名编译文件

delphi - TListView.Items.ItemData 偶尔出现 DFM 损坏

delphi - 计算邻域距离

sql - 案例陈述和答案的除法始终为零

postgresql - 如果为空,则返回替代值?

mysql - IFNULL() 等价于 PostgreSQL