photo credit: http://kahwailin.com/ via photopin cc
はじめに
Visual Studio 2008でOracle Pro*cを使ってデータベースを検索するサンプルプログラムを動かしてみました。
この記事を書くにあたり、以下の記事がとても参考になりました。
ソフトバンククリエイティブ
売り上げランキング: 27,265
環境
- Windows Server 2008 R2
- Oracle Database 11g Release 11.2.0.1.0
- Visual Studio C++ 2008 Professional
事前準備
- データベースの作成
- hogeユーザの登録
- table01というテスト用のテーブル作成、データ登録
Visual Studio 2008でつくるサンプルアプリケーション
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インストールディレクトリ\product\11.2.0\dbhome_1\precomp\public |
7.コンパイル言語をC++ではなく、Cソースしてコンパイルするよう変更します。ソリューションのプロパティを開き、C/C++→詳細→「コンパイル言語の選択」に以下を指定します。
コンパイル言語の選択 | Cコードとしてコンパイル(/TC) |
8.追加のライブラリディレクトリを登録します。ソリューションのプロパティを開き、リンカ→全般→「追加のライブラリディレクトリ」に以下を指定します。
追加のライブラリディレクトリ | Oracleインストールディレクトリ\product\11.2.0\dbhome_1\precomp\LIB |
9.追加の依存ファイルを登録します。ソリューションのプロパティを開き、リンカ→入力→「追加の依存ファイル」に以下を指定します。
追加の依存ファイル | orasql11.lib |
10.コンパイル前のプリコンパイルコマンドを設定します。pcファイルを右クリックしてプロパティを開きます。カスタムビルドステップを選択し、以下を指定します。
コマンドライン | proc $(ProjectName).pc |
出力ファイル | $(ProjectName).c |
ビルドして、動かしてみる
メニューからビルド(B)→ソリューションのビルド(R)を選択する。
カスタムビルドステップで、Pro*C/C++が動いているのが確認できます。
------ すべてのリビルド開始: プロジェクト: ProcTest2, 構成: Debug Win32 ------
プロジェクト 'ProcTest2'、構成 'Debug|Win32' の中間出力ファイルを削除しています。
カスタム ビルド ステップを実行しています。
Pro*C/C++: Release 11.2.0.1.0 - Production on 土 1月 18 00:41:38 2014
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
システムのデフォルト・オプション値: C:\app\Administrator\product\11.2.0\dbhome_1\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; }