萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

ASP.NET C# / Java 呼叫 MySQL 存儲過程完整範例:參數綁定、連線池與異常處理

測試存儲過程

CREATE PROCEDURE deletedb(IN m_orgid CHAR(12))
BEGIN
    DELETE FROM hardwareinfo WHERE orgid = m_orgid;
    DELETE FROM addressinfo WHERE orgid = m_orgid;
END

C# (MySql.Data / MySqlConnector)

using MySql.Data.MySqlClient;
using System.Configuration;

public void DeleteProcedure(string orgId)
{
    string connStr = ConfigurationManager.ConnectionStrings["MySqlConnection"].ConnectionString;
    
    using (var conn = new MySqlConnection(connStr))
    using (var cmd = new MySqlCommand("deletedb", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        
        // 參數名稱需與過程定義一致,前綴 ? 或 @ 皆可
        var param = new MySqlParameter("?m_orgid", MySqlDbType.String) { Value = orgId };
        cmd.Parameters.Add(param);
        
        try
        {
            conn.Open();
            cmd.ExecuteNonQuery();
        }
        catch (MySqlException ex)
        {
            // 記錄日誌、拋出自定義例外
            throw new ApplicationException("刪除存儲過程執行失敗", ex);
        }
    } // using 確保連線釋放回池
}

Java (JDBC + HikariCP 連線池)

import com.zaxxer.hikari.HikariDataSource;
import java.sql.*;

public class MySqlStoredProcDemo {
    private static final HikariDataSource ds = new HikariDataSource();
    
    static {
        ds.setJdbcUrl("jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC");
        ds.setUsername("root");
        ds.setPassword("password");
        ds.setMaximumPoolSize(20);
    }
    
    public void callDeleteDb(String orgId) {
        String sql = "{CALL deletedb(?)}"; // JDBC escape 語法
        try (Connection conn = ds.getConnection();
             CallableStatement cs = conn.prepareCall(sql)) {
            
            cs.setString(1, orgId);
            cs.executeUpdate();
        } catch (SQLException e) {
            throw new RuntimeException("存儲過程執行失敗", e);
        }
    }
}

關鍵差異對照

項目C# (MySql.Data)Java (JDBC)
呼叫語法CommandType.StoredProcedure{CALL proc(?)}
參數標記?name 或 @name? (位置) 或 :name (NamedParameterJdbcTemplate)
連線管理using / IDisposabletry-with-resources / HikariCP
異常類型MySqlExceptionSQLException

最佳實務

  • 生產環境必須使用連線池(C# 預設啟用 Pooling=true,Java 用 HikariCP)。
  • 參數化查詢防注入,絕不拼接字串。
  • 存儲過程命名規範:sp_<業務>_<動作>(如 sp_user_delete)。
  • 輸出參數(OUT)需註冊:
    C#: param.Direction = ParameterDirection.Output
    Java: cs.registerOutParameter(1, Types.INTEGER)。
  • 事務控制:業務邊界在應用層管理(TransactionScope / @Transactional),存儲過程內避免顯式 COMMIT/ROLLBACK。
copyright © 萬盛學電腦網 all rights reserved