国产成人精品亚洲日本在线_欧美精品v国产精品v_亚洲欧洲日韩国产一区二区三区_亚洲乱码一二三四区

9000px;">

<address id="tjdjd"></address>
<address id="tjdjd"></address>

    <address id="tjdjd"><nobr id="tjdjd"><progress id="tjdjd"></progress></nobr></address>

      <form id="tjdjd"><listing id="tjdjd"><meter id="tjdjd"></meter></listing></form>
      <address id="tjdjd"></address><address id="tjdjd"></address>

      當(dāng)前位置 主頁 > 技術(shù)大全 >

        從入門到精通:C 與MySQL交互的完整代碼示例與常見錯(cuò)誤解決方案

        欄目:技術(shù)大全 時(shí)間:2025-10-16 22:16

        在 C# 中連接 MySQL 數(shù)據(jù)庫是一項(xiàng)非常常見的任務(wù)。下面我將為您提供一個(gè)從基礎(chǔ)到進(jìn)階的完整指南,包括環(huán)境配置、代碼實(shí)現(xiàn)、最佳實(shí)踐和常見問題處理。

        一、 選擇連接器(驅(qū)動(dòng))

        在 C# (.NET) 中連接 MySQL,官方推薦使用 **MySQL Connector/NET**,這是一個(gè)完全托管的 ADO.NET 驅(qū)動(dòng)程序,F(xiàn)在它主要通過 **NuGet** 包進(jìn)行分發(fā),包名稱為:

        * **`MySql.Data`** (官方驅(qū)動(dòng))

        #安裝 NuGet 包

        在您的 C# 項(xiàng)目(如 Console App, ASP.NET Core 等)中,通過以下方式安裝:

        1. **Visual Studio**:右鍵點(diǎn)擊項(xiàng)目 -> “管理 NuGet 程序包” -> 搜索 “`MySql.Data`” -> 安裝。

        2. **.NET CLI**:在終端中運(yùn)行以下命令:

        ```bash

        dotnet add package MySql.Data

        ```

        二、 基礎(chǔ)連接代碼(ADO.NET 方式)

        這是最直接、最可控的方式,類似于連接 SQL Server 的方式。

        #1. 引入必要的命名空間

        ```csharp

        using MySql.Data.MySqlClient; // 核心命名空間

        using System.Data; // 可選,用于 DataTable 等類

        ```

        #2. 構(gòu)建連接字符串(Connection String)

        連接字符串包含連接到數(shù)據(jù)庫所需的所有信息。以下是關(guān)鍵參數(shù):

        | 參數(shù) | 描述 | 示例 |

        | :--- | :--- | :--- |

        | `Server` | MySQL 服務(wù)器地址 | `localhost`, `127.0.0.1`, `example.com` |

        | `Port` | 端口號(hào)(可選,默認(rèn) 3306) | `3306` |

        | `Database` | 要連接的數(shù)據(jù)庫名稱 | `mydatabase` |

        | `Uid` | 用戶名 | `root` |

        | `Pwd` | 密碼 | `your_password` |

        | `Charset` | 字符集(**強(qiáng)烈建議設(shè)置**) | `utf8mb4` (支持表情符號(hào)) |

        **示例連接字符串:**

        ```csharp

        string connectionString = "Server=localhost;Port=3306;Database=mydatabase;Uid=root;Pwd=myPassword;Charset=utf8mb4;";

        ```

        **重要提示:** 永遠(yuǎn)不要將連接字符串硬編碼在代碼中!應(yīng)將其存儲(chǔ)在配置文件中,如 `appsettings.json` (ASP.NET Core) 或 `App.config`/`Web.config` (傳統(tǒng) .NET Framework)。

        #3. 完整的連接與查詢示例

        以下是一個(gè)控制臺(tái)應(yīng)用程序的完整示例,演示了如何建立連接、執(zhí)行查詢并讀取數(shù)據(jù)。

        ```csharp

        using System;

        using MySql.Data.MySqlClient;

        namespace MySqlConnectionExample

        {

        class Program

        {

        static void Main(string[] args)

        {

        // 1. 定義連接字符串

        string connectionString = "server=localhost;user=root;password=123456;database=testdb;charset=utf8mb4;";

        // 2. 創(chuàng)建 MySqlConnection 對(duì)象

        using (MySqlConnection connection = new MySqlConnection(connectionString))

        {

        try

        {

        // 3. 打開數(shù)據(jù)庫連接

        connection.Open();

        Console.WriteLine("Connection opened successfully.");

        // 4. 編寫 SQL 查詢

        string sql = "SELECT id, name, email FROM users WHERE id > @id"; // 使用參數(shù)化查詢防止SQL注入

        // 5. 創(chuàng)建 Command 對(duì)象

        using (MySqlCommand command = new MySqlCommand(sql, connection))

        {

        // 6. 添加參數(shù)

        command.Parameters.AddWithValue("@id", 0);

        // 7. 執(zhí)行查詢,獲取 MySqlDataReader

        using (MySqlDataReader reader = command.ExecuteReader())

        {

        // 8. 檢查是否有數(shù)據(jù)返回

        if (reader.HasRows)

        {

        // 9. 循環(huán)讀取每一行數(shù)據(jù)

        while (reader.Read())

        {

        // 10. 通過列名或索引獲取數(shù)據(jù)

        int id = reader.GetInt32("id");

        string name = reader.GetString("name");

        string email = reader.IsDBNull(reader.GetOrdinal("email")) ? null : reader.GetString("email"); // 安全處理NULL值

        Console.WriteLine($"ID: {id}, Name: {name}, Email: {email}");

        }

        }

        else

        {

        Console.WriteLine("No records found.");

        }

        // 11. Reader 會(huì)在 using 塊結(jié)束時(shí)自動(dòng)關(guān)閉

        }

        }

        }

        catch (MySqlException ex)

        {

        // 處理 MySQL 特定的異常

        Console.WriteLine($"MySQL Error {ex.Number}: {ex.Message}");

        }

        catch (Exception ex)

        {

        // 處理其他異常

        Console.WriteLine($"General error: {ex.Message}");

        }

        // 12. Connection 會(huì)在 using 塊結(jié)束時(shí)自動(dòng)關(guān)閉和釋放

        }

        Console.ReadLine();

        }

        }

        }

        ```

        三、 在 ASP.NET Core 中的最佳實(shí)踐

        在現(xiàn)代 ASP.NET Core 應(yīng)用程序中,我們使用依賴注入 (Dependency Injection) 來管理數(shù)據(jù)庫連接,這是更優(yōu)雅和高效的方式。

        #1. 在 `appsettings.json` 中配置連接字符串

        ```json

        {

        "ConnectionStrings": {

        "DefaultConnection": "server=localhost;port=3306;database=myappdb;user=myappuser;password=MyStrongPassword!;charset=utf8mb4;"

        },

        // ... other settings

        }

        ```

        #2. 在 `Program.cs` 中注冊(cè) MySQL 服務(wù)

        ```csharp

        using MySql.Data.MySqlClient;

        using System.Data;

        var builder = WebApplication.CreateBuilder(args);

        // 添加服務(wù)到容器

        builder.Services.AddControllers();

        // 注冊(cè) MySqlConnection,將其作為瞬態(tài)(Transient)服務(wù)

        // 每次請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的連接實(shí)例,ADO.NET 的連接池會(huì)管理底層連接的效率

        builder.Services.AddTransient<IDbConnection>((sp) =>

        {

        var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");

        return new MySqlConnection(connectionString);

        });

        var app = builder.Build();

        // ... 后續(xù)中間件配置

        ```

        #3. 在控制器 (Controller) 或服務(wù)層中使用

        ```csharp

        [ApiController]

        [Route("api/[controller]")]

        public class UsersController : ControllerBase

        {

        private readonly IDbConnection _db;

        // 通過構(gòu)造函數(shù)注入 IDbConnection

        public UsersController(IDbConnection db)

        {

        _db = db;

        }

        [HttpGet]

        public async Task<IActionResult> GetUsers()

        {

        var users = new List<User>();

        // 使用 Dapper 簡化數(shù)據(jù)操作(推薦)

        // users = await _db.QueryAsync<User>("SELECT * FROM Users");

        // 或者使用原生 ADO.NET

        await _db.OpenAsync();

        using (var command = new MySqlCommand("SELECT * FROM Users", (MySqlConnection)_db))

        {

        using (var reader = await command.ExecuteReaderAsync())

        {

        while (await reader.ReadAsync())

        {

        users.Add(new User

        {

        Id = reader.GetInt32("Id"),

        Name = reader.GetString("Name")

        });

        }

        }

        }

        return Ok(users);

        }

        }

        ```

        四、 關(guān)鍵注意事項(xiàng)與最佳實(shí)踐

        1. **連接池 (Connection Pooling)**:

        * `MySql.Data` 默認(rèn)啟用了連接池。這意味著當(dāng)你創(chuàng)建和關(guān)閉 `MySqlConnection` 對(duì)象時(shí),底層物理連接并不會(huì)立即關(guān)閉,而是被放入池中備用,從而大幅提升性能。

        * **務(wù)必使用 `using` 語句**或在 ASP.NET Core 中通過依賴注入來管理連接,以確保連接總是被正確關(guān)閉并返回到池中。避免手動(dòng)調(diào)用 `.Open()` 而不調(diào)用 `.Close()`。

        2. **參數(shù)化查詢**:

        * **永遠(yuǎn)不要**使用字符串拼接來構(gòu)造 SQL 查詢語句,這會(huì)導(dǎo)致嚴(yán)重的 **SQL 注入漏洞**。

        * **始終**像示例中那樣使用 `MySqlParameter` 或 `Parameters.AddWithValue()`。

        3. **異步編程**:

        * 對(duì)于 Web 應(yīng)用程序,使用異步方法(`OpenAsync()`, `ExecuteReaderAsync()`, `ReadAsync()`)可以避免阻塞線程,提高應(yīng)用程序的并發(fā)能力和可擴(kuò)展性。

        4. **錯(cuò)誤處理**:

        * 使用 `try-catch` 塊來捕獲 `MySqlException`,它可以提供具體的錯(cuò)誤編號(hào)(`ex.Number`),便于排查身份驗(yàn)證、服務(wù)器連接等特定問題。

        5. **使用 ORM(對(duì)象關(guān)系映射器)**:

        * 對(duì)于復(fù)雜的應(yīng)用程序,考慮使用像 **Dapper**(輕量、高性能)或 **Entity Framework Core**(功能全面、官方支持)這樣的 ORM。它們可以簡化數(shù)據(jù)訪問代碼。

        * EF Core 同樣可以通過 `Pomelo.EntityFrameworkCore.MySql` 提供程序來支持 MySQL。

        總結(jié)

        在 C# 中連接 MySQL 的步驟可以概括為:

        1. **安裝** `MySql.Data` NuGet 包。

        2. **配置**安全的連接字符串(存儲(chǔ)在配置文件中)。

        3. **使用 `using` 語句**創(chuàng)建和銷毀 `MySqlConnection` 對(duì)象以利用連接池。

        4. **使用 `MySqlCommand` 和 `MySqlParameter`** 執(zhí)行參數(shù)化查詢。

        5. **在 ASP.NET Core 中**,通過依賴注入在 `Program.cs` 中注冊(cè) `IDbConnection`,并在控制器中獲取使用。

        遵循這些步驟和最佳實(shí)踐,您就可以在 C# 應(yīng)用程序中高效、安全地與 MySQL 數(shù)據(jù)庫進(jìn)行交互。

        另外搭配便捷的MYSQL備份工具,可定時(shí)備份、異地備份,MYSQL導(dǎo)出導(dǎo)入?杀镜剡B接LINUX里的MYSQL,簡單便捷。可以大大地提高工作效率喔。


      你的MySQL數(shù)據(jù)庫為什么總是又慢又卡?掌握這五大優(yōu)化法則,查詢速度快十倍!(上篇)
      你的MySQL數(shù)據(jù)庫為什么總是又慢又卡?掌握這五大優(yōu)化法則,查詢速度快十倍!(下篇)
      https://baijiahao.baidu.com/s?id=1844039166149636850
      從語法到實(shí)戰(zhàn):一文掌握MySQL表結(jié)構(gòu)擴(kuò)展的正確方法
      避開安全陷阱:MySQL登錄的正確姿勢(shì)與.my.cnf配置文件的秘密
      從入門到精通:C 與MySQL交互的完整代碼示例與常見錯(cuò)誤解決方案
      MySQL基礎(chǔ)入門:CREATE DATABASE命令詳解與字符集選擇指南
      一鍵操作背后的隱患:如何安全高效地修改MySQL表名及其依賴項(xiàng)?
      Linux系統(tǒng)常用FTP服務(wù)端
      FileZilla綠色版和安裝版有什么區(qū)別?
      国产成人精品亚洲日本在线_欧美精品v国产精品v_亚洲欧洲日韩国产一区二区三区_亚洲乱码一二三四区

      <address id="tjdjd"></address>
      <address id="tjdjd"></address>

        <address id="tjdjd"><nobr id="tjdjd"><progress id="tjdjd"></progress></nobr></address>

          <form id="tjdjd"><listing id="tjdjd"><meter id="tjdjd"></meter></listing></form>
          <address id="tjdjd"></address><address id="tjdjd"></address>
          中文字幕高清一区| 亚洲国产一区二区三区| 国产精品不卡视频| 极品少妇一区二区三区精品视频| 96av麻豆蜜桃一区二区| 中文在线免费一区三区高中清不卡| 色一区在线观看| 韩国一区二区视频| 国产成人在线视频网址| 91麻豆成人久久精品二区三区| 成人免费看视频| 欧美在线观看一区二区| 91精品久久久久久久99蜜桃| 国产自产视频一区二区三区| 精品国产91亚洲一区二区三区婷婷| 日韩vs国产vs欧美| 亚洲色图视频网| 欧洲中文字幕精品| 欧美videossexotv100| 欧美精品久久久久久久多人混战| 中文字幕欧美日韩一区| 欧美在线观看视频一区二区三区| 日韩你懂的在线播放| 国产美女精品一区二区三区| 亚洲成人在线免费| 一级做a爱片久久| 日韩亚洲欧美一区| 自拍偷拍亚洲综合| 99re这里只有精品6| 99久久精品免费看国产免费软件| 日韩一级在线观看| 日本一区二区免费在线观看视频| 91福利在线导航| 久久电影网电视剧免费观看| 国产精品88av| 国产日韩欧美精品综合| 视频一区二区中文字幕| 欧美伦理视频网站| 亚洲三级电影网站| 国产精品综合久久| 日韩精品视频网| www.日韩大片| 91精品国产色综合久久| 亚洲女子a中天字幕| 午夜视频一区二区| 欧美男同性恋视频网站| 美女一区二区视频| 欧洲视频一区二区| 精品久久久久久无| 制服.丝袜.亚洲.中文.综合| 91精品国产91久久久久久一区二区| 久久蜜桃香蕉精品一区二区三区| 亚洲国产电影在线观看| 男人的j进女人的j一区| 色综合一区二区三区| 欧美日韩高清影院| 一区二区三区四区乱视频| 国产精品久久午夜| 一区二区三区中文在线| 国产欧美日韩在线观看| 欧美日韩国产乱码电影| 在线电影院国产精品| 免费成人av资源网| 一区二区激情小说| 日韩国产欧美三级| 91国产免费观看| 精品一区二区三区视频在线观看| 亚洲高清免费一级二级三级| 午夜欧美大尺度福利影院在线看| 久久综合久久久久88| 2022国产精品视频| 免费在线一区观看| 五月天丁香久久| 久久精品亚洲乱码伦伦中文| 国产欧美精品一区二区三区四区| 亚洲综合999| 色婷婷精品大视频在线蜜桃视频| 91啦中文在线观看| 精品福利一区二区三区| 成人少妇影院yyyy| 色综合天天综合| 久久久国际精品| 国产精品资源网| 日韩三级视频中文字幕| 国产欧美精品在线观看| 中文字幕一区二| 国产+成+人+亚洲欧洲自线| 亚洲一区二三区| 色婷婷久久一区二区三区麻豆| 亚洲少妇屁股交4| 一本一本大道香蕉久在线精品| 精品国产一区二区三区不卡| 国产精品视频看| 国产黄色精品网站| 成人va在线观看| 亚洲综合一区二区精品导航| 国产调教视频一区| 亚洲一区二区三区四区五区中文| 91蝌蚪porny| 国产一区二区福利视频| 一区二区三区成人| 日韩和欧美一区二区| 精品理论电影在线观看| www.亚洲色图.com| 亚洲国产精品精华液2区45| 99久久免费精品| 欧美日韩国产天堂| 91在线视频观看| 亚洲欧美乱综合| 日本人妖一区二区| 日韩va欧美va亚洲va久久| 91久久久免费一区二区| 欧美高清在线一区| 欧美一区二区福利视频| 亚洲欧洲av色图| 亚洲视频香蕉人妖| 欧美另类videos死尸| jvid福利写真一区二区三区| 欧美成人一区二区三区片免费| 国产精品视频麻豆| 久久综合久色欧美综合狠狠| 欧美三区在线观看| 麻豆精品一区二区三区| 18涩涩午夜精品.www| 成人av一区二区三区| 欧美日韩国产影片| 欧美一区二区二区| 91女厕偷拍女厕偷拍高清| 国产suv精品一区二区三区| 偷拍亚洲欧洲综合| 日韩电影免费在线看| 国产精品一级二级三级| 日韩黄色免费电影| 国产精品婷婷午夜在线观看| 日本久久一区二区三区| 成人午夜在线播放| 欧美精品欧美精品系列| 久久人人97超碰com| 国产suv精品一区二区6| 亚洲国产精品av| 国内精品久久久久影院色| 国产成a人亚洲| 一区二区高清免费观看影视大全| 国产精品毛片大码女人| 国产中文字幕精品| 亚洲欧美一区二区不卡| 国产日韩欧美高清| 久久品道一品道久久精品| 欧美一级欧美一级在线播放| 在线区一区二视频| 欧美成人女星排名| 亚洲精品一区二区精华| 日本人妖一区二区| 欧美日韩国产综合一区二区| 欧美精品色一区二区三区| 久久97超碰色| 国产精品麻豆一区二区| 免费精品视频最新在线| 精品无人码麻豆乱码1区2区| 午夜天堂影视香蕉久久| 激情综合五月婷婷| 国产毛片精品国产一区二区三区| 激情综合一区二区三区| 中文字幕一区二区三区色视频| 亚洲高清免费观看高清完整版在线观看| 国产一区二区三区香蕉| 成人开心网精品视频| 在线观看日产精品| 国产精品传媒视频| 国产精品99久久久久| 91在线视频在线| 欧美国产欧美亚州国产日韩mv天天看完整| 久久精品国产精品青草| 国产黄色精品视频| 亚洲精品一线二线三线| 福利电影一区二区三区| av一本久道久久综合久久鬼色| 麻豆精品一区二区av白丝在线| 久久99精品久久久久久动态图| 欧美日韩国产小视频在线观看| 久久久久久久综合日本| 最好看的中文字幕久久| 亚洲精品自拍动漫在线| 国产精品私房写真福利视频| 色综合久久天天综合网| 日韩欧美亚洲国产另类| 毛片基地黄久久久久久天堂| 一区二区三区在线播放| 精品国产伦一区二区三区观看方式| 91丨国产丨九色丨pron| 国产欧美日韩麻豆91| 国产精品亚洲一区二区三区在线| 国产精品伦理在线| 91美女片黄在线观看91美女| 国产欧美日韩在线视频| 久久精品人人做人人爽97| 国产精品久久毛片| 一区二区三区欧美| 亚洲美女免费在线| 天堂午夜影视日韩欧美一区二区|