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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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

解決済

2回答

3846閲覧

ComboBoxのnull設定

maam

総合スコア55

C#

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

Visual Studio

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

SQL

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

0グッド

0クリップ

投稿2018/12/28 06:25

編集2018/12/28 06:48

VisualStudioで
Formに生年月日を入力するためのComboBoxを
・年(ComboBox1)
・月(ComboBox2)
・日(ComboBox3)の3つ配置しています。
この3つのComboBoxをひとつにまとめてSQLServerのbirthdayに登録します。
各ComboBoxの項目を選択して登録ボタンを押すと、
選択通りの生年月日がSQLServer上に登録されるのですが、
各ComboBoxを何も選択せずに(気持ちとしてはNull状態で)登録ボタンを押すと、
なぜか1900-01-01という生年月日が設定されてSQLServer上に登録されてしまいます。
SQLServerでbirthdayを「Null許容」にしているのに
どうして勝手に設定されるのでしょうか。
ComboBoxを何も選択しなければNullで登録される方法を教えてください。
よろしくお願いいたします。

string year = comboBox1.Text; string month = comboBox2.Text; string day = comboBox3.Text; if (year != "" || month != "" || day != "") { int y = int.Parse(year); int m = int.Parse(month); int d = int.Parse(day); DateTime dt = DateTime.Now; int iYear = dt.Year; //現在の年を取得 int iMonth = dt.Month; //現在の月を取得 int iDay = dt.Day; //現在の日を取得 //生年月日が存在しない時 if (y > iYear) { label11.Text = "生年月日が不正です。"; return; } else if (y <= iYear && m > iMonth) { label11.Text = "生年月日が不正です。"; return; } else if (y <= iYear && m <= iMonth && d > iDay) { label11.Text = "生年月日が不正です。"; return; } label11.Text = ""; }

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

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

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

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

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

YAmaGNZ

2018/12/28 06:32 編集

どのようなコードを書いているのですか? また、その時どのようなSQLが実行されるか確認しましたか? Birthdayの型は何なのですか?
maam

2018/12/28 06:45

YAmaGNZさん上記に追加しました。 birthdayの型はdate型です。
YAmaGNZ

2018/12/28 07:25

データーベースに登録している箇所です。 どのようなデータの書き込み方を行っているのですか?
guest

回答2

0

ベストアンサー

前の質問から想像して、誕生日の部分は

SQL

1INSERT INTO テーブル (Birthday) VALUES (@Birthday)

となっていて(他のカラムに関しては省いています)
C#のコードで

C#

1New SqlClient.SqlParameter("@Birthday", y + m + d))

このようにパラメータを追加しているのだと想像します。
ここでComboBoxにて年月日を指定しなかった場合は
y + m + dは長さ0の文字列となります。
この時実行されるSQLは

SQL

1INSERT INTO テーブル (Birthday) VALUES ('')

と同等のものが実行されます。
SQLServerは文字列''をDate型に変換すると1900-01-01と変換します。
この為、実際にインサートされたデータは1900-01-01となっています。
これをnullとする場合は、実行するSQLからBirthdayの部分を削るかパラメータの追加で

C#

1New SqlClient.SqlParameter("@Birthday", DBNull.Value)

とnullを明示的に指定しないといけません。

投稿2018/12/28 10:06

YAmaGNZ

総合スコア10242

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

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

maam

2019/01/07 01:49

回答ありがとうございました! パラメータの記入方法を変更すれば良いとのことですが、 以下のように作成した場合 ”New SqlClient.SqlParameter("@Birthday", DBNull.Value)”は どこへ追加すればよろしいでしょうか using (var connection = new SqlConnection(connectionString)) using (var command = connection.CreateCommand()) { try { // データベースの接続開始 connection.Open(); // SQLの準備 command.CommandText = "INSERT INTO MEMBER_MASTER (name1, name2, birthday, gender, post_code, adress) VALUES" + "(@name1, @name2, @birthday, @gender, @post_code, @adress)"; command.Parameters.Add(new SqlParameter("@name1", sei)); command.Parameters.Add(new SqlParameter("@name2", mei)); command.Parameters.Add(new SqlParameter("@birthday",year + month + day)); command.Parameters.Add(new SqlParameter("@gender", seibetu)); command.Parameters.Add(new SqlParameter("@post_code", yuubin1 + yuubin2)); command.Parameters.Add(new SqlParameter("@adress", jyusyo)); // SQLの実行 command.ExecuteNonQuery(); }
YAmaGNZ

2019/01/07 01:57

誕生日が空になっているか判断すればよろしいかと if (誕生日が空) { command.Parameters.Add(new SqlParameter("@birthday",DBNull.Value)); }else{ command.Parameters.Add(new SqlParameter("@birthday",year + month + day)); }
maam

2019/01/07 02:08

誕生日をNullで登録することができました!本当にありがとうございます><
maam

2019/01/11 02:09

以前ご質問させていただいたのですが、続いて別の問題がでました。 上記によってNulで登録したのち、違うフォームからその登録情報を表示させようとすると、”ハンドルされませんでした”というエラーが出てしまいました。 どうしてでしょうか
YAmaGNZ

2019/01/11 02:19

情報が何もないので答えようがありません。 詳細な情報を記載して新たに質問をされたほうがよろしいかと思います。
guest

0

なにも設定してないときはnullを設定するようにコードを組みましょう。
なにも設定してない、という判断はできるでしょう

投稿2018/12/28 06:52

編集2018/12/28 06:53
y_waiwai

総合スコア87749

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問