做完一支用 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 憑證的下載連結
你會拿到這六項,對應到待會的連線字串:
| 欄位 | 從哪裡來 | 連線字串參數 | 備註 |
|---|---|---|---|
| Host | Connect 對話框 | Server= | 依你選的 region 不同 |
| Database | 下一節自己建 | Database= | 先別用預設的 test |
| User | Connect 對話框 | Uid= | 格式是 前綴.root,例如 3pTAoNNegb47Uc8.root |
| Password | Generate Password | Pwd= | 只顯示一次 |
三、先建好資料庫和資料表
連線字串裡的 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"]}");
}
}
}五、建表完成,跑一次驗證
寫個進入點,把「建表 → 新增一筆 → 讀回來」跑一遍:
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忘了加或加錯位置; 打成 3306(TiDB 是 )
六、正式做法:密碼別寫死
範例為了看得清楚,把連線字串直接寫在程式裡。實際專案不會這樣——密碼一旦 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");