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

C語言通過PBNI調用PowerBuilder開發數據庫應用

     編輯:關於C

技術背景

純C語言開發數據庫應用繁瑣,利用PowerBuilder Native Interface (PBNI) 可復用PB的DataWindow、事務管理等成熟能力,C層僅負責邏輯協調。

核心調用流程

  1. 加載PBVM動態庫(pbvm90.dll)
  2. 獲取PB_GetVM入口創建虛擬機實例
  3. 創建會話並加載目標PBL(genapp.dll)
  4. 查找對象組(nvo_mult)→ 類 → 實例化對象
  5. 獲取方法ID(f_mult,簽名"III"表示三int參數)
  6. 初始化調用信息、設置參數、調用方法
  7. 處理PB異常與C++異常,獲取返回值
  8. 釋放資源、關閉會話、卸載DLL

關鍵代碼片段

HINSTANCE hinst = LoadLibrary("pbvm90.dll");
P_PB_GetVM getvm = (P_PB_GetVM)GetProcAddress(hinst, "PB_GetVM");
getvm(&pbvm);

LPCTSTR LibList[] = {"genapp.dll"};
pbvm->CreateSession("genapp", LibList, 1, &session);

pbgroup group = session->FindGroup("nvo_mult", pbgroup_userobject);
pbclass cls = session->FindClass(group, "nvo_mult");
pbobject pbobj = session->NewObject(cls);

pbmethodID mid = session->GetMethodID(cls, "f_mult", PBRT_FUNCTION, "III");
session->InitCallInfo(cls, mid, &ci);
ci.pArgs->GetAt(0)->SetInt(10);
ci.pArgs->GetAt(1)->SetInt(20);

session->InvokeObjectFunction(pbobj, mid, &ci);
pbint ret = ci.returnValue->GetInt();  // 獲取返回值

異常處理雙重保障

try {
    session->InvokeObjectFunction(pbobj, mid, &ci);
    if (session->HasExceptionThrown()) {
        session->ClearException();  // 處理PB異常
    }
} catch (...) {
    // 處理C++異常
}

工程實踐建議

  • 將PB邏輯封裝為NVO(非視覺對象),暴露純業務方法
  • 參數類型嚴格匹配PBNI簽名規範
  • 資源釋放順序:CallInfo → Session → VM → DLL
  • 生產環境建議連接池化Session對象
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved