iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 18
1
IoT

來與IoT譜寫一首戀愛樂章吧系列 第 18

op.18 《應用層》-C# 與 MySQL的愛情

op.18 善用自己的工具紀錄

更方便地紀錄我們彼此之間的點滴
就會需要更好用的工具!

今天是連假大魔王的第3天,我決定繼續跟專題死喀到底XD

C# 與 MySQL的相愛相殺

昨天已經把資料庫都搞定了,那今天就是要來用我們熟悉的 C# 來操控啦,今天會教一些比較實用的幾個功能,就先往下看啦。

先是與資料庫連接的部分,需要先 Nuget 套件,需要 MySql.Data ,所以一樣需要先 using 相關的檔案進來。

using  Mysql.Data.MysqlClient;

連接資料庫其實很簡單,首先需要 建立連線 > 執行指令 > 關閉連線,這三大步驟。

建立連線的部分,需要宣告一個 MySqlConnection 的物件,裡面存放著相關連線資訊 (如:主機位置、使用者帳號等),所以需要先宣告 MySqlConnection 的物件。

MySqlConnection conn = new MySqlConnection();

我們新增一個視窗程式專案,並且新增一個按鈕在表單上,我們來寫一個測試連線的按鈕。
https://ithelp.ithome.com.tw/upload/images/20201003/201290840VeeOYOwja.png
點兩下新增一個 Click事件

conn.ConnectionString = ConnectionString;
try
{
    conn.Open();
    if (conn.State == ConnectionState.Open)
    {
        MessageBox.Show("連線成功","成功");
        conn.Close();
    }
}
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message,"失敗");
    }

上段程式碼主要是當按下按鈕時,先將連線的字串對應設定,然後進入 Try... Catch...段,使用 Try Catch主要是防止在連接資料庫時發生錯誤,導致程式被迫中止,連線過程總是會有許多的未知錯誤,比如最基本資料庫還沒運行、帳號密碼錯誤等,所以使用 Try Catch 防止出錯。

當成功連接時,這裡用了一個 if (conn.State == ConnectionState.Open) 確認連線狀態,當確認已經開啟時,就使用 Messagebox 來提示使用者。
當不成功連接時,則將捕捉到錯誤的資訊用 Messagebox 來提示使用者。

連接成功
https://ithelp.ithome.com.tw/upload/images/20201003/20129084ybQeTjCDrX.png
連接失敗(找不到主機或是沒開)
https://ithelp.ithome.com.tw/upload/images/20201003/201290842Drec6mZ2F.png
連接失敗(使用者帳號或密碼錯誤)
https://ithelp.ithome.com.tw/upload/images/20201003/20129084KXAZbDTXdn.png

這樣就完成與 Mysql的連線了,今天就到此結束吧(OS:太少了吧!欠打。

好的,繼續提供給大家我的一些小祕方。


列出資料庫中的所有表格

需要事先拉出 CheckedListBox,並且給與一個按鈕。

conn.ConnectionString = ConnectionString;
try
{
    conn.Open();
    if (conn.State == ConnectionState.Open)
    {
        checkedListBox1.Items.Clear();
        try
        {
            var commandStr = "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='DATABASE'";
            var sqlCommand = new MySql.Data.MySqlClient.MySqlCommand(commandStr, conn);
            var dr = sqlCommand.ExecuteReader();
            while (dr.Read())
            {
                checkedListBox1.Items.Add(dr["TABLE_NAME"], false);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("讀取資料失敗 原因為 " + ex.Message, "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}
catch(Exception ex)
{
    MessageBox.Show(ex.Message, "失敗");
}

執行結果:
https://ithelp.ithome.com.tw/upload/images/20201003/20129084GCcx4UagiN.png
https://ithelp.ithome.com.tw/upload/images/20201003/201290847kWyj0A93h.png

今天先到這裡偷懶個,日後再補上其他延伸的功能。

資料的新增 (10.03 22:20 ADD)

這裡示範用迴圈快速新增10筆資料,其實主要也是透過 sql 語法來進行資料的新增,只是我們把需要打sql指令的地方,用程式幫我們執行,這裡有用到 c# 的 DateTime 來取得現在時間。

conn.ConnectionString = ConnectionString;
try
{
    conn.Open();
    if (conn.State == ConnectionState.Open)
    {
        for(int i=0; i < 10; i++)
        {
            DateTime date = DateTime.Now;
            var commandStr = "INSERT INTO `test01`.`data` (`ID`, `Time`, `Temperature`, `Humidity`) VALUES ('" +
            i.ToString() + "', '" +
            date.ToString("yyyy-MM-dd HH:mm:ss") + "', '35.2', '24.3');";
            
            var sqlCommand = new MySql.Data.MySqlClient.MySqlCommand(commandStr, conn);
            var dr = sqlCommand.ExecuteNonQuery();
        }
        MessageBox.Show("Ok", "完成");
        conn.Close();
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message, "失敗");
}

其實這整段的精華在於 var dr = sqlCommand.ExecuteNonQuery(); 透過使用 ExecuteNonQuery() 來執行指令,雖然沒有回傳值,但是操作依然會正常操作。

實際結果:
https://ithelp.ithome.com.tw/upload/images/20201003/20129084tqegp618yJ.png
https://ithelp.ithome.com.tw/upload/images/20201003/201290845WWgZxeFP1.png
https://ithelp.ithome.com.tw/upload/images/20201003/20129084xDVHoSFlbC.png
https://ithelp.ithome.com.tw/upload/images/20201003/20129084wxALztdBbA.png


資料庫的表格內容全部清除

簡單地說,通通清掉啦XD

conn.ConnectionString = ConnectionString;
try
{
    conn.Open();
    if (conn.State == ConnectionState.Open)
    {
        var commandStr = "truncate table `test01`.`data`";
        var sqlCommand = new MySql.Data.MySqlClient.MySqlCommand(commandStr, conn);
        var dr = sqlCommand.ExecuteNonQuery();
        MessageBox.Show("Ok", "完成");
        conn.Close();
     }
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message, "失敗");
}

實際結果:
https://ithelp.ithome.com.tw/upload/images/20201003/20129084J2onmIkY7Q.png
https://ithelp.ithome.com.tw/upload/images/20201003/20129084res6itqKnE.png
https://ithelp.ithome.com.tw/upload/images/20201003/20129084YrHYy6vz9o.png
https://ithelp.ithome.com.tw/upload/images/20201003/20129084pI8SIctbeG.png


總結:

其實最後是跟 SQL 語法相關,而 C# 其實只是幫助執行的部分,所以以上的內容當然也可以轉換語言為 C or Python 等你熟悉的語言,那這裡就是用 C# 來跟大家粗略的介紹,至於功能如何開發,則是依照自己的需求下去配給不同的元件或程式碼。


附錄:

其實裝了 phpMyAdmin 後,很多的 SQL 語法我都是用 phpMyAdmin 生成的,進階的功能才再研究,這裡示範新增資料表的過程所產生的語法。

先以正常的圖形化介面方式新增資料表
https://ithelp.ithome.com.tw/upload/images/20201003/20129084KfhSszat13.png

然後可以在右下角預覽SQL
https://ithelp.ithome.com.tw/upload/images/20201003/20129084UbpjMsPT6B.png

就可以複製出來了解這段 SQL 在幹嘛啦~

CREATE TABLE `test`.`test02` ( `ID` INT NOT NULL , `Text` TEXT NOT NULL , `Date` DATETIME NOT NULL , `num` INT NOT NULL ) ENGINE = MyISAM;

上面就寫明的 CREATE TABLE (創建表格),在 test的資料庫中建置一個 test02表格,欄位分別是 'ID' (INT型態)、'Text' (TEXT型態)、'Date' (DATETIME型態)、'num' (INT型態),使用的引擎是 MyISAM,透過這樣的方式,可以減輕對 SQL 學習的負擔,畢竟太多東西要學了,沒辦法樣樣專精,可以這樣偷懶個XD


好啦今天就到這裡啦!祝各位明天一樣有烤肉吃

今日的曲子:<<凌晨兩點>>孫沛立

「現在的時間是凌晨兩點鐘,收音機正播放著時下流行的抒情歌曲...
寧靜的夜裡,只有那照片裡的人,還對我親切地微笑著...」

這首是我大一時很喜歡的曲子,是我當初練二胡的目標;後來也確實的練了起來,雖然還沒有到達那種意境XD;到了大三,開始以寫出這樣的曲子為目標XD,很佩服一位活躍於影像科學的教授,一樣可以用音符寫日記,希望自己有天也能到此境界。

笑死...發出去才發現沒有打標題XD


上一篇
op.17 《應用層》-資料庫介紹與建置
下一篇
op.19 《應用層》-初探 Flutter
系列文
來與IoT譜寫一首戀愛樂章吧30

尚未有邦友留言

立即登入留言