首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET 連接 MySQL 完整指南:驅動安裝、連線字串與 CRUD 實戰

     編輯:關於.NET

前置準備

  1. 下載 **MySQL Connector/NET** (官方 ADO.NET 驅動):
    https://dev.mysql.com/downloads/connector/net/
    選擇對應 .NET Framework 版本 (如 8.0.x 支援 .NET 4.6.2+ / .NET Core / .NET 5+)。
  2. 安裝後,於專案 **加入參考** → `MySql.Data.dll` (通常在 `C:\Program Files (x86)\MySQL\MySQL Connector Net \Assemblies\`)。
  3. 引用命名空間:using MySql.Data.MySqlClient;

連線字串關鍵參數

Server=localhost;Database=school;Uid=root;Pwd=123;CharSet=utf8;SslMode=None;
參數說明建議值
ServerMySQL 主機 IP/主機名localhost / 192.168.x.x
Database資料庫名稱school
Uid / Pwd帳號/密碼root / 123
CharSet字元編碼,**必設 utf8/utf8mb4** 避免中文亂碼utf8
SslModeSSL 模式,開發環境可設 NoneNone / Preferred
Connection Timeout連線逾時秒數30
Pooling連線池啟用true

資料庫操作封裝類別

public static class MySqlHelper
{
    private static readonly string ConnStr =
        "Server=localhost;Database=school;Uid=root;Pwd=123;CharSet=utf8;SslMode=None;Pooling=true;";

    public static MySqlConnection GetConnection()
    {
        var conn = new MySqlConnection(ConnStr);
        conn.Open();
        return conn;
    }

    // 查詢單一值
    public static T ExecuteScalar(string sql, params MySqlParameter[] parameters)
    {
        using var conn = GetConnection();
        using var cmd = new MySqlCommand(sql, conn) { Parameters = { } };
        cmd.Parameters.AddRange(parameters);
        return (T)cmd.ExecuteScalar();
    }

    // 查詢列表 (DataReader 高效能)
    public static List Query(string sql, Func map, params MySqlParameter[] parameters)
    {
        var list = new List();
        using var conn = GetConnection();
        using var cmd = new MySqlCommand(sql, conn);
        cmd.Parameters.AddRange(parameters);
        using var reader = cmd.ExecuteReader();
        while (reader.Read()) list.Add(map(reader));
        return list;
    }

    // 執行非查詢
    public static int ExecuteNonQuery(string sql, params MySqlParameter[] parameters)
    {
        using var conn = GetConnection();
        using var cmd = new MySqlCommand(sql, conn);
        cmd.Parameters.AddRange(parameters);
        return cmd.ExecuteNonQuery();
    }
}

實戰範例:學生資料 CRUD

資料表結構

CREATE TABLE `student` (
  `id` INT PRIMARY KEY AUTO_INCREMENT,
  `name` VARCHAR(50) NOT NULL,
  `age` INT,
  `email` VARCHAR(100)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

實體對應

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public string Email { get; set; }
}

Repository 實作

public class StudentRepository
{
    public List GetAll() =>
        MySqlHelper.Query("SELECT * FROM student", r => new Student
        {
            Id = r.GetInt32("id"),
            Name = r.GetString("name"),
            Age = r.GetInt32("age"),
            Email = r.IsDBNull(r.GetOrdinal("email")) ? null : r.GetString("email")
        });

    public Student GetById(int id) =>
        MySqlHelper.Query("SELECT * FROM student WHERE id=@id",
            r => new Student { Id = r.GetInt32("id"), Name = r.GetString("name"), Age = r.GetInt32("age"), Email = r.GetString("email") },
            new MySqlParameter("@id", id)).FirstOrDefault();

    public int Insert(Student s) =>
        MySqlHelper.ExecuteNonQuery("INSERT INTO student(name,age,email) VALUES(@name,@age,@email)",
            new MySqlParameter("@name", s.Name), new MySqlParameter("@age", s.Age), new MySqlParameter("@email", s.Email));

    public int Update(Student s) =>
        MySqlHelper.ExecuteNonQuery("UPDATE student SET name=@name,age=@age,email=@email WHERE id=@id",
            new MySqlParameter("@name", s.Name), new MySqlParameter("@age", s.Age), new MySqlParameter("@email", s.Email), new MySqlParameter("@id", s.Id));

    public int Delete(int id) =>
        MySqlHelper.ExecuteNonQuery("DELETE FROM student WHERE id=@id", new MySqlParameter("@id", id));
}

Console 測試程式

class Program
{
    static void Main()
    {
        var repo = new StudentRepository();

        // Insert
        repo.Insert(new Student { Name = "張三", Age = 20, Email = "zhang@example.com" });
        Console.WriteLine("Inserted.");

        // Query All
        foreach (var s in repo.GetAll())
            Console.WriteLine($"{s.Id}\t{s.Name}\t{s.Age}\t{s.Email}");

        // Update
        var stu = repo.GetById(1);
        stu.Age = 21;
        repo.Update(stu);
        Console.WriteLine("Updated.");

        // Delete
        repo.Delete(1);
        Console.WriteLine("Deleted.");

        Console.ReadKey();
    }
}

常見錯誤與解決

錯誤原因解決
Unable to connect to any of the specified MySQL hosts主機/連接埠/防火牆/skip-networking檢查 3306 開放、my.cnf bind-address=0.0.0.0、防火牆放行
Authentication method 'caching_sha2_password' not supportedMySQL 8.0 預設新認證插件,舊驅動不支援升級 Connector/NET 8.0+ 或建立用戶指定 mysql_native_password
中文亂碼CharSet 未設或資料表非 utf8mb4連線字串加 CharSet=utf8mb4、資料表/欄位 CHARSET=utf8mb4
Connection must be valid and open連線未 Open 或已 Dispose確保 using 區塊正確、不要重複使用已關閉連線

進階建議

  • **參數化查詢** 防 SQL Injection (範例皆使用 MySqlParameter)。
  • **連線池** 預設開啟,高併發下效能最佳。
  • **Dapper / Entity Framework Core** 可進一步簡化映射代碼。
  • **Async/Await** 版本 (ExecuteReaderAsync 等) 適用於 ASP.NET Core 高併發場景。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved