首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 儲存程序與 C# 呼叫完整實戰範例

     編輯:MySQL 資料庫相關知識

前言

在資料庫開發中,儲存程序是封裝業務邏輯、提升效能與安全性的重要手段。本文將透過一個完整的使用者註冊案例,示範如何在 MySQL 中建立帶有輸出參數的儲存程序,並使用 C# (ADO.NET) 正確呼叫它、取回新增記錄的自增 ID。

一、MySQL 儲存程序定義

首先在 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# 端建立參數時必須對應。

二、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();
    }
}

三、關鍵細節總結

  • 參數前綴: MySQL 參數必須以 ? 開頭,C# 建立 MySqlParameter 時名稱需一致。
  • 輸出參數方向: 必須明確設定 Direction = ParameterDirection.Output,否則無法取回值。
  • 資源釋放: 建議使用 try/finally 或 using 確保連線正確關閉。
  • 字元集: 現代專案建議使用 utf8mb4 而非舊版 gb2312,避免中文亂碼。

四、進階建議

實務上可進一步優化:

  1. 將連線字串移至設定檔(appsettings.json / web.config)。
  2. 使用 ExecuteNonQuery 取代 Fill,若不需要回傳 DataSet 可減少記憶體佔用。
  3. 針對密碼欄位務必採用雜湊(BCrypt / Argon2)而非明文儲存。
  4. 考慮導入 Dapper 或 Entity Framework Core 簡化資料存取層。

掌握儲存程序與 C# 的互動模式,能有效提升資料庫操作的封裝性與效能,是後端開發者的核心技能之一。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved