iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 16
1
Modern Web

ASP.NET MVC網頁程式介紹系列 第 16

[Day 16] 使用C#連結MySql(MariaDB)資料庫(二)

今天開始資料庫實作的部分,為了建立使用者資料,這兩天先建 城市 跟 鄉鎮 的資料起來,(為了節省時間,一天建一個表的資料)

需要引入的專案名稱

using MySql.Data.MySqlClient;
using System.Data;

首先要先有連線字串

string connString = "server=127.0.0.1;port=3306;user id=root;password=***;database=mvctest;charset=utf8;";

這是MySql的連線字串,如果要連MS-SQL寫法不一樣
其中server是資料庫的IP,port是資料庫的Port,MySql預設是3306,MS-SQL預設是1433,user id是使用者帳號,password是密碼,通常要寫密碼,在這裡先馬賽克掉了,database是要連線的資料庫名稱,如果在同一個資料庫系統中,也可以連其他資料庫名稱,然後到這個資料庫抓資料,不過語法要改一下;charset編碼通用的是utf8

然後要有一個Connection

MySqlConnection conn = new MySqlConnection();

正常來說會獨立做一個Class,不過在這裡直接在網頁建表就好了,以下是整個程式碼,下面再做說明

using MVCTest.Models;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCTest.Controllers
{
    public class HomeController : Controller
    {
        string connString = "server=127.0.0.1;port=3306;user id=root;password=Acuteboy1215;database=mvctest;charset=utf8;";
        MySqlConnection conn = new MySqlConnection();
        public ActionResult Index()
        {
            conn.ConnectionString = connString;
            if (conn.State != ConnectionState.Open)
                conn.Open();
            string sql = @"INSERT INTO `City` (`Id`, `City`) VALUES
                           ('0', '基隆市'),
                           ('1', '臺北市'),
                           ('2', '新北市'),
                           ('3', '桃園市'),
                           ('4', '新竹市'),
                           ('5', '新竹縣'),
                           ('6', '宜蘭縣'),
                           ('7', '苗栗縣'),
                           ('8', '臺中市'),
                           ('9', '彰化縣'),
                           ('A', '南投縣'),
                           ('B', '雲林縣'),
                           ('C', '嘉義市'),
                           ('D', '嘉義縣'),
                           ('E', '臺南市'),
                           ('F', '高雄市'),
                           ('G', '屏東縣'),
                           ('H', '澎湖縣'),
                           ('I', '花蓮縣'),
                           ('J', '臺東縣'),
                           ('K', '金門縣'),
                           ('L', '連江縣');
";
            MySqlCommand cmd = new MySqlCommand(sql, conn);
            int index = cmd.ExecuteNonQuery();
            bool success = false;
            if (index > 0)
                success = true;
            else
                success = false;
            ViewBag.Success = success;
            conn.Close();
            return View();
        }
    }
}

首先要幫連線跟字串連結起來,就是這一行

conn.ConnectionString = connString;

然後要將連線打開,但是如果已經開了,再打開一次會出錯,所以要先判斷

if (conn.State != ConnectionState.Open)
    conn.Open();

接下來是SQL語法,關於SQL語法這裡不多做說明,網路上都可以查得到語法,總是這是幫資料表新增資料得語法,SQL語法大致上可以分為讀取和執行兩種,這是執行的部分,讀取的部分方法就比較多一點。

接下來建一個Command

MySqlCommand cmd = new MySqlCommand(sql, conn);

然後執行指令

int index = cmd.ExecuteNonQuery();

ExecuteNonQuery如果用在新增修改刪除,成功會返回受影響的列數,失敗會傳回0,最後再判斷是否成功

結果:

建立成功!
(只有一行而已,不想截圖了)

今天到此為止,明天繼續鄉鎮市的建立吧。
(感覺好像有點混,時間寶貴嘛...)

--
小弟不才,
如果有謬誤或是要補充的,
都歡迎一起來討論!


上一篇
[Day 15] 使用C#連結MySql(MariaDB)資料庫(一)
下一篇
[Day 17] 使用C#連結MySql(MariaDB)資料庫(三)
系列文
ASP.NET MVC網頁程式介紹30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
deh
iT邦研究生 1 級 ‧ 2019-10-08 09:53:58

若Table中有Primary Key,
在遇到重複INSERT,或PKey重複的情況下,

cmd.ExecuteNonQuery()會直接報錯,而不是傳回0。

除了使用INSERT INTO ..... ON DUPLICATE KEY UPDATE .....
(如此篇https://stackoverflow.com/questions/35185059/how-to-supress-mysql-data-mysqlclient-mysqlexception-duplicate-entry?answertab=oldest#tab-top)

有其他解法嗎?
感覺實務上其實挺容易遇到的。

使用ON DUPLICATE KEY UPDATE不會報錯,也讓資料不會被修改,
但無法得知有重複PKey的欄位被重複輸入並捨棄。
舉例來說先輸入了100筆資料,接著再輸入了100筆,但Table裡面只有198筆,
無法知道消失的那兩筆是什麼。

看更多先前的回應...收起先前的回應...
小魚 iT邦大師 1 級 ‧ 2019-10-08 10:52:16 檢舉

如果你不是用自動增加的,
是怎麼重複的呢?

deh iT邦研究生 1 級 ‧ 2019-10-08 11:02:42 檢舉

當時是想到讓使用者輸入資料,或是讓使用者上傳excel。
不過現在想想,使用者輸入資料在進資料庫前確認即可。
使用者上傳excel正常情況下也不需要PKey。
所以應該遇不太到這種問題。

小魚 iT邦大師 1 級 ‧ 2019-10-08 11:30:55 檢舉

主鍵一般都是系統自動產生,
沒有讓使用者自己輸入的道理,
甚至有時候整個畫面都看不到主鍵,
也是很正常的事.

deh iT邦研究生 1 級 ‧ 2019-10-08 11:33:56 檢舉

/images/emoticon/emoticon12.gif

0
itsteven
iT邦新手 5 級 ‧ 2021-05-10 13:36:07

請問這裡建的City資料
Id欄位為什麼會用數字和英文混和來編號
有什麼特別用意嗎

看更多先前的回應...收起先前的回應...
小魚 iT邦大師 1 級 ‧ 2021-05-10 18:03:39 檢舉

沒甚麼意義,
只是數字不夠用
/images/emoticon/emoticon39.gif

你可以定義任何代號都沒問題.

itsteven iT邦新手 5 級 ‧ 2021-05-10 23:35:26 檢舉

原來是這樣,謝謝解答~
但數字不夠用,怎麼沒有用10、11、12...?

小魚 iT邦大師 1 級 ‧ 2021-05-11 08:04:27 檢舉

因為我懶得打兩個字,
其實你是不是注意錯重點了?

itsteven iT邦新手 5 級 ‧ 2021-05-11 11:52:29 檢舉

喔喔 對,謝謝,這個不是這篇該注意的點

我要留言

立即登入留言