我正在将应用程序从Delphi 5转换为Delphi XE2,并遇到了使用BDE的情况.
在Delphi XE2中,他不接受传递null为一个外键的字段,后面是这个当前在Delphi 5中工作的方式:
ParamByName('id').datatype: = ftInteger;
Run Code Online (Sandbox Code Playgroud)
使用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;
Run Code Online (Sandbox Code Playgroud)
如何传递空值的字段?
更新:
数据库:
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);
Run Code Online (Sandbox Code Playgroud)
德尔福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;
Run Code Online (Sandbox Code Playgroud)
结果:密钥违规.
要NULL作为参数值传递,请使用TParameter.Clear.
ParamByName('id').Clear;
Run Code Online (Sandbox Code Playgroud)
暂且不说:你现在应该已经摆脱了BDE.它已经被弃用了十多年,很难在现代版本的Windows上进行配置和使用,并且可能随时从Delphi发行版中消失,恕不另行通知.(我很惊讶这种情况尚未发生,个人而言.)它也不支持现在可用的任何跨平台目标.当然,10年足以让它取代它.
| 归档时间: |
|
| 查看次数: |
4672 次 |
| 最近记录: |