使用 VC++ 搭配 ADO 連接 Access 資料庫,需根據使用者輸入的範圍(如編輯框輸入起始與結束值),查詢 石灰加入量/kg 欄位在該範圍內的最大值與最小值。原程式碼僅能查詢全表最大值。
將使用者輸入的範圍值作為 SQL WHERE 條件,直接在資料庫層面過濾資料,再取得極值,避免將大量資料拉到應用層排序。
// 取得最大值
CString sqlMax = _T("SELECT MAX([石灰加入量/kg]) FROM employees WHERE [石灰加入量/kg] >= ? AND [石灰加入量/kg] <= ?");
// 取得最小值
CString sqlMin = _T("SELECT MIN([石灰加入量/kg]) FROM employees WHERE [石灰加入量/kg] >= ? AND [石灰加入量/kg] <= ?");
_CommandPtr pCmd = NULL;
pCmd.CreateInstance(__uuidof(Command));
pCmd->ActiveConnection = m_Ado.m_pConnection;
pCmd->CommandText = sqlMax.bstrVal;
pCmd->CommandType = adCmdText;
// 附加參數
pCmd->Parameters->Append(pCmd->CreateParameter(_T("@min"), adDouble, adParamInput, 0, minVal));
pCmd->Parameters->Append(pCmd->CreateParameter(_T("@max"), adDouble, adParamInput, 0, maxVal));
_RecordsetPtr pRs = pCmd->Execute(NULL, NULL, adCmdText);
if (!pRs->adoEOF) {
_variant_t var = pRs->GetCollect(0);
if (var.vt != VT_NULL) {
double maxValue = var.dblVal;
// 顯示到編輯框...
}
}
/、中文等,必須用方括號 [] 包裹。MAX()、MIN() 讓資料庫引擎計算,效能遠優於應用層排序。CDBL() 或 VAL()。若專案允許,可考慮使用 DAO 物件模型或透過 CurrentProject.Connection.Execute 執行直通 SQL,語法更簡潔。
採用參數化聚合查詢,可高效、安全地解決範圍極值查詢需求。