Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi XE2:如何传递具有空值的字段?_Delphi_Nullif - Fatal编程技术网

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

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

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

在Delphi XE2中,对于作为外键的字段,他不接受pass 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;
结果:
密钥冲突。

要将
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=正确记录。