Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menggunakan pangkalan data Oracle dalam C++ dan kod sampelnya

Menggunakan pangkalan data Oracle dalam C++ dan kod sampelnya

王林
王林asal
2023-08-22 15:57:331858semak imbas

Menggunakan pangkalan data Oracle dalam C++ dan kod sampelnya

Oracle ialah sistem pengurusan pangkalan data hubungan yang berkuasa Menggunakan pangkalan data Oracle dalam C++ boleh membantu kami mengurus pangkalan data dengan lebih cekap. Artikel ini akan memperkenalkan cara menggunakan pangkalan data Oracle dan kod sampel yang berkaitan dalam C++.

1. Pasang dan konfigurasi pemacu pangkalan data Oracle

Sebelum menggunakan pangkalan data Oracle, anda perlu memasang pemacu Oracle yang sepadan. Oracle secara rasmi menyediakan pemacu ODBC, yang boleh kami muat turun dan pasang dari tapak web rasmi.

Selepas pemasangan selesai, pergi ke Panel Kawalan -> Anda boleh melihat pemacu ODBC dalam "Pemandu". Kita perlu memilih pemacu yang sepadan dan mengkonfigurasinya.

Masukkan alias pangkalan data Oracle yang ingin anda sambungkan dalam "Nama Sumber Data", seperti "orcl". Masukkan nama hos atau alamat IP untuk menyambung ke pangkalan data dalam "Nama Pelayan". Masukkan nama pengguna untuk menyambung ke pangkalan data dalam "ID Pengguna" dan masukkan kata laluan yang sepadan dalam Kata Laluan. Klik butang "Uji Sambungan" Jika ia menggesa "Sambungan berjaya", sambungan berjaya.

2. Menggunakan pangkalan data Oracle

Untuk menggunakan pangkalan data Oracle dalam C++, anda perlu memperkenalkan fail pengepala oracle dan membuat tetapan yang berkaitan.

1. Kemasukan fail pengepala

Pertama, anda perlu memasukkan fail pengepala oci.h dan oci.cpp ini berada dalam direktori OCI/include di bawah direktori pemasangan Oracle.

2. Pautkan fail perpustakaan Oracle

Anda perlu memautkan fail perpustakaan Oracle, termasuk oci.lib, ociw32.lib dan orannzsbb11.dll, dsb.

3. Cipta pemegang OCI

Pemegang OCI ialah mekanisme pengurusan memori yang disediakan oleh Oracle. Pemegang OCI digunakan untuk mengurus sambungan dan interaksi antara perpustakaan OCILIB dan perkhidmatan Oracle (penyata SQL).

Apabila menggunakan pemegang OCI, anda perlu memohonnya dahulu dan kemudian mengkonfigurasinya mengikut keperluan. Pemegang OCI yang biasa digunakan termasuk:
(1) Pemegang persekitaran: OCIEnv.
(2) Pemegang perkhidmatan: OCISvcCtx.
(3) Pengendali sesi: OCISession.
(4) Pemegang penyata: OCIStmt.
(5) Pemegang set keputusan: OCIDefine, OCIParam.

Berikut ialah kod untuk memohon pengendalian persekitaran OCI, pemegang perkhidmatan, pemegang sesi dan pemegang penyata:

OCIEnv* envhp;
OCIStmt* stmthp;
OCIServer* srvhp;
OCISession* sesshp;

//申请环境句柄
int err = OCIEnvCreate(&envhp, OCI_THREADED|OCI_OBJECT, (dvoid*)0, (dvoid*(*)(dvoid*, size_t))0, (dvoid*(*)(dvoid*, dvoid*, size_t))0, (void(*)(dvoid*, dvoid*))0, (size_t)0, (dvoid**)0);

//申请服务句柄
err = OCIHandleAlloc(envhp, (dvoid**)&srvhp, OCI_HTYPE_SERVER, (size_t)0, (dvoid**)0);

//申请会话句柄
err = OCIHandleAlloc(envhp, (dvoid**)&sesshp, OCI_HTYPE_SESSION, (size_t)0, (dvoid**)0);

//申请语句句柄
err = OCIHandleAlloc(envhp, (dvoid**)&stmthp, OCI_HTYPE_STMT, (size_t)0, (dvoid**)0);

4 Sambung ke pangkalan data Oracle

Anda perlu menetapkan nama perkhidmatan OCIServer dahulu, dan kemudian hubungi OCILogon2. berfungsi untuk menyambung ke pangkalan data Oracle. Berikut ialah kod untuk menyambung ke pangkalan data Oracle:

//设置服务名称
const char* db_name = "orcl";
err = OCIAttrSet(srvhp, OCI_HTYPE_SERVER, (dvoid*)db_name, strlen(db_name), OCI_ATTR_SERVER_NAME, envhp);

//连接数据库
const char* user_name = "scott";//连接的用户名
const char* password = "tiger";//连接的密码
const char* dblink = 0;//连接方式
ub4 dblink_len = 0;
err = OCILogon2(envhp, errhp, &sesshp, (CONST OraText*)user_name, strlen(user_name), (CONST OraText*)password, strlen(password), (CONST OraText*)dblink, (ub4)dblink_len, (CONST OraText*)0, 0);

5 Jalankan pernyataan SQL

Anda perlu menggunakan pemegang OCIStmt dan pemegang OCIDefine untuk melaksanakan pernyataan SQL. Pemegang OCIStmt digunakan untuk menyediakan pernyataan SQL, dan pemegang OCIDefine digunakan untuk menentukan pembolehubah output.
Berikut ialah kod untuk melaksanakan pernyataan SQL:

//定义SQL语句
const char* sql = "select empno from emp where empno=:1";
err = OCIStmtPrepare(stmthp, errhp, (CONST OraText*)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);

//绑定输入参数
ub2 empno = 7900;
err = OCIBindByPos(stmthp, &bindhp, errhp, 1, &empno, sizeof(empno), SQLT_INT, 0, 0, 0, 0, 0, OCI_DEFAULT);

//执行SQL语句
err = OCIStmtExecute(svchp, stmthp, errhp, 1, 0, 0, 0, OCI_DEFAULT);

//定义输出变量
ub2 out_empno;
ub2 ind;
sb2 out_len;
ERRCALL(OCIDefineByPos(stmthp, &dfnhp, errhp, 1, (dvoid*)&out_empno, sizeof(out_empno), SQLT_INT, &ind, &out_len, 0, OCI_DEFAULT));

//获取结果
err = OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT);

3. Contoh kod

Berikut ialah kod lengkap untuk menyambung ke pangkalan data Oracle dan melaksanakan pernyataan SQL:

#include<iostream>
#include<occi.h>
#include<oci.h>

using namespace std;
using namespace oracle::occi;

int main()
{
    OCIEnv *envhp;
    OCIStmt *stmthp;
    OCIServer *srvhp;
    OCISession *sesshp; 

    // 申请OCI环境句柄
    int err = OCIEnvCreate(&envhp, OCI_THREADED|OCI_OBJECT, (dvoid*)0, (dvoid*(*)(dvoid*, size_t))0, (dvoid*(*)(dvoid*, dvoid*, size_t))0, (void(*)(dvoid*, dvoid*))0, (size_t)0, (dvoid**)0);

    // 申请服务句柄
    err = OCIHandleAlloc(envhp, (dvoid**)&srvhp, OCI_HTYPE_SERVER, (size_t)0, (dvoid**)0);

    // 申请会话句柄
    err = OCIHandleAlloc(envhp, (dvoid**)&sesshp, OCI_HTYPE_SESSION, (size_t)0, (dvoid**)0);

    // 申请语句句柄
    err = OCIHandleAlloc(envhp, (dvoid**)&stmthp, OCI_HTYPE_STMT, (size_t)0, (dvoid**)0);

    // 设置服务名称
    const char* db_name = "orcl";
    err = OCIAttrSet(srvhp, OCI_HTYPE_SERVER, (dvoid*)db_name, strlen(db_name), OCI_ATTR_SERVER_NAME, envhp);

    // 连接数据库
    const char* user_name = "scott";//连接的用户名
    const char* password = "tiger";//连接的密码
    const char* dblink = 0;//连接方式
    ub4 dblink_len = 0;
    err = OCILogon2(envhp, errhp, &sesshp, (CONST OraText*)user_name, strlen(user_name), (CONST OraText*)password, strlen(password), (CONST OraText*)dblink, (ub4)dblink_len, (CONST OraText*)0, 0);

    // 执行SQL语句
    const char* sql = "select empno from emp where empno=:1";
    err = OCIStmtPrepare(stmthp, errhp, (CONST OraText*)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);

    ub2 empno = 7900;// 输入的empno
    OCIBind* bindhp;
    err = OCIBindByPos(stmthp, &bindhp, errhp, 1, &empno, sizeof(empno), SQLT_INT, 0, 0, 0, 0, 0, OCI_DEFAULT);

    OCIDefine* dfnhp;
    ub2 out_empno;
    ub2 ind;
    sb2 out_len;
    ERRCALL(OCIDefineByPos(stmthp, &dfnhp, errhp, 1, (dvoid*)&out_empno, sizeof(out_empno), SQLT_INT, &ind, &out_len, 0, OCI_DEFAULT));

    err = OCIStmtExecute(svchp, stmthp, errhp, 1, 0, 0, 0, OCI_DEFAULT);

    err = OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT);
    while(err == OCI_SUCCESS)
    {
        cout << out_empno << endl;
        err = OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT);
    }

    // 断开连接
    OCILogoff(sesshp, envhp); 
    OCIHandleFree(srvhp, OCI_HTYPE_SERVER);
    OCIHandleFree(sesshp, OCI_HTYPE_SESSION); 
    OCIHandleFree(stmthp, OCI_HTYPE_STMT); 
    OCIHandleFree(envhp, OCI_HTYPE_ENV); 

    return 0;
}

Di atas adalah penggunaan pangkalan data Oracle dan kod sampelnya dalam C++, saya harap ia akan membantu semua orang.

Atas ialah kandungan terperinci Menggunakan pangkalan data Oracle dalam C++ dan kod sampelnya. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn