none
SqlParameter で DBNull.Value の件数が取得できない RRS feed

  • 質問

  •  

    SqlParameter に DBNull.Value を設定して 値がNULLの列の件数を取得しようと思い
    下記のようなコードを書きましたが、実行してみると件数が0件と表示されます
    SqlParameter を利用しないで


    値がNullと思われる列名 = @条件

     


    値がNullと思われる列名 IS NULL

     

    に書き換えると正常にNULLの件数を取得できます
    SqlParameter は WHERE句の条件に DBNull.Value は利用できないのでしょうか?
    それとも何か手法が間違っているのでしょうか?


                    System.Data.SqlClient.SqlConnection CON = new SqlConnection(DB接続文字列);
                    CON.Open();

                    System.Data.SqlClient.SqlCommand CMD = new SqlCommand(
                        "SELECT count(*) FROM [テーブル名] WHERE 値がNullと思われる列名 = @条件",
                        CON
                        );
                   
                    CMD.Parameters.Clear();
                    CMD.Parameters.Add(new SqlParameter("@条件",DBNull.Value));

                    System.Windows.Forms.MessageBox.Show(CMD.ExecuteScalar().ToString());

    2008年6月2日 9:24

回答

  • nullの場合にはisを使わなければなりません。

    例えば、

     

    where (@nullなら1= 1 and 値がNullと思われる列名 is null) or 値がNullと思われる列名 = @条件

     

    としておいて、nullで検索したい場合には、

     

    @nullなら1= 1

    @条件 = なんでもOKよい。

     

    nullで検索しない場合は、

     

    @nullなら1= 0

    @条件 = 検索したい値

     

    とすればできるんじゃないでしょうか。

     

    SET ANSI_NULLS OFFは使わない方が良いでしょう。

    2008年6月2日 10:51
    モデレータ

すべての返信

  • nullの場合にはisを使わなければなりません。

    例えば、

     

    where (@nullなら1= 1 and 値がNullと思われる列名 is null) or 値がNullと思われる列名 = @条件

     

    としておいて、nullで検索したい場合には、

     

    @nullなら1= 1

    @条件 = なんでもOKよい。

     

    nullで検索しない場合は、

     

    @nullなら1= 0

    @条件 = 検索したい値

     

    とすればできるんじゃないでしょうか。

     

    SET ANSI_NULLS OFFは使わない方が良いでしょう。

    2008年6月2日 10:51
    モデレータ
  • こんにちは。フォーラムオペレータ大久保です。

     

    loup さん、フォーラムのご利用ありがとうございます。

    trapemiya さんのご説明通り、Null かどうかの判断をする場合 is を使うことになります。

    判定したい項目がNullを含む場合、ひとつの条件式だけで完結できないところがちょっと面倒ですが、皆さんいろいろ工夫されているようですね。

    trapemiya さんの投稿に回答済みチェックをつけさせていただきましたが、不明な点などあれば遠慮なく質問してください。

     

    trapemiya さん、ありがとうございました!

    2008年6月18日 9:58