C言語の勉強3 Oracleデータベース接続

C言語の勉強というタイトルですが微妙に違うような。。。

C言語Oracleデータベースに接続ってどうやるのか気になったので調べてみました。

環境
 IDE : Visual Stdio 2010
 Oracle : Oracle Database11gR2
      Oracle Client


設定
 ■Visual Stdio 2010
  1. 対象のプロジェクトを右クリック→「参照」→「構成プロパティ」→「VC++ディレクトリ」→「インクルードディレクトリ」
   「Oracle Clientインストールディレクトリ/oci/includes」追加。
  2. 対象のプロジェクトを右クリック→「参照」→「構成プロパティ」→「VC++ディレクトリ」→「ライブラリディレクトリ」
    「Oracle Clientインストールディレクトリ/oci/lib/msvc」追加。
  3. 対象のプロジェクトを右クリック→「参照」→「構成プロパティ」→「リンカ」→「コマンドライン
    追加オプションに「oci.lib」を追加。


 ■Oracle Client
  tnsnames.oraにサービス名を追加。
   (前に設定してあったのでスキップ)


ソース


#include
#include
#include


int main( int argc, char* argv[] )
{
sword status = OCI_SUCCESS;
OCIEnv* envhp;
OCIError* errhp;
OCISvcCtx* svchp;
OCIStmt* stmtp;
//OCIBind* bindp;
OCIDefine* dfnp;
char* username = "study";
char* password = "study";
char* dbname = "orcl";
char* stmt = "SELECT 'Hello, OCI World!' AS Message FROM DUAL";
char message[64];

status = OCIEnvCreate(&envhp, OCI_DEFAULT, 0, 0, 0, 0, 0, 0);
if(status != OCI_SUCCESS) {
printf("OCIEnvCreate - error : %d.\n", status);
return -1;
}

status = OCIHandleAlloc(envhp, (dvoid **)&errhp, OCI_HTYPE_ERROR, 0, 0);
if(status != OCI_SUCCESS) {
printf("OCIHandleAlloc - error : %d.\n", status);
return -1;
}

status = OCILogon(envhp, errhp, &svchp, (OraText*)username, strlen(username),
(OraText*)password, strlen(password), (OraText*)dbname, strlen(dbname));
if(status != OCI_SUCCESS) {
printf("OCILogon - error : %d.\n", status);
return -1;
}

status = OCIHandleAlloc(envhp, (dvoid **)&stmtp, OCI_HTYPE_STMT, 0, 0);
if(status != OCI_SUCCESS) {
printf("OCIHandleAlloc - error : %d.\n", status);
return -1;
}

status = OCIStmtPrepare(stmtp, errhp, (OraText*)stmt, strlen(stmt), OCI_NTV_SYNTAX, OCI_DEFAULT);
if(status != OCI_SUCCESS) {
printf("OCIStmtPrepare - error : %d.\n", status);
return -1;
}

status = OCIDefineByPos(stmtp, &dfnp, errhp, 1, message, sizeof(message), SQLT_STR, 0, 0, 0, OCI_DEFAULT);
if(status != OCI_SUCCESS) {
printf("OCIDefineByPos - error : %d.\n", status);
return -1;
}

status = OCIStmtExecute(svchp, stmtp, errhp, 1, 0, NULL, NULL, OCI_DEFAULT);
if(status != OCI_SUCCESS) {
printf("OCIStmtExecute - error : %d.\n", status);
return -1;
}

while ( status == OCI_SUCCESS ) {
printf("%sn", message);
status = OCIStmtFetch2(stmtp, errhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT);
}

/** 解放 */
OCIHandleFree(stmtp, OCI_HTYPE_STMT);
OCILogoff(svchp, errhp);
OCIHandleFree(errhp, OCI_HTYPE_ERROR);

return 0;
}


かなり時間が掛かりました
Javaなら数分で出来るのになぁ・・・


■追記
 これはWindowsでのコンパイル・接続するための方法です。