2017-10-27 91 views
2

私はDelphi7とSQlserver 2008 R2を開発中です。 iは以下のようないくつかのデータを持つテーブルがある。\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 Serverの1に等しいレコードを取得したいです。

Sql result

私はどんな結果を得ていないのです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 

このシナリオをどのように扱うか?

+5

「AND Pid IS NULL」を使用してください。 'NULL'は値ではありません。これは価値のない状態です。 – Victoria

+0

@Victoria:私はそれを試みました。私はすべてのパラメータを渡したいときに失敗していますnullがあります。 tstTable(Name、Eid、Pid)の値( 'name7'、null、null)に挿入するようなレコードがあるときは、 – DelphiLearner

+2

'where something = null'は動作しません。何かをnullと比較すると、 'IS'と' IS NOT'だけがtrueを返します。他の演算子は常にfalseを返します。あなたはSQLサーバで動作すると言いますが、そうはしません。あなたはそこで別のクエリを実行しています。ここでは(おそらく)条件全体が省略されています。 – GolezTrol

答えて

1

私は画像の見返りにあなたが提供するクエリー(0)行SET ANSI_NULLS場合がONであると言うことができます:

あなたは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(ビルド4.453)。

+1

SET ANSI_NULLSをOFFとして送信する必要はありません。 sepearateコマンドを実行し、特別なコマンドを保存するselectステートメントの前に置くだけです – GuidoG

-1

あなたはパラメータに何を割り当てるが、それはそれNULL

Parameters.ParamByName('Eid').Clear; 

UPDを設定することは明らかではないはずです。残念ながら、TParameterにはClear()メソッドがないため、これはTADOxxxコンポーネントでは機能しません。

だから、デルファイ7/SQL Serverの2014

でOKテスト済みソリューション

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; 

があるため、互換性の問題や世界的なセッションスコープの任意のセットANSI_XXXの設定を変更しないでくださいしてください。 の場合、実際ににセッションのデフォルト設定を変更する必要がある場合は、接続の開始時に行います。クエリの前にSET ANSI_NULLS OFFが実行されると、セッション全体(接続)の設定が変更されます。

+1

'TADOQuery'の' TParameter.Clear'メソッドはありません。 – kobik

+0

正確には、ADOコンポーネントではClear()は存在しません。私は解決策を追加しました。 – serge

+0

私のソリューションはあなたに適していますか?上記の解決策は、グローバルなANSI設定の変更が必要であることがわかります。 値をNULLに設定するには、Parameter.Clear()を使用することをお勧めします。あなたはいつもそれを普通に使うべきです。 – serge

関連する問題