【发布时间】:2017-10-27 08:24:22
【问题描述】:
我正在研究 Delphi7 和 SQlserver 2008 R2。 我有一个表格,上面有一些数据,如下所示。\
CREATE TABLE dbo.tstTable (
ID int IDENTITY(1,1) PRIMARY KEY,
Name varchar(255) NOT NULL,
Eid int null,
Pid int null
);
insert into tstTable(Name,Eid,Pid) values ('name1',1,null);
insert into tstTable(Name,Eid,Pid) values ('name2',2,null);
insert into tstTable(Name,Eid,Pid) values ('name3',3,null);
insert into tstTable(Name,Eid,Pid) values ('name4',null,4);
insert into tstTable(Name,Eid,Pid) values ('name5',null,5);
insert into tstTable(Name,Eid,Pid) values ('name4',null,6);
insert into tstTable(Name,Eid,Pid) values ('name7',null,null);
现在我想获取 Eid 等于 1 的记录。在 sql server 中我能够得到结果。
当我在 delphi 中尝试相同的操作时,我没有得到任何结果。 在 Delphi 中,我使用了 TADOConnection、TADOQuery、TDataSource 和 TDBGrid。
SET TADOQuery.Query = 'select Name from tstTable where Eid=:Eid and Pid =:Pid'
with ADOQuery1 do
begin
Parameters.ParamByName('Eid').Value := 1;
Parameters.ParamByName('pid').Value := NULL;//i tried with Unassigned also
Close;
open;
end; //with
当我打开 AdoQuery 时,在网格中它没有显示任何记录。 下面的代码也没有返回任何记录。
with ADOQuery1 do
begin
Parameters.ParamByName('Eid').Value := NULL;
Parameters.ParamByName('pid').Value := NULL;//i tried with Unassigned also
Close;
open;
end; //with
如何处理这种情况?
【问题讨论】:
-
使用
AND Pid IS NULL。NULL不是一个值。这是一种没有价值的状态。 -
@Victoria:我试过了。当我想传递所有参数为空时它失败了。当我们有类似“insert into tstTable(Name,Eid,Pid) values ('name7',null,null);”这样的记录时
-
where something = null只是不起作用。只有IS和IS NOT可以在将某些内容与 null 进行比较时返回 true。其他运算符始终返回 false。你说它在 SQL Server 中工作,但它没有。您正在那里执行不同的查询,其中(可能)省略了整个条件。 -
你能再测试一下吗?屏幕截图中的查询应该不返回结果。也许您没有运行完整的查询,或者您使用的工具执行了一些魔术,但该查询原样不应返回任何内容。这是 SQL 的基本规则,通常您需要stuff like this 来解决它。
-
也许您的
SET ANSI_NULLS在SSMS 中设置为OFF?您可以使用它来使用带有 null 的=和<>运算符,但我不推荐它,因为在未来的版本中,ANSI_NULLS将始终为ON。按照已经建议使用IS NULL。
标签: sql-server delphi delphi-7 ado