photo credit: josemanuelerre via photopin cc
はじめに
OracleデータベースのインストールされていないWindows7上で、Visual Studio 2005を使ってOracle Pro*C(.pc)ファイルをビルドする方法をまとめてみました。
環境
- Windows 7 Enterprise
- Visual Studio 2005 Professional
- Oracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft Windows (32-bit)
事前準備
以下の記事を参考にOracle Clientをインストールしてください。
この記事では、以下のパスにOracle Clientをインストールした場合として説明します。
Oracleインストールディレクトリ | C:\app\Administrator\product\11.2.0\client_2 |
Visual Studio 2005でPro*cファイルをビルドする
1.Visual Studioを起動して、新規C++プロジェクトを作成します。
プロジェクトの種類 | テンプレート |
Win32 | Win32コンソールアプリケーション |
2.Win32アプリケーションウィザードで「次へ」ボタンをクリックします。
3.アプリケーションの設定で、「プリコンパイル済みヘッダー(P)」のチェックを外し、「完了」ボタンをクリックします。
4.cppファイルの拡張子をcpp→pcへと変更します。pcファイルに記述する内容は後述します。
5.空のcファイルを登録します。ソースファイルフォルダを右クリックして、追加(D)→新しい項目(W)を選択します。
C++ファイル(.cpp)を選択し、ファイル名欄の拡張子を(.c)に変更してから「追加(A)」ボタンをクリックします。
カテゴリ | テンプレート |
コード | C++ファイル(.cpp) |
6.Oracleのインクルードファイルを追加します。ソリューションのプロパティを開き、「追加のインクルードディレクトリ」に以下を指定します。
追加のインクルードディレクトリ | Oracle Clientのインストールディレクトリ\precomp\public |
7.コンパイル言語をC++ではなく、Cソースしてコンパイルするよう変更します。ソリューションのプロパティを開き、C/C++→詳細→「コンパイル言語の選択」に以下を指定します。
8.追加のライブラリディレクトリを登録します。ソリューションのプロパティを開き、リンカ→全般→「追加のライブラリディレクトリ」に以下を指定します。
追加のライブラリディレクトリ | Oracle Clientのインストールディレクトリ\precomp\LIB |
9.追加の依存ファイルを登録します。ソリューションのプロパティを開き、リンカ→入力→「追加の依存ファイル」に以下を指定します。
追加の依存ファイル | orasql11.lib |
10.pcファイルにカスタムビルドを設定します。
pcファイルを右クリックしてプロパティを開きます。カスタムビルドステップを選択し、以下を指定します。*1
コマンドライン | proc $(InputName).pc |
出力ファイル | $(InputName).c |
ビルドしてみる
メニューからビルド(B)→ソリューションのビルド(R)を選択します。
ビルドログにprocコマンドの実行ログが出力されていることを確認します。
カスタム ビルド ステップを実行しています。
Pro*C/C++: Release 11.2.0.1.0 - Production on 土 1月 18 14:27:12 2014
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
システムのデフォルト・オプション値: C:\app\Administrator\product\11.2.0\client_2\precomp\admin\pcscfg.cfg
コンパイルしています...
pcファイルの中身
#pragma warning( disable: 4996 ) #include "stdio.h" #include "stdlib.h" #include "string.h" #include "sqlcpr.h" EXEC SQL INCLUDE sqlca; EXEC SQL BEGIN DECLARE SECTION; char uid[64]; char pwd[64]; char sid[64]; char name[40]; EXEC SQL END DECLARE SECTION; void sql_error(char* msg) { char err_msg[128]; size_t buf_len, msg_len; EXEC SQL WHENEVER SQLERROR CONTINUE; printf("\n%s\n", msg); buf_len = sizeof (err_msg); sqlglm(err_msg, &buf_len, &msg_len); printf("%.*s\n", msg_len, err_msg); EXEC SQL ROLLBACK RELEASE; exit(EXIT_FAILURE); } int main() { // ユーザ名 sprintf(uid, "hoge"); // パスワード sprintf(pwd, "hoge_pwd"); // SID sprintf(sid, "orcl"); EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error--\n"); // データベースへの接続 EXEC SQL CONNECT :uid IDENTIFIED BY :pwd; // カーソル定義 EXEC SQL DECLARE CUR1 CURSOR FOR SELECT name FROM table01; // カーソルオープン EXEC SQL OPEN CUR1; printf("PRINT START FOR DEBUG"); for ( ; ;) { EXEC SQL WHENEVER NOT FOUND GOTO noData; // データフェッチ EXEC SQL FETCH CUR1 INTO :name; printf("\n NAME::%s",name); EXEC SQL WHENEVER NOT FOUND STOP; } // カーソルクローズ EXEC SQL CLOSE CUR1; noData: printf("\nPRINT END FOR DEBUG\n"); return 0; }
関連エントリ
*1:Visual Studio 2008からは$(InputName)は廃止され、$(ProjectName)を使用します。