2017-10-27 61 views
2

저는 Delphi7 및 SQlserver 2008 R2에서 작업 중입니다. 나는 아래와 같은 일부 데이터가있는 테이블이 있습니다. \TADOQuery : 매개 변수로 null 전달 및 결과 집합 얻기

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); 

지금 내가 이드 내가 결과를 얻을 수 있어요 SQL 서버 1. 동일 기록을 싶어.

Sql result

는 내가 어떤 결과를 얻고 있지 않다 델파이에서 동일 할 때. 델파이에서 , 나는 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 

이 시나리오를 처리하는 방법은 무엇입니까?

+5

'AND Pid IS NULL'을 사용하십시오. 'NULL'은 값이 아닙니다. 그것은 가치가없는 상태입니다. – Victoria

+0

@ 빅토리아 : 나는 그것을 시도했다. 모든 매개 변수를 전달하려고 할 때 실패합니다 null입니다. 우리가 "tstTable (Name, Eid, Pid) 값 ('name7', null, null)에 삽입하는 것과 같은 레코드를 가지고있을 때; – DelphiLearner

+2

'where something = null'은 작동하지 않습니다. 'IS'와'IS NOT'만이 무언가를 null과 비교할 때 true를 반환 할 수 있습니다. 다른 연산자는 항상 false를 반환합니다. 당신은 SQL 서버에서 작동한다고 말하지만, 그렇지 않습니다. 거기에서 다른 쿼리를 실행하고 있습니다. 아마도 전체 조건이 생략되었을 것입니다. – GolezTrol

답변

1

나는 SET ANSI_NULLSON 경우 쿼리는 이미지의 대가 (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; 

가에서 테스트 : 델파이 V7 (빌드 4.453).

+1

SET ANSI_NULLS OFF를 보내지 않아도됩니다. sepearate 명령을 추가하고 명령을 저장하는 'select'문 앞에 놓습니다. – GuidoG

-1

당신은 매개 변수에 아무것도 할당하고 그것을 NULL

Parameters.ParamByName('Eid').Clear; 

UPD를 설정 취소는 안된다. TParameter에는 Clear() 메소드가 없으므로 불행히도 TADOxxx 구성 요소에서는 작동하지 않습니다.

그래서 해결책은

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; 

때문에 호환성 문제와 글로벌 세션 범위의 SET의 ANSI_XXX 설정을 변경하지 않는 델파이 7/SQL 서버 2014

에 한번으로 OK 테스트. 이 실제로 인 경우 세션 기본 설정을 변경해야하며 연결 ​​시작시 설정하십시오. 쿼리 전에 SET ANSI_NULLS OFF이 실행되면 전체 세션 (연결)에 대한 설정이 변경됩니다.

+1

'TADOQuery'에 대한'TParameter.Clear' 메서드가 없습니다. – kobik

+0

정확히, ADO 구성 요소에는 Clear()가 없습니다. 솔루션을 추가했습니다. – serge

+0

내 솔루션이 효과가 있습니까? 위의 해결책은 글로벌 ANSI 설정 변경이 필요하다는 것을 알았습니다. Parameter.Clear()는 값을 NULL로 설정하는 데 권장되는 방법입니다. 항상 정상적으로 사용해야합니다. – serge