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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

5回答

4553閲覧

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

khr0404

総合スコア43

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2016/10/14 06:15

編集2016/10/17 04:10

###前提・実現したいこと

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

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

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

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

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

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

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

C#

1 2 3 string execQuery = string.Empty; 4 5 if (チェックボックスがONの場合) 6 { 7 execQuery = string.Format(sqlScan, "TIME, ", "@TIME, "); 8 Ctrl.AddParameter("@TIME", CtrlTbx_Time.Text); 9 10 } 11 else 12 { 13 execQuery = string.Format(sqlScan, "", ""); 14 Ctrl.AddParameter("@TIME", null); 15 16 } 17

SQL

1 2 public const string SQL_SCAN_INSERT = 3 "INSERT INTO SCAN(TIME, )"+ 4 "VALUES("@TIME,) "; 5

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

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

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

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

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

投稿2016/10/14 14:38

nakit

総合スコア410

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

khr0404

2016/10/17 04:20

nakit様 回答ありがとうございます。 elseのときにも他の情報があるので@TIMEのパラメーターなしでINSERTはしなければなりません。 チェックボックスがONの場合はうまくいっています。
nakit

2016/10/17 12:29

「INSERTしなければなりません。」とありますが、このときINSERTするレコードのTIME列の値を null にしたいということであれば、DBNull.Value を設定してください。 チェックボックスがONの時、 Ctrl.AddParameter("@TIME", CtrlTbx_Time.Text); 上記でエラーになってないのであれば、チェックボックスがOFFの時は Ctrl.AddParameter("@TIME", DBNull.Value); で良いです。クエリをわざわざstring.Formatする必要はないでしょう。 自分なら三項演算子を使います。
khr0404

2016/10/21 05:50

nakit様 回答有難うございます。 Ctrl.AddParameter("@TIME", DBNull.Value); でいけました。。。。 初歩的なミスでした。 三項演算子は使い慣れていないのでこれから勉強していかねばと考えております。
guest

0

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

投稿2016/10/14 07:46

編集2016/10/14 07:51
ishi9

総合スコア1294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

khr0404

2016/10/17 04:15

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

0

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

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

投稿2016/10/14 07:43

編集2016/10/14 07:45
s.t.

総合スコア2021

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

khr0404

2016/10/17 04:14

s.t.様 回答ありがとうございます。 elseのなかに何もかかなければ登録されない理屈はわかっておるのですが、その他の情報もおくりたいので、@TIMEの値だけ登録しないようにしたいです。 なので ``` public const string SQL_SCAN_INSERT = "INSERT INTO SCAN(TIME, )"+ "VALUES("@TIME,) "; ``` のTIMEと@TIMEを{0},{1}のようにしてON/OFFの切り替えで登録するしないをわけれるのかもと考えております。
guest

0

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

投稿2016/10/20 01:02

KIYOSHI

総合スコア268

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

khr0404

2016/10/21 05:52

KIYOSHI様 回答有難うございます。 単純なミスでした。 UPdateで@TIMEの値は更新するので Ctrl.AddParameter("@TIME", DBNull.Value); Ctrl.AddParameter("@TIME", 0); のどちらかでシステムに影響が少ないほうにしようと思っています。
guest

0

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

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

投稿2016/10/14 07:48

sk_3122

総合スコア1126

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

khr0404

2016/10/17 04:16

sk_3122様 回答ありがとうございます。 追記にも書きましたが、記載漏れがありました。 elseの中で@TIMEの値だけ登録しないようにする処理を行いたいです。
sk_3122

2016/10/17 07:36 編集

■他の項目もあるなら、ソースの部分にそれも書いた方が分かりやすいですね。 (そのままじゃなくても良いので) 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は無し?
khr0404

2016/10/21 05: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); } でエラーもなく登録できました。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問