質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.93%

C# SQL  チェックボックスの切り替えによってデータを登録させない

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,733

score 43

前提・実現したいこと

閲覧頂き有難うございます。

C#、SQLについて質問があります。
アプリを制作しているのですが、「チェックボックスがあり、ONならばテキストボックスが出てきてDBにパラメーターを追加するかしないか」という動作を行いたいです。
チェックボックスがONならばテキストボックスの値をDBに追加する
チェックボックスがOFFならばチェックボックスがONのときに入力したデータがあってもDBに追加しないようにする

この動作を行いたいのですが、現在のままだとチェックボックスをOFFにするとパラメーターの値がありませんとなります。

チェックボックスがONの場合は正常に動きます、OFFの場合にパラメーターがありませんと言われます。

この状態だとどのみちエラーになるのですがnullを入れようとした結果なのですが、
本来はnullではなく「チェックボックスがOFFの場合はチェックボックスがONのときに入力した値を残したまま、DBに登録をさせない」という処理をさせたいです。
(チェックボックスをON→OFF→ON 一個目のONのときに入力したデーターが二個目のONのときに見れなくなるのは防ぎたいため)

どうかご教授お願い致します。

ソース(変数の名称等変更しています)

string execQuery = string.Empty;

 if (チェックボックスがONの場合)
            {
                execQuery = string.Format(sqlScan, "TIME, ", "@TIME, ");
            Ctrl.AddParameter("@TIME", CtrlTbx_Time.Text);

            }
            else
            {
                execQuery = string.Format(sqlScan, "", "");
                Ctrl.AddParameter("@TIME", null);

            }
public const string SQL_SCAN_INSERT =
            "INSERT INTO SCAN(TIME, )"+
             "VALUES("@TIME,) ";

補足情報(言語/FW/ツール等のバージョンなど)

VisualStudio2008
SQLServer2014

追記

たくさんの回答ありがとうございます。

質問に記載漏れがありました。

DBに登録するデータはこの@TIMEだけでなくほかにもあるので、単純にelseの中でパラメーターを送信しないだけなら何もかかなくてもよいのはわかるのですが、そのほかの情報もあるので、そのほかの情報は送りつつ、この@TIMEの値だけ登録しない。
とゆう処理を行いたいです。

またテキストボックスで入力する際の型はnvarcharでDBに登録する際の型はnumericです。

どうかご教授お願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+3

変数名以外にも色々変えているようなので推測し難いですが、
もしかしたら else の時にも @TIME のパラメータなしで INSERT はしたいのでしょうか……
だとすると else 時に AddParameter する必要が無いだけに見えます。

AddParameter して値が null(DBNull.Valueでは無い) であれば、
パラメーターの値がありませんとなるのは当然のように思えます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/17 13:20

    nakit様
    回答ありがとうございます。

    elseのときにも他の情報があるので@TIMEのパラメーターなしでINSERTはしなければなりません。

    チェックボックスがONの場合はうまくいっています。

    キャンセル

  • 2016/10/17 21:29

    「INSERTしなければなりません。」とありますが、このときINSERTするレコードのTIME列の値を null にしたいということであれば、DBNull.Value を設定してください。

    チェックボックスがONの時、
    Ctrl.AddParameter("@TIME", CtrlTbx_Time.Text);
    上記でエラーになってないのであれば、チェックボックスがOFFの時は
    Ctrl.AddParameter("@TIME", DBNull.Value);
    で良いです。クエリをわざわざstring.Formatする必要はないでしょう。
    自分なら三項演算子を使います。

    キャンセル

  • 2016/10/21 14:50

    nakit様

    回答有難うございます。
    Ctrl.AddParameter("@TIME", DBNull.Value);
    でいけました。。。。
    初歩的なミスでした。

    三項演算子は使い慣れていないのでこれから勉強していかねばと考えております。

    キャンセル

+2

elseの中を何も書かなければ登録しなくなります。
表示上、ON/OFFでテキストボックスを切り替えたいのであれば、
ON/OFF操作時に入力された値を保持しておけば入力内容は保持できます。

参考URL
https://www.ipentec.com/document/document.aspx?page=csharp-get-textbox-value

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/17 13:14

    s.t.様
    回答ありがとうございます。
    elseのなかに何もかかなければ登録されない理屈はわかっておるのですが、その他の情報もおくりたいので、@TIMEの値だけ登録しないようにしたいです。

    なので

    ```
    public const string SQL_SCAN_INSERT =
    "INSERT INTO SCAN(TIME, )"+
    "VALUES("@TIME,) ";
    ```
    のTIMEと@TIMEを{0},{1}のようにしてON/OFFの切り替えで登録するしないをわけれるのかもと考えております。

    キャンセル

+2

単純にDBへのデータ登録を行っている処理部分(ExecuteNonQuery()とか?)をチェックボックスがOFFの時には処理しないようにすればいいだけではないかと思いますが、それだと何か問題があるのでしょうか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/17 13:15

    ishi9様
    回答ありがとうございます。
    追記にも書きましたが、チェックボックスがOFFの際でもDBに登録する内容があるので、@TIMEの値だけ登録しないようにしたいです。

    キャンセル

+1

Insertで、Timeをnullにするなら、
Ctrl.AddParameter("@TIME", DBNull.Value);
ですが、
Updateで Timeを更新したくない。
なら、
・元の値をセットする。
・SQL文から@Time部分を消す
のどちらかですね。
SQL分にあるパラメータは設定しないとエラーになりますので。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/21 14:52

    KIYOSHI様
    回答有難うございます。
    単純なミスでした。

    UPdateで@TIMEの値は更新するので
    Ctrl.AddParameter("@TIME", DBNull.Value);
    Ctrl.AddParameter("@TIME", 0);

    のどちらかでシステムに影響が少ないほうにしようと思っています。

    キャンセル

0

よくわからないけど、
「ON の時は INSERT (or UPDATE)」
「OFF の時は何もしない」
で良いのじゃないでしょうか?

と思ったら他の方が回答されてますね。
そうですね、else の中で何もしなければ良いのじゃないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/17 13:16

    sk_3122様
    回答ありがとうございます。
    追記にも書きましたが、記載漏れがありました。

    elseの中で@TIMEの値だけ登録しないようにする処理を行いたいです。

    キャンセル

  • 2016/10/17 16:33 編集

    ■他の項目もあるなら、ソースの部分にそれも書いた方が分かりやすいですね。
    (そのままじゃなくても良いので)

    public const string SQL_SCAN_INSERT =
    "INSERT INTO SCAN(HogeID, TIME, HogeFlg)"+
    "VALUES(@HogeID, @TIME, @HogeFlg) ";

    みたいな感じでしょうか。

    ■string.Format(sqlScan, "TIME, ", "@TIME, "); で使われている sqlScan は
    上記の定数なのでしょうか?

    # ちなみに string.Format で合っているのでしょうか。replace とかじゃなく?
    # (replace でもちょっとわかりませんが…)
    # すみません、C# はあまり明るくなくて、ちょっと意図がわからなかったので…

    ■TIME だけ登録したくない、というのは TIME は NULL になるということでしょうか。

    ■常に INSERT だけでしょうか? UPDATEは無し?

    キャンセル

  • 2016/10/21 14:42 編集

    s.k_3122様

    回答ありがとうございます。
    public const string SQL_SCAN_INSERT =
    "INSERT INTO SCAN(HogeID, TIME, HogeFlg)"+
    "VALUES(@HogeID, @TIME, @HogeFlg) ";
    のような漢字で一度のINSERTで15個くらいの値を使います。
    string.formatにこだわっているわけではありません。。。

    TIMEの値は結局

    string execQuery = string.Empty;

    if (チェックボックスがONの場合)
    {
    execQuery = string.Format(sqlScan, "TIME, ", "@TIME, ");
    Ctrl.AddParameter("@TIME", CtrlTbx_Time.Text);

    }
    else
    {
    execQuery = string.Format(sqlScan, "", "");
    Ctrl.AddParameter("@TIME", 0);

    }

    でエラーもなく登録できました。。。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る