首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 呼叫 SQL Server 預存程序通用模式:ADO 直執行 SQL 字串零參數綁定

     編輯:VC 教學

傳統 ADO 參數綁定痛點

MSDN 範例需 CreateParameter、Append、Value 三步驟每參數重複,存儲過程一多維護成噩夢。

通用解法:直接執行 T-SQL 批次


_ConnectionPtr pConn(__uuidof(Connection));
pConn->Open(_bstr_t("Provider=SQLOLEDB;Data Source=.;Initial Catalog=Pubs;UID=sa;PWD=;"), L"", L"", adConnectUnspecified);

_RecordsetPtr pRs(__uuidof(Recordset));
// 直接執行「預存程序名 參數1,參數2...」
pRs->Open(_bstr_t("byroyalty 100"),  // 等同 EXEC byroyalty 100
          _variant_t((IDispatch*)pConn),
          adOpenStatic, adLockReadOnly, adCmdText);

// 通用結果集處理
long nFields = pRs->Fields->Count;
while (!pRs->EndOfFile) {
    for (long i=0; iFields->GetItem(i);
        if (val.vt != VT_NULL) printf("%s ", (char*)_bstr_t(val));
        else printf("NULL ");
    }
    printf("\n");
    pRs->MoveNext();
}
pRs->Close();
pConn->Close();

處理 OUTPUT / RETURN 參數

包裝成 T-SQL 批次,將輸出轉為結果集欄位:


// 單一 OUTPUT
DECLARE @q INT;
EXEC checkpwd 'user', 'pwd', @ret = @q OUTPUT;
SELECT @q AS RetCode;

// RETURN + OUTPUT
DECLARE @q INT, @ret INT;
EXEC @ret = checkpwd 'user', 'pwd', @ret = @q OUTPUT;
SELECT @q AS OutParam, @ret AS ReturnVal;

VC++ 端仍呼叫 pRs->Open(sql, ...),結果集自動包含輸出值,**完全不需 CreateParameter**。

為什麼這樣可行?

  • SQL Server 支援 EXEC proc @p1, @p2... 位置參數語法。
  • ADO adCmdText 視同普通批次提交,Server 端解析執行。
  • 結果集元資料 (欄位名/型別) 由 Server 回傳,客戶端動態讀取。

同樣適用 Oracle(下篇主題)

Oracle 需 {call proc(...)} ODBC CALL 語法,但 VC++ 代碼結構完全相同,僅 SQL 字串常數不同。**達成「VC++ 層零修改支援異構資料庫」**。

生產環境強化清單

  • 連線字串加密儲存,啟用 Integrated Security=SSPI 免密碼。
  • CommandTimeout 設定防止長跑查詢掛死。
  • _com_error 捕獲轉換為自定義例外,記錄 SQL 文本與參數值 (脫敏)。
  • 大量資料改用 adExecuteStream 或 BULK INSERT。

對比總結

維度傳統 Parameter 綁定SQL 字串直執行
代碼行數O(參數數)O(1)
預存程序簽名變更影響需同步修改 C++零影響
型別安全編譯期檢查執行期轉換
SQL 注入風險無 (參數化)需自行防範 (參數值嵌入字串)
適用場景核心高頻、型別嚴格報表、管理功能、動態 SQL、異構遷移

建議:核心交易路徑用參數綁定,輔助查詢/報表/遷移期用直執行,兩者共存最務實。

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