我正在将一个应用程序从Delphi 5转换到Delphi XE2,并遇到了使用BDE的情况。
在Delphi XE2中,如果字段是一个外键,它不接受传递null值。以下是目前在Delphi 5中正常工作的方式:
ParamByName('id').datatype: = ftInteger;
在 Delphi XE2 中使用 BDE 时出现的错误:
在表 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;
结果:关键词冲突。
if..else
块,在其中使用AsString分配字符串或者在为NULL时使用Clear。我经常使用它,虽然不是与BDE一起使用。如果错误出现在Delphi中,请发布确切的错误信息。 - Ken White