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

C語言調用 PowerBuilder PBNI 接口操作數據庫

     編輯:關於C語言

背景

C 語言直接操作數據庫繁瑣,可通過 PBNI (PowerBuilder Native Interface) 加載 PB 虛擬機,調用 PB 對象完成數據庫邏輯。

核心流程

  1. LoadLibrary("pbvm90.dll") 加載 PB VM。
  2. GetProcAddress("PB_GetVM") 獲取 IPB_VM*。
  3. vm->CreateSession 創建會話,指定庫列表(如 genapp.dll)。
  4. session->FindGroup/FindClass 定位 PB 用戶對象(如 nvo_mult)。
  5. session->NewObject 實例化對象。
  6. session->GetMethodID 獲取方法 ID(簽名 "III" 表示兩 int 參數、返回 int)。
  7. session->InitCallInfo 初始化調用信息,ci.pArgs->SetInt 設置參數。
  8. session->InvokeObjectFunction 調用,檢查 HasExceptionThrown。
  9. ci.returnValue->GetInt 取返回值。
  10. 清理:FreeCallInfo、Release、FreeLibrary。

完整代碼

[cpp]
#include "stdafx.h"
#include "stdio.h"

typedef PBXEXPORT PBXRESULT (*P_PB_GetVM)(IPB_VM** vm);

int main(int argc, char* argv[]) {
    IPB_Session* session;
    IPB_VM* pbvm = NULL;
    HINSTANCE hinst = LoadLibrary("pbvm90.dll");
    if (!hinst) return 0;
    fprintf(stderr, "Loaded PBVM successfully\n");

    P_PB_GetVM getvm = (P_PB_GetVM)GetProcAddress(hinst, "PB_GetVM");
    if (!getvm) return 0;
    getvm(&pbvm);
    if (!pbvm) return 0;

    LPCTSTR LibList[] = { "genapp.dll" };
    if (pbvm->CreateSession("genapp", LibList, 1, &session) != PBX_OK) {
        fprintf(stderr, "Error in CreateSession\n"); return 1;
    }
    fprintf(stderr, "Created session successfully\n");

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

    PBCallInfo ci;
    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);

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

    pbint ret = ci.returnValue->GetInt();
    fprintf(stderr, "The product of 123 and 45 is %i\n", ret); // 示例輸出

    session->FreeCallInfo(&ci);
    session->Release();
    FreeLibrary(hinst);
    return 0;
}

優勢

  • 將複雜 SQL/事務邏輯封裝在 PB 對象中,C 只負責調用。
  • 利用 PB 強大的 DataWindow、Pipeline 等特性。
  • 適合 legacy 系統遷移或混合開發。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved