我正在研究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
如何处理这种情况?
答案 0 :(得分:1)
我可以说,如果 SET ANSI_NULLS 是ON
,您在图片返回(0)行中提供的查询:
您可以尝试将其设置为OFF
:
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SET ANSI_NULLS OFF;');
ADOQuery1.SQL.Add('select Name from tstTable where Eid=:Eid and Pid =:Pid');
ADOQuery1.Parameters.ParamByName('Eid').Value := 1;
ADOQuery1.Parameters.ParamByName('pid').Value := NULL;
ADOQuery1.Open;
end;
测试:Delphi V7(Build 4.453)。
答案 1 :(得分:-1)
您不应该为参数指定任何内容,但要清除它以将其设置为NULL
Parameters.ParamByName('Eid').Clear;
击> <击> 撞击> UPD。不幸的是,这不适用于TADOxxx组件,因为TParameter没有Clear()方法。
所以解决方案
ADOQuery1.SQL.Add('SELECT * FROM mytable');
ADOQuery1.SQL.Add('WHERE mycol = :Param1 OR (:Param1 IS NULL AND mycol IS NULL)';
ADOQuery1.Parameters.ParamByName('Param1').Attributes :=
ADOQuery1.Parameters.ParamByName('Param1').Attributes + [paNullable];
ADOQuery1.Parameters.ParamByName('Param1').Value := Null();
ADOQuery1.Open;
使用Delphi 7 / SQL Server 2014测试好了
请尝试不要因兼容性问题和全局会话范围而更改任何SET ANSI_XXX设置。如果确实需要更改会话默认设置,请在连接开始时执行此操作。在查询之前执行SET ANSI_NULLS OFF
时,这将更改整个会话(连接)的设置。