TADOQuery:将null作为参数传递并获取结果集

时间:2017-10-27 08:24:23

标签: sql-server delphi delphi-7 ado

我正在研究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中我能够得到结果。

Sql result

当我在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

如何处理这种情况?

2 个答案:

答案 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时,这将更改整个会话(连接)的设置。