ホームページ  >  記事  >  バックエンド開発  >  C++ での Oracle データベースの使用とそのサンプル コード

C++ での Oracle データベースの使用とそのサンプル コード

王林
王林オリジナル
2023-08-22 15:57:331861ブラウズ

C++ での Oracle データベースの使用とそのサンプル コード

Oracle は強力なリレーショナル データベース管理システムです。C で Oracle データベースを使用すると、データベースをより効率的に管理できます。この記事では、C で Oracle データベースを使用する方法と関連するサンプル コードを紹介します。

1. Oracle データベース ドライバーのインストールと設定

Oracle データベースを使用する前に、対応する Oracle ドライバーをインストールする必要があります。 Oracle は公式に ODBC ドライバーを提供しており、公式 Web サイトからダウンロードしてインストールできます。

インストールが完了したら、[コントロール パネル] -> [管理ツール] -> [データ ソース (ODBC)] に移動します。 ODBC ドライバーは「ドライバー」で確認できます。対応するドライバーを選択して構成する必要があります。

「データソース名」に接続するOracleデータベースのエイリアス(「orcl」など)を入力します。 「サーバー名」にはデータベースに接続するホスト名またはIPアドレスを入力します。 「ユーザーID」にデータベースに接続するためのユーザー名を入力し、パスワードに対応するパスワードを入力します。 「接続テスト」ボタンをクリックし、「接続成功」と表示されれば接続成功です。

2. Oracle データベースの使用

C で Oracle データベースを使用するには、oracle ヘッダー ファイルを導入し、関連する設定を行う必要があります。

1. ヘッダー ファイルのインクルード

まず、ヘッダー ファイル oci.h と oci.cpp をインクルードする必要があります。これら 2 つのヘッダー ファイルは、Oracle インストール ディレクトリの OCI/include ディレクトリにあります。 。

2. Oracle ライブラリ ファイルのリンク

oci.lib、ociw32.lib、orannzsbb11.dll などの Oracle ライブラリ ファイルをリンクする必要があります。

3. OCI ハンドルの作成

OCI ハンドルは、Oracle が提供するメモリ管理メカニズムです。 OCI ハンドルは、OCILIB ライブラリと Oracle サービス (SQL 文) の間の接続と対話を管理するために使用されます。

OCI ハンドルを使用する場合は、まずそれを申請し、必要に応じて構成する必要があります。一般的に使用される OCI ハンドルは次のとおりです。
(1) 環境ハンドル: OCIEnv。
(2) サービスハンドル: OCISvcCtx。
(3) セッション ハンドル: OCISession。
(4) ステートメント ハンドル: OCIStmt。
(5) 結果セット・ハンドル: OCIDefine、OCIParam。

次は、OCI 環境ハンドル、サービス ハンドル、セッション ハンドル、およびステートメント ハンドルに適用するコードです:

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. Oracle データベースへの接続

次のように設定する必要があります。最初に OCIServer のサービス名を指定し、次に OCILogon2 関数を呼び出して Oracle データベースに接続します。 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. SQL 文の実行

SQL 文を実行するには、OCIStmt ハンドルと OCIDefine ハンドルを使用する必要があります。 OCIStmt ハンドルは SQL 文の準備に使用され、OCIDefine ハンドルは出力変数の定義に使用されます。
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. サンプル コード

Oracle データベースに接続して 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;
}

以上です。Oracle データベースとその C 言語のサンプル コードを使用して、皆さんのお役に立てれば幸いです。

以上がC++ での Oracle データベースの使用とそのサンプル コードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。