none
GridViewの更新ボタンを押すと、空フィールドにNULLが入ってしまう RRS feed

  • 質問

  • NAME like '%" + 検索文字列 + "%' AND"
    のようにして、NULLではなく、空文字でも""で検索すれば引っかかるようにしていたのですが、

    「 GridViewでテーブルを更新する 」 と、そこだけ自動的にNULLが入ってしまうようです。

    GridViewの列の編集より、ConvertEmptyStringToNullをFalseにしてもNULLが入ってしまいダメでした。

    まだ、SQL インジェクション対策を施していないため、@ ~のようなコードを書いていません。(まだやったことがないので後回しにしています)

    ●GridViewでNULLではなく空文字で更新するか
    ●NULLがあっても、検索文字列が""の時に、likeなどで(出来ればIFなどを使わずSQLで)検索対象にする。そして"abc"の時は除外したいです。

    のどちらかが今やりたい事として思いついています。

    よろしくお願いします。

    環境 ASP.NET2.0 C#

    2009年9月24日 8:17

回答

  • > 「 GridViewでテーブルを更新する 」 と、そこだけ自動的にNULLが入ってしまうようです。

    GridView で見かけ空白にしても、パラメータは空白 (String.Empty) ではなくて null になっていて、ど
    こかでそれが DBNull.Value に変換されて DB が Update される結果、そうなるのでしょう。

    SqlDataSource + GridView を使っているなら SqlDataSource の Updating イベントのハンドラで、
    当該パラメータの値 null を空白に変えてやると目的が果たせると思います。

    • 回答としてマーク RealCoop 2009年9月24日 17:32
    2009年9月24日 14:08

すべての返信

  • > 「 GridViewでテーブルを更新する 」 と、そこだけ自動的にNULLが入ってしまうようです。

    GridView で見かけ空白にしても、パラメータは空白 (String.Empty) ではなくて null になっていて、ど
    こかでそれが DBNull.Value に変換されて DB が Update される結果、そうなるのでしょう。

    SqlDataSource + GridView を使っているなら SqlDataSource の Updating イベントのハンドラで、
    当該パラメータの値 null を空白に変えてやると目的が果たせると思います。

    • 回答としてマーク RealCoop 2009年9月24日 17:32
    2009年9月24日 14:08
  • SurferOnWww様

    ご回答をありがとうございました。SqlDataSource の Updating イベントは、分かったのですが、まだ素人のため当該パラメータをプログラムで拾う方法が分りませんでした。
    this.GridView1.~
    this.SqlDataSource1.~ のうに続くのかなと思ったのですが、メンバなどが多すぎて勉強不足でした。

    問題がどこにあるかを教えていただいたので、さらにUpdateというキーワードを含め自分なりに、調べ直してみました。

    一応、解決しましたので、自分なりの解決方法を載せておきます。
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    間違っていたので、この文章を編集しておきます。

    後日、NULLが出てしまい再調査をしていたら、ConvertEmptyStringToNullがGridViewとDataSourceの2か所にあり、2か所ともFalseにすると
    グリッドビューより、更新した際にNULLを自動的に挿入される動作が防げました。

    [せっかくですので、自分的解決方法を今後の人のために]
    1.GridViewのGridViewタスクより、列の編集をして、各パラメータの ConvertEmptyStringToNull を False に変更
    2.SqlDataSource のプロパティより、[データ]-[UpdateQuery]-[...]
      パラメータより、当該パラメータ(NAMEなど)をクリックして、
      詳細設定プロパティの表示をクリック
      プロパティより ConvertEmptyStringToNull を False に変更

    これでおそらくNULLと無縁の生活を過ごせます。それで良いのか自分という気もしますが。

    環境:VisualWebDeveloper2008

    ※間違ってたらすみません

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    Updating イベントやパラメータの取得方法を検索していたら、今まで使っていなかったグリッドビューのテンプレートの作成方法も分かって、今回は2つほど勉強になりました。
    ありがとうございました。

    • 編集済み RealCoop 2009年9月25日 3:41 間違っていた
    2009年9月24日 17:32
  • > ConvertEmptyStringToNullがGridViewとDataSourceの2か所にあり、2か所ともFalseにすると
    > グリッドビューより、更新した際にNULLを自動的に挿入される動作が防げました。

    それが正解だと思います。

    自分が紹介した方法は、少々強引かもしれませんが、更新前にパラメータの値の検証、変更などを
    するのに便利でので、おぼえておいて損はないと思います。以下のような感じです。

    protected void SqlDataSource1_Updating(object sender, SqlDataSourceCommandEventArgs e)
    {
        SqlCommand command = (SqlCommand)e.Command;
        string s = (string)command.Parameters["@xxxx"].Value;
        if (s == null)
        {
            command.Parameters["@xxxx"].Value = String.Empty;
        }
    }

    他に、Selecting, Inserting, Deleteing イベントでも同様なことができます。

    2009年9月25日 13:57
  • SurferOnWww様

    ソースコードを見せて頂いてありがとうございます。
    数値や日付チェックなど、今後重宝させて頂きます。
    ありがとうございました。

    2009年10月5日 16:32