測試存儲過程
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 / IDisposable | try-with-resources / HikariCP |
| 異常類型 | MySqlException | SQLException |
最佳實務
- 生產環境必須使用連線池(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。