質問内容
C#のWindows Formsアプリで、DataGridViewにSQL Serverから持ってきたDate型の情報をDataSource設定で表示したところ、0001/01/01(西暦1年1月1日)の場合だけそのセルが空欄になってしまいます。この理由についてご存知の方いらっしゃいましたら教えてください。後述のようにDefaultCellStyleでフォーマットをがっちり指定すれば問題が出ないようですが、なぜそうなるのかが分からず気持ち悪いので質問させていただいた次第です。
別段業務などで困っているわけではないので緊急ではありません。
環境は下記の2つで試しました。いずれも結果は同じです。
- .NET Framework 4.0、Visual Studio 2010
- .NET Framework 4.6.1 Visual Studio 2017
試したこと、回避方法
- DBから戻ってきたDataSet/DataTableのDataRowには値は入っていました。
- デバッグモードでセルのプロパティを見ていくと、情報として0001/01/01 00:00:00は保持しているようです(表示の問題っぽい)
- 0001/01/02であれば問題なく表示されます。
- 0001/01/01 00:00:01であれば問題なく表示されます(0秒だと表示されない)
- DataGridViewのセルに対して、DefaultCellStyle.Formatで「yyyy/MM/DD HH:mm:ss」を指定すると年月日時分秒問わず問題なく表示されます。
サンプルソースコード
SQL Server 2017からデータを持ってきています。実際はテーブルから取ってきているのですが、ここではサンプル用に無理やりDate型データを作って返しています。末尾の書式設定行を有効にすると問題は起きないのですが、書式設定なしだと1年1月1日の00:00:00だけ空欄になってしまいます。
C#
1 private void buttonShow_Click(object sender, EventArgs e) 2 { 3 // データベースから持ってきたDate型の情報をDataGridViewにデータバインドして表示する際に 4 // 0001/01/01の場合だけ空欄になる(0001/01/02や、0001/01/01 00:00:01は表示される。0001/01/01 00:00:00だけダメ) 5 6 SqlCommand cmd = new SqlCommand(); 7 DataSet ds = new DataSet(); 8 using (SqlDataAdapter adapter = new SqlDataAdapter()) 9 { 10 cmd.Connection = new SqlConnection("Data Source=TESTSERVER;Initial Catalog=test;User ID=test;Password=test"); 11 cmd.CommandText = 12 @"declare @tmp date; 13 set @tmp='0001/01/01'; 14 select @tmp as 西暦;"; 15 adapter.SelectCommand = cmd; 16 adapter.Fill(ds); 17 } 18 19 // DBから持ってきたデータを設定する 20 mainGrid.DataMember = ds.Tables[0].TableName; 21 mainGrid.DataSource = ds; 22 23 // この書式設定を行うと 0001/01/01 00:00:00 も表示されるが、設定しないと空欄になる(←この理由を知りたい) 24 // mainGrid.Columns[0].DefaultCellStyle.Format = "yyyy/MM/dd HH:mm:ss"; 25 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/21 14:34
2018/08/22 01:51