Access 作為優秀的 Client/Server 前端開發工具,面對大量數據處理(如 60 萬用戶電費計算)時,前端計算耗時數小時嚴重阻塞業務。解決之道是將計算下推至後端資料庫(SQL Server/Oracle),Access 僅負責觸發與交互。本文詳解三種呼叫後端存儲過程的模式,並給出 Pass-Through 查詢完整構建步驟。
適用場景:數據量極大、實時性要求低、固定時間窗口執行(如每晚電費批量計算)。
Task(任務),由 Task Manager 排程執行對應存儲過程。Job(作業),由 DBMS_JOB / DBMS_SCHEDULER 調度。job_list 插入一條記錄(任務類型、參數、狀態),後端輪詢執行。優勢:前端即時響應,後端錯峰執行,共享同一計算邏輯,避免前端重複開發。
適用場景:單筆業務變更需即時重算(如修改電表讀數 → 即時重算該用戶電費)。
MeterReading)建立 AFTER UPDATE 觸發器,調用計算存儲過程。優勢:零代碼侵入前端邏輯,批量與單筆複用同一存儲過程,前端響應毫秒級。
適用場景:需顯式控制執行時機、傳遞複雜參數、獲取返回值/結果集的業務邏輯。
| 屬性 | 設置值示例 | 說明 |
|---|---|---|
| ODBC 連接字符串 | ODBC;DSN=MyServerDSN;UID=sa;PWD=****;DATABASE=BizDB | 或點「生成器」圖形化配置 |
| 返回記錄 | 否 | 存儲過程無結果集時設 No,提升性能 |
| 記錄集類型 | 快照 | 只讀、靜態,適合存儲過程調用 |
EXEC dbo.sp_CalculateBill @CycleID=202401, @BatchMode=1。qry_pt_CalcBill。Private Sub btnCalcBill_Click()
On Error GoTo ErrHandler
Dim dbs As DAO.Database, qdf As DAO.QueryDef
Set dbs = CurrentDb
Set qdf = dbs.QueryDefs("qry_pt_CalcBill")
' 可動態修改 SQL 參數
' qdf.SQL = "EXEC dbo.sp_CalculateBill @CycleID=" & Me.txtCycle & ", @BatchMode=1"
qdf.Execute dbFailOnError ' 同步執行,異常拋出可捕獲
MsgBox "計費任務已提交執行!", vbInformation
Exit Sub
ErrHandler:
MsgBox "執行失敗:" & Err.Description, vbCritical
If Not qdf Is Nothing Then Set qdf = Nothing
If Not dbs Is Nothing Then Set dbs = Nothing
End Sub
| 模式 | SQL Server | Oracle | 備註 |
|---|---|---|---|
| 任務提交 | ✅ Task / Agent Job | ✅ DBMS_SCHEDULER | 成熟方案 |
| 觸發器激活 | ✅ AFTER TRIGGER | ✅ AFTER TRIGGER | 邏輯在後端,前端無差異 |
| Pass-Through | ✅ 完美支持 | ❌ 不支持 | Oracle 需用 ADO/OO4O/ODBC 直接調用 |