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

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

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

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

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Visual Studio

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

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

SQL

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

Q&A

2回答

7382閲覧

date型にNULLを登録できません

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Visual Studio

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

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

SQL

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

0グッド

0クリップ

投稿2018/03/16 02:48

前提・実現したいこと

visual studio 2017 c#
SQL Server Management Studio 17

名前と生年月日と年齢をSQLに登録するシステムを作っています。
イメージ説明
イメージ説明

生年月日...MaskedTextBoxコントロールを使用しています。
___/_/_/←マスクの設定でこちらを定形にしています。

SQLにはdate型(NULL許容)で登録されるようになっています。

発生している問題・エラーメッセージ

生年月日を___/_/_/未入力の状態で登録した時にエラーが発生します。

文字列から日付と時刻、またはそのいずれかへの変換中に、変換が失敗しました。

試したこと

MaskedTextBoxではなくTextBoxに変えて未入力した場合を試してみました。
するとNULL値ではなく、1900-01-01とSQLに登録されます。
調べてみると、date型はブランクで登録できない(?)みたいでした。

上記で
MaskedTextBoxの場合はスラッシュが邪魔をしてエラーが発生しているのだと分かったのですが

どうすれば、MaskedTextBox(___/_/_/)を用いて
SQLのdate型にNULL値で登録できるのでしょうか?

もしくは、TextBoxを使って日付を入力したときにだけスラッシュが出現するというイベントは作れないでしょうか?

該当のソースコード

年齢計算ボタン...ButtonAgeCal
生年月日テキスト...MTxtBirthDAy
年齢...TxtAge

C#

1 2/// 生年月日から年齢を計算 3private void ButtonAgeCal_Click(object sender, EventArgs e) 4{ 5 DateTime BD; 6 7 if (!DateTime.TryParseExact(MtxtBirthDay.Text, "yyyy/MM/dd", null, System.Globalization.DateTimeStyles.None, out BD)) 8 { 9 MessageBox.Show("生年月日を正しく入力してください"); 10 } 11 else 12 { 13 int age = DateTime.Today.Year - BD.Year; 14 if (BD > DateTime.Today.AddYears(-age)) age--; 15 16 TxtAge.Text = age.ToString(); 17 } 18} 19

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

初心者でまだ理解も浅いのでよろしくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/03/16 03:13

示されている状況において、SQLは全く関係ないので、質問タグからSQLははずすべきかと。また、エラーメッセージを表示した箇所のソースコードは特定できていますか?
hihijiji

2018/03/16 03:25

.Net からDBMSにアクセスする方法は DataReader / DataAdapter / TableAdapter / Entity Framework 等をはじめ多種様々です。 貴方が用いた方法をバージョンや手順を含めて詳しく書いてください。 また、DBデータをUIに表示するようにした方法も全くふれてませんが、それも重要です。 それら全ての情報を書き出してください。
sk_3122

2018/03/16 03:56

既に指摘されていますが… 更新はどのように行っているでしょうか。 MTxtBirthDAy の入力値を取得して、自分で SQL 文を書いて投げている? EntityFramework を使っていて entity.SaveChanges() などを呼んでいる? それとも他の方法でしょうか。
sk_3122

2018/03/16 03:57

「文字列から日付と時刻、またはそのいずれかへの変換中に、変換が失敗しました。」このエラーはSQLServerが吐いているのではないかと思うのですが、となると必要なのは上記の情報と、その部分(SQL文を生成して実行している部分など)のロジックになります。質問に貼り付けられているコードは入力値をチェックしている部分ですが、今回はこの部分は関係ないかな?と思います
sk_3122

2018/03/16 04:05 編集

というか「visual studio 2017 c#」だとちょっと情報が足りないですね。「Windows フォーム アプリケーション」 とか 「WPF」 かとか 何を使っているか分かるでしょうか。Windows フォーム アプリケーションかな・・・
guest

回答2

0

DateTime 型はクラスでなく構造体なので null にはなりません。
DB で null 許容日付時尅型を使っているのなら対応するのは DateTime ではなく DateTime? 型です。

投稿2018/03/16 13:29

Zuishin

総合スコア28660

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

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

0

___/_/_/←マスクの設定でこちらを定形にしています。

上記と TryParseExact メソッドで設定している "yyyy/MM/dd" とが異なるからでは?

デザイン画面の Mask プロパティの設定で「定型入力」ダイアログを開くと、その中に「日付(西暦)」という項目があります。

その場合、マスクは 0000/00/00 で、プレビューは ____/__/__ となっているはずです。

それを選んだらどうなりますか?

【追伸】

質問の意味が理解できてなかったようですみません。

入力があるときは問題ないが、未入力の時は DB に NULL を入れたいということですね?

どうやって DB に登録しているのか不明ですが、ADO.NET を利用している場合の定型ですと、未入力と判定されたらパラメータに DBNull.Value を代入するということになるはずです。

投稿2018/03/16 03:46

編集2018/03/16 04:03
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問