■86846 / inTopicNo.7) |
Re[1]: DateTime型のNULL許容 |
□投稿者/ 魔界の仮面弁士 (1596回)-(2018/03/25(Sun) 23:55:00)
|
■No86820 (kitsune さん) に返信 > テーブルのdate型(NULL許容)に生年月日が登録されるようになっています。
データベースの NULL と、C# の null は別物です。 https://docs.microsoft.com/ja-jp/dotnet/framework/data/adonet/sql/handling-null-values
同じように扱うライブラリもありますが、ADO.NET においては通常、 DBNull.Value がデータベースの null に相当します。
■No86818 (kitsune さん) に返信 > DateTime型にNULL値を登録したいのですが > 調べてみるとDateTimeの後ろに演算子? > をつけると許容できるとわかったのですがうまくいきません。
「DateTime?」は「System.Nullable<System.DateTime>」の省略表記ですが、 DataSet は Nullable<> 型をサポートしていないのでご注意ください。
ADO.NET の拡張ライブラリ(たとえば LINQ to DataSet や Dapper.NET など)を併用すれば、 NULL 許容なフィールドを Nullable<> 型にマッピングできなくは無いですが…。
> out BD のBDに赤波線が引かれ > 引数5は'out System.DateTime?'から'out System.DateTime'へ変換することはできません。
ここの out 引数は、「DateTime?」型ではなく「DateTime」型でなければなりません。
MaskedTextBox からの変換結果を受け取る変数は DateTime のままにしておき、それとは別に 誕生日を保持する null 許容な変数を設け、その別変数を DateTime? にするのが良いでしょう。
また、TryParseExact は引数が多いので、変換用のメソッドを作っておくと 楽かと思います。たとえばこんな感じのメソッドを用意するのは如何でしょうか。
private static DateTime? ToDate(string ymd) { return DateTime.TryParseExact(ymd, @"yyyy\/MM\/dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime dt) ? dt : default(DateTime?); }
private void Form1_Load(object sender, EventArgs e) { // これらはデザイン時に指定しておくこともできます。 MtxtBirthDay.TextMaskFormat = MaskFormat.IncludeLiterals; MtxtBirthDay.Mask = @"0000\/00\/00"; MtxtBirthDay.ValidatingType = typeof(DateTime); }
使う場合にはこんな感じです。
DateTime? birthday = ToDate(MtxtBirthDay.Text); // ★上記の自作メソッドで変換★ if (birthday == null) // ここの判定は「if (!birthday.HasValue)」でも良い { TxtAge.Clear(); MessageBox.Show(this, "生年月日を正しく入力してください。", "入力漏れ", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); MtxtBirthDay.Focus(); } else { // DateTime BD = (DateTime)birthday; DateTime BD = birthday.Value; // // 以下年齢計算処理……誕生日に未来の日付が指定された場合、マイナスの年齢をどう扱いますか? // }
> TextBox(TextAge)に年齢が表示されるコードです。 ご存知かもしれませんが、年齢の数え方にはいくつかの方法があるのでご注意ください。
ひとつは仏教などで使われている【数え年】。 「いくつの年と関わったか」を表す数え方であり、 出生した時点で「1歳」とし、以降、正月を迎えるたびに +1 歳していく方法です。 月や日は考慮せず、西暦部だけで計算できるので最も簡単な数え方ですね。 この方式では 2000/12/31 生まれの場合、2000/12/31 時点で 1 歳、2001/01/01 時点で 2 歳と数えます。
もう一つは、法律上における年齢算出となる【満年齢】。 http://elaws.e-gov.go.jp/search/elawsSearch/elaws_search/lsg0500/detail?lawId=135AC0000000050 出生した時点を「0歳」とし、以降、誕生日の前日(の24時)を迎えるたびに +1 歳する方法です。 この方式では 2000/01/01 生まれの場合、2000/12/30 までは 0 歳、2000/12/31 時点で 1 歳と数えます。
もう一つは、kitsune さんが書かれていた方法。 これも満年齢の一種ではあるのですが、こちらは法律上の満年齢とは 1 日ズレがあり、 出生した時点を「0歳」とし、以降、誕生日(の0時)を迎えるたびに +1 歳する方法となります。 この方式では 2000/01/01 生まれの場合、2000/12/31 までは 0 歳、2001/01/01 時点で 1 歳と数えます。
> c#の学習をしています。 ちなみに正式名称は c# ではなく C# です。細かい事ですが、一応指摘。
[JIS X 3015] 》 C#は,“しーしゃーぷ”と発音する。 》 C#は,LATIN CAPITAL LETTER C (U+0043)の次に NUMBER SIGN # (U+0023)を書く。
[ECMA-334] 》 The name C# is pronounced “C Sharp”. 》 The name C# is written as the LATIN CAPITAL LETTER C (U+0043) followed by the NUMBER SIGN # (U+0023).
|
|