Delphi XE2:如何传递具有空值的字段?
我正在将一个应用程序从Delphi 5转换为Delphi XE2,遇到了使用BDE的情况 在Delphi XE2中,对于作为外键的字段,他不接受pass null,这是Delphi 5中当前的工作方式:Delphi XE2:如何传递具有空值的字段?,delphi,nullif,Delphi,Nullif,我正在将一个应用程序从Delphi 5转换为Delphi XE2,遇到了使用BDE的情况 在Delphi XE2中,对于作为外键的字段,他不接受pass null,这是Delphi 5中当前的工作方式: ParamByName('id').datatype: = ftInteger; Delphi XE2中使用BDE时发生的错误: 在表YY中外键“XX”的主键值中 以以下方式进行测试,但出现相同错误: ParamByName('id').datatype: = ftInteger; Param
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;
结果:
密钥冲突。要将
NULL
作为参数值传递,请使用t参数。清除
ParamByName('id').Clear;
顺便说一句:你现在真的应该把溴化二苯醚扔掉了。它已经被弃用十多年了,很难在现代版本的Windows上配置和使用,并且可能会在任何时候都不经通知就从Delphi发行版中消失。(我个人很惊讶这还没有发生。)它也不支持现在可用的任何跨平台目标。当然,10年的时间足以替换它。当传递空值时,即使在调用Clear()
时,也必须手动设置Bound=True
,如果是第一次使用该参数,则通常也必须手动设置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;
是的,我正在考虑在不久的将来改变BDE。错误继续:字段“XX”的类型未知。但错误不在BDE中,而在Delphi中。未插入Null,请插入空白。FreePascal中的相同讨论:本文中的错误与Delphi XE4和Dbexpress相同:我发布的内容有效。如果必须传递NULL或字符串,则需要一个If..else
块,其中它要么使用AsString分配字符串,要么使用Clear If为NULL。(我一直在使用它,虽然BDE没有。如果错误在Delphi中,请发布您收到的确切错误消息。更新了显示我所做测试的主要问题,出现了密钥冲突错误。完整的错误消息是什么?它应该告诉您违反的确切内容。密钥冲突可能是由以下原因之一造成的:几个不同的原因。如果我不得不猜测(你永远不应该让人们猜测),我猜TEST_1
在其ID_1
字段中已经包含一个值为1的行,因为ID_1
是主键,因此每一行必须有一个唯一的值。创建表后,表中没有数据。在表ID_TEST_1中插入第一条记录时,会出现“键冲突”错误,因为该字段的ID_TEST_2为空且不为NULL。EMPTY=密钥冲突。NULL=正确记录。