2015/01/28

C#.Net MySQL Date to C#.Net DateTime format

兩年前也有遇到這問題,那時候應該用比較差的方法解決
只是一直忘記寫筆記,而且程式碼也不知道放到哪去了
剛好最近又遇到所以還是寫篇文章來紀錄

程式碼如下,看起來單純在撈資料,並將資料給予DataGridView作顯示而已


Code:
using MySql.Data.MySqlClient;
using System;
using System.Data;
using System.Windows.Forms;

namespace Sample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            using (MySqlConnection conn = new MySqlConnection("server={0};database={1};uid={2};pwd={3};charset=utf8;Allow Zero Datetime = true;"))
            {
                conn.Open();
                using (MySqlDataAdapter adapter = new MySqlDataAdapter("SELECT date FROM test;", conn))
                {
                    DataSet set = new DataSet();
                    adapter.Fill(set);
                    dataGridView1.DataSource = set.Tables[0];
                }
            } 
        }

    }

}




執行結果:

顯示出來的數值也沒什麼錯誤


但是當修改了該日期的數值就會噴出以下錯誤
這時可以透過Style或是DateTime去解決,不過在此不提這些方法
這次要提出的方法是透過MySQL的方法Date_Format去解決



可以看到下方程式碼與上面差異在於搜尋語法有異動
修改前顯示的日期為2014/6/24,這樣的格式不符和.Net
而我們希望日期格式能符合.Net能接受的
所以我們透過Date_Format的方法去設定格式內容

%Y:顯示年的四個數字,亦即2000
%c:顯示月份數字,亦即一月則為1
%d:顯示日期,一號而言則為01

//修改前
using (MySqlDataAdapter adapter = new MySqlDataAdapter("SELECT date FROM test;", conn))

//修改後
using (MySqlDataAdapter adapter = new MySqlDataAdapter("SELECT DATE_FORMAT(date, '%Y%c%d') as date FROM test;", conn))



修改後Code:
using MySql.Data.MySqlClient;
using System;
using System.Data;
using System.Windows.Forms;

namespace Sample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            using (MySqlConnection conn = new MySqlConnection("server={0};database={1};uid={2};pwd={3};charset=utf8;Allow Zero Datetime = true;"))
            {
                conn.Open();
                using (MySqlDataAdapter adapter = new MySqlDataAdapter("SELECT DATE_FORMAT(date, '%Y%c%d') as date FROM test;", conn))
                {
                    DataSet set = new DataSet();
                    adapter.Fill(set);
                    dataGridView1.DataSource = set.Tables[0];
                }
            } 
        }

    }

}


可以看到下方結果,顯示畫面與修改前差異不大
但在修改數值時不會出錯

修改後執行結果:



參考資料:
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format