回文章列表
C#13 分鐘閱讀2026年7月18日

C# 資料上雲端:申請 TiDB Cloud、用 .NET 連上並建好第一張表

#C##.NET#TiDB Cloud#MySQL#資料庫

文章目錄

做完一支用 SQLite 的庫存系統,很多同學下一個問題是:「總店一台、分店兩台,能不能一起用同一份資料?」

答案是不能——SQLite 的 inventory.db 是一個檔案,躺在你這台電腦上,換台電腦就看不到。要讓多台共用同一份資料,得把資料庫搬上雲端。這篇用免費的 TiDB Cloud(相容 MySQL 寫法)走完整條路:申請 → 用 C#/.NET 連上 → 建好第一張表並塞一筆測試資料。跟著做完,你的 C# 程式就從單機變成多台可連的雲端服務。

為什麼選 TiDB Cloud?三個原因:它相容 MySQL 語法(SQL 幾乎不用改)、有免費方案(練習不用花錢也不用綁卡)、.NET 用官方的 MySql.Data 套件就能接。


一、申請一個免費的 TiDB Cloud 資料庫

步驟 1:註冊帳號

打開瀏覽器到 tidbcloud.com,點 Start for Free。

登入方式可以用 Email,也可以直接用 Google / GitHub / Microsoft 帳號快速登入,免另外設密碼。第一次登入後就會進到主控台(Console),新帳號通常會自動幫你開一個預設的免費執行個體。

提醒:TiDB 現在的免費方案叫 TiDB Cloud Starter(2025 年 8 月從舊名「TiDB Serverless」改過來的)。如果你看到別的教學寫 Serverless,指的是同一個東西。

步驟 2:建立免費執行個體

如果要自己建一個(或想換個名字好辨認):

1. 主控台點 Create Resource 2. 方案層級要主動選 TiDB Cloud Starter(免費層,不會自動幫你選,別按到付費的) 3. 選雲端供應商與 Region:挑離自己近的(例如亞洲),連線比較快。想用網頁版 SQL Editor 建表的話,這裡選 AWS(下一節會用到) 4. 取個名字,例如 inventory-cloud 5. 點 Create,大約 30 秒就部署完成

免費層前 5 個執行個體都不用綁信用卡,第 6 個以上才需要。練習一個就夠了。

免費額度看清楚(一個常見誤解)

項目免費額度會不會每月重置
免費執行個體每組織 5 個—
Row-based 儲存空間5 GiB❌ 固定容量上限
Columnar 儲存空間5 GiB❌ 固定容量上限
Request Units(RU)每月 5,000 萬次✅ 每月重置

這裡最容易搞錯的是儲存空間不是「每月配額」,而是固定容量上限——用滿 5 GiB 要自己刪資料或升級,它不會月初自動清空還你。真正每月重置的是 RU(請求次數)。練習用量兩者都碰不到。


二、拿到連線需要的資訊

執行個體變成 Active 之後,點進去,在右上角點 Connect,會跳出一個對話框——接下來 C# 要用的連線資訊都在這裡。

  • 連線方式(Connect With)選 General,適合 .NET / MySQL 用戶端
  • 密碼欄位第一次要點 Generate Password 才看得到明碼,它只完整顯示一次,立刻複製存好,錯過要重按 Reset Password
  • 如果之後連線要更嚴格的驗證,這裡也有 CA 憑證的下載連結

你會拿到這六項,對應到待會的連線字串:

欄位從哪裡來連線字串參數備註
HostConnect 對話框Server=依你選的 region 不同
Database下一節自己建Database=先別用預設的 test
UserConnect 對話框Uid=格式是 前綴.root,例如 3pTAoNNegb47Uc8.root
PasswordGenerate PasswordPwd=只顯示一次
Port固定Port=TiDB 是 4000,不是 MySQL 常見的 3306
SSL固定要加SslMode=TiDB Cloud 強制加密連線
⚠ 密碼安全:這組密碼別寫死進程式碼、別 push 到 GitHub。雲端資料庫的密碼外流,等於任何人都能碰你的資料,比本機資料庫更要小心。文章最後會示範放進 appsettings.json 的正式做法。

三、先建好資料庫和資料表

連線字串裡的 Database= 要填一個真的存在的資料庫,所以得先建。最簡單的方式是用 TiDB Cloud 的網頁 SQL Editor(就是剛才建執行個體時選 AWS region 的原因;SQL Editor 目前限 AWS 地區的 Starter 使用)。

在 SQL Editor 執行:

CREATE DATABASE MyInventory;

資料表這篇交給 C# 程式建(下一節的 InitDb),你也可以現在就在 SQL Editor 一起建好。TiDB 的建表語法跟 MySQL 幾乎一樣,AUTO_INCREMENT 可以直接用:

USE MyInventory;

CREATE TABLE IF NOT EXISTS Products (
    Id       INT NOT NULL AUTO_INCREMENT,
    Name     VARCHAR(100),
    Category VARCHAR(50),
    Quantity INT,
    Price    DECIMAL(10, 2),
    PRIMARY KEY (Id)
);

四、用 C#/.NET 連上雲端

裝套件

官方 C# 教學建議用 Oracle 的 MySql.Data 套件。在專案資料夾執行:

dotnet add package MySql.Data

寫一個 MySqlDbHelper

把資料庫操作都關進一個 Helper 類別,連線字串填你剛才拿到的那六項。密碼先用 placeholder,正式做法看最後一節。

using MySql.Data.MySqlClient;

public static class MySqlDbHelper
{
    // ⚠ placeholder:換成你自己的 TiDB Cloud 連線資訊,別寫死真密碼
    // 欄位順序:Server → Database → Uid → Pwd → Port → SslMode
    private static readonly string connStr =
        "Server=gateway01.xxxx.prod.aws.tidbcloud.com;" +
        "Database=MyInventory;" +
        "Uid=xxxxxxxx.root;" +
        "Pwd=你的密碼;" +
        "Port=4000;" +
        "SslMode=Required;";

    // 建表:跟 SQLite 版的差別只有連線類別換成 MySql
    public static void InitDb()
    {
        using var conn = new MySqlConnection(connStr);
        conn.Open();
        string sql = @"CREATE TABLE IF NOT EXISTS Products (
            Id       INT NOT NULL AUTO_INCREMENT,
            Name     VARCHAR(100),
            Category VARCHAR(50),
            Quantity INT,
            Price    DECIMAL(10, 2),
            PRIMARY KEY (Id)
        )";
        using var cmd = new MySqlCommand(sql, conn);
        cmd.ExecuteNonQuery();
    }

    // 新增一筆(參數化,避免 SQL injection)
    public static void InsertProduct(string name, string category, int quantity, decimal price)
    {
        using var conn = new MySqlConnection(connStr);
        conn.Open();
        string sql = @"INSERT INTO Products (Name, Category, Quantity, Price)
                       VALUES (@Name, @Category, @Quantity, @Price)";
        using var cmd = new MySqlCommand(sql, conn);
        cmd.Parameters.AddWithValue("@Name", name);
        cmd.Parameters.AddWithValue("@Category", category);
        cmd.Parameters.AddWithValue("@Quantity", quantity);
        cmd.Parameters.AddWithValue("@Price", price);
        cmd.ExecuteNonQuery();
    }

    // 讀回全部,印到 Console
    public static void PrintAllProducts()
    {
        using var conn = new MySqlConnection(connStr);
        conn.Open();
        string sql = "SELECT Id, Name, Category, Quantity, Price FROM Products";
        using var cmd = new MySqlCommand(sql, conn);
        using var reader = cmd.ExecuteReader();
        while (reader.Read())
        {
            Console.WriteLine(
                $"{reader["Id"]}\t{reader["Name"]}\t{reader["Category"]}\t" +
                $"{reader["Quantity"]}\t{reader["Price"]}");
        }
    }
}

關於 SslMode 要設什麼

TiDB Cloud 強制用 TLS/SSL 加密連線,連線字串沒設好會直接連不上——這是新手最常卡的地方。官方的 C# 範例只示範了本機版本,沒有給 TiDB Cloud 專用的連線字串,所以 SslMode 該填什麼並不是官方逐字寫死的建議值。基於「強制 TLS」這個要求,合理的設法是:

  • SslMode=Required:要求加密連線,多數情況這樣就能連上(本文範例用這個)
  • SslMode=VerifyFull:更嚴格,連伺服器身分也驗證,需要另外指定從 Connect 對話框下載的 CA 憑證路徑(SslCa=ca-cert.pem)

入門先用 Required 連通,之後要更安全再升級到 VerifyFull。


五、建表完成,跑一次驗證

寫個進入點,把「建表 → 新增一筆 → 讀回來」跑一遍:

MySqlDbHelper.InitDb();
Console.WriteLine("建表完成");

MySqlDbHelper.InsertProduct("雲端測試商品", "測試分類", 10, 99.5m);
Console.WriteLine("已新增一筆");

Console.WriteLine("目前資料:");
MySqlDbHelper.PrintAllProducts();

看到「建表完成」、接著印出剛新增的那筆商品,就代表連線字串、SSL、Port 全都對了,資料真的寫進雲端了。這時候你到 TiDB Cloud 的 SQL Editor 下 SELECT * FROM Products;,也會看到同一筆——這就是「上雲端」的意思:資料只有一份,放在雲端,哪台電腦連上都看得到。

如果卡在連不上,先照這個順序查:

  • 連不上:SslMode 忘了加或加錯位置;Port 打成 3306(TiDB 是 4000)
  • 認證失敗:密碼複製時漏字或多了空白;User 忘了加 .root 前綴
  • 連得上但很慢/常逾時:建執行個體時 region 選太遠,重建時挑近一點的

六、正式做法:密碼別寫死

範例為了看得清楚,把連線字串直接寫在程式裡。實際專案不會這樣——密碼一旦 commit 進 Git 就有外流風險。.NET 目前主流做法是放進 appsettings.json:

{
  "ConnectionStrings": {
    "TiDB": "Server=gateway01.xxxx.prod.aws.tidbcloud.com;Database=MyInventory;Uid=xxxxxxxx.root;Pwd=你的密碼;Port=4000;SslMode=Required;"
  }
}

程式改成從設定檔讀:

using Microsoft.Extensions.Configuration;

var config = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json", optional: false)
    .Build();

string connStr = config.GetConnectionString("TiDB");

要裝 Microsoft.Extensions.Configuration 與 Microsoft.Extensions.Configuration.Json 兩個套件,並記得在 Visual Studio 把 appsettings.json 的「複製到輸出目錄」設成「如果較新則複製」,不然編譯後程式讀不到檔案。最重要的一步:把 appsettings.json 加進 .gitignore,含真密碼的設定檔不要 commit 上去。


搬上雲端之後,你會發現 CRUD 邏輯幾乎一字不差,改的只是連線類別(SqliteConnection → MySqlConnection)和連線字串——這就是把資料庫操作關進 Helper、做好分層的回報。想把整套「WinForms 桌面程式 + 資料庫 + 登入」完整走一遍,可以接著看 C# .NET 實戰:桌面程式與資料庫開發 這門課,裡面從 SQLite 一路帶到雲端與門市登入系統。

相關課程

C# 資料庫與整合專案

學習 SQLite 資料庫入門、CRUD 與條件查詢,經過鞏固週後投入整合專案:從架構與資料層設計、CRUD/搜尋/庫存警示,到統計圖表呈現,最終將資料搬上雲端、實作門市登入系統,並以 MVP/Repository 架構重構收尾,完成一個可展示的桌面庫存整合專案。

查看課程內容