在資料庫開發中,儲存程序是封裝業務邏輯、提升效能與安全性的重要手段。本文將透過一個完整的使用者註冊案例,示範如何在 MySQL 中建立帶有輸出參數的儲存程序,並使用 C# (ADO.NET) 正確呼叫它、取回新增記錄的自增 ID。
首先在 MySQL 中建立儲存程序 yuan_user_cc,接收使用者名稱、信箱、密碼三個輸入參數,並透過 OUT 參數回傳新增記錄的 ID:
CREATE PROCEDURE `yuan_user_cc`(
IN xname VARCHAR(100),
IN xemail VARCHAR(100),
IN xpassWord VARCHAR(100),
OUT xid INT
)
BEGIN
INSERT INTO yuan_user (name, email, password) VALUES (xname, xemail, xpassWord);
SELECT id INTO xid FROM yuan_user WHERE name = xname;
END
重點提示: MySQL 的儲存程序參數預設以 ? 作為前綴(如 ?xname),這在 C# 端建立參數時必須對應。
以下方法示範標準的 ADO.NET 呼叫流程:建立連線、設定 CommandType.StoredProcedure、依序加入輸入與輸出參數、執行 Fill 並讀取輸出參數值。
private string shuju_lianjie(string name, string email, string passWord)
{
Int16 id = 0;
MySqlConnection conn = null;
MySqlDataAdapter adapter = new MySqlDataAdapter();
DataSet ds = new DataSet();
try
{
// 1. 建立連線字串(請依實際環境調整)
conn = new MySqlConnection(
"server=localhost; user id=root; password=123; database=yuan_test; pooling=false; charset=utf8mb4");
// 2. 設定命令為儲存程序
adapter.SelectCommand = new MySqlCommand("yuan_user_cc", conn);
adapter.SelectCommand.CommandType = CommandType.StoredProcedure;
// 3. 加入輸入參數
adapter.SelectCommand.Parameters.Add(new MySqlParameter("?xname", MySqlDbType.VarChar, 100) { Value = name });
adapter.SelectCommand.Parameters.Add(new MySqlParameter("?xemail", MySqlDbType.VarChar, 100) { Value = email });
adapter.SelectCommand.Parameters.Add(new MySqlParameter("?xpassWord", MySqlDbType.VarChar, 100) { Value = passWord });
// 4. 加入輸出參數(方向設為 Output)
var outParam = new MySqlParameter("?xid", MySqlDbType.Int16) { Direction = ParameterDirection.Output };
adapter.SelectCommand.Parameters.Add(outParam);
// 5. 執行並取回結果
adapter.Fill(ds, "yuan_user_cc");
id = Convert.ToInt16(outParam.Value);
return id.ToString();
}
catch (MySqlException ex)
{
MessageBox.Show($"資料庫錯誤:{ex.Message}");
return string.Empty;
}
finally
{
conn?.Close();
conn?.Dispose();
}
}
? 開頭,C# 建立 MySqlParameter 時名稱需一致。Direction = ParameterDirection.Output,否則無法取回值。try/finally 或 using 確保連線正確關閉。utf8mb4 而非舊版 gb2312,避免中文亂碼。實務上可進一步優化:
appsettings.json / web.config)。ExecuteNonQuery 取代 Fill,若不需要回傳 DataSet 可減少記憶體佔用。掌握儲存程序與 C# 的互動模式,能有效提升資料庫操作的封裝性與效能,是後端開發者的核心技能之一。