visual studio 2008でのpro*C開発方法

本ページではvisual studio 2008 VC++ を用いてpro*Cの開発をする手順をまとめます。 使用した環境は以下の通りです。

OS Windows XP SP3 Proffetional x86
開発環境 Visual studio 2008 VC++
ソースの言語 C言語
データベースのバージョン 10.2

手順

1 プロジェクトを作成する
プロジェクトの種類はここでは「win32」の「コンソールアプリケーション」を選択します。この際以下の2点を注意してください。

・「CLR」は.netのランタイムを使用するプログラム開発用のプロジェクトでpro*Cが使用するライブラリは.net環境用のライブラリ(マネージライブラリ)ではありませんのでそのままでは利用できません。

・「プリコンパイル済みヘッダー」のチェックは外してください。pro*Cがプリコンパイルしたソースはプリコンパイル済みヘッダーの設定と競合するためそのままではコンパイルできません。

vc_proc0 vc_proc1

vc_proc2 vc_proc3

2 メインソースの拡張子をpcに変更登録する
デフォルトで作成されるソースの拡張子はC++用の拡張子(.cpp)となっているのでpro*Cソース用のデフォルト拡張子の.pcに変更します。

vc_proc4 vc_proc5

3 拡張子.cの空ファイルを登録する
プリコンパイル後ソースが拡張子.cのファイルで作成されるためメインのソース名に拡張子を.cに変更した空ファイルを登録します。

vc_proc6 vc_proc7

vc_proc8

4 プロジェクトの設定を変更する
設定内容は以下です。

・「追加のインクルードディレクトリ」にプリコンパイラ用のincludeファイル(%ORACLE_HOME%\precomp\public)を設定する
・「コンパイル言語の選択」でC++ではなくCとしてコンパイルするようにする
・「追加の依存ファイル」にてプリコンパイラ用の関数が参照するライブラリを追加する(%ORACLE_HOME%\precomp\LIB\orasql10.lib)
・ビルド前に実行する処理としてprocコマンドによるプリコンパイルコマンドを設定する
vc_proc9 vc_proc10

vc_proc11 vc_proc12

vc_proc13

5 ソースを変更する
今回は以下のサンプルソースを使用しました。このソースはscottユーザのdept表を必要とします。 また、フォントが斜線になっている箇所(ユーザ、パスワード、SID)は環境に合わせて変更します。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "time.h"

EXEC SQL INCLUDE sqlca;
EXEC SQL BEGIN DECLARE SECTION;
         varchar  uid[64];
         varchar  pwd[64];
         varchar  sid[64];
         varchar  dname[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()
{
    //ユーザ名、パスワードセット
    strcpy((char *)uid.arr,"SCOTT");
    uid.len = strlen((char *)uid.arr);
    strcpy((char *)pwd.arr,"TIGER");
    pwd.len = strlen((char *)pwd.arr);
    strcpy((char *)sid.arr,"ORCL102");
    sid.len = strlen((char *)sid.arr);

    EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error--\n");
    //接続
    EXEC SQL CONNECT :uid IDENTIFIED BY :pwd using :sid;
    //CURSORを使用してループ
    EXEC SQL DECLARE CUR1 CURSOR FOR
         SELECT DNAME FROM DEPT;
    EXEC SQL OPEN CUR1;
    printf("PRINT DEPT START");
    for ( ; ;)
    {
        EXEC SQL WHENEVER NOT FOUND GOTO nodept;
        EXEC SQL FETCH CUR1 INTO :dname;
        printf("\n %s",dname.arr);
        EXEC SQL WHENEVER NOT FOUND STOP;
    }
    EXEC SQL CLOSE CUR1;

    nodept:
        printf("\nPRINT DEPT END\n");
    return 0;
}
6 ソースをビルドする
ソースをビルドし、エラーなく終了するか確認します。

vc_proc15 vc_proc16

以下はソースビルド時のログとなります。
1>------ ビルド開始: プロジェクト: proc_vc, 構成: Debug Win32 ------
1>ビルド前のイベントを実行しています...
1>Pro*C/C++: Release 10.2.0.4.0 - Production on 土 4月 9 00:54:53 2011
1>Copyright (c) 1982, 2007, Oracle.  All rights reserved.
1>システムのデフォルト・オプション値: E:\oracle\product\10.2.0\db_1\precomp\admin\pcscfg.cfg
1>コンパイルしています...
1>stdafx.cpp
1>コンパイルしています...
1>proc_vc.c
1>e:\program\vc\proc_vc\proc_vc\proc_vc.c(280) : warning C4013: 関数 'sqlglm' は定義されていません。int 型の値を返す外部関数と見なします。
1>e:\program\vc\proc_vc\proc_vc\proc_vc.c(306) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>        c:\program files\microsoft visual studio 9.0\vc\include\string.h(74) : 'strcpy' の宣言を確認してください。
1>e:\program\vc\proc_vc\proc_vc\proc_vc.c(308) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>        c:\program files\microsoft visual studio 9.0\vc\include\string.h(74) : 'strcpy' の宣言を確認してください。
1>e:\program\vc\proc_vc\proc_vc\proc_vc.c(310) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>        c:\program files\microsoft visual studio 9.0\vc\include\string.h(74) : 'strcpy' の宣言を確認してください。
1>マニフェストをリソースにコンパイルしています...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
1>Copyright (C) Microsoft Corporation.  All rights reserved.
1>リンクしています...
1>マニフェストを埋め込んでいます...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
1>Copyright (C) Microsoft Corporation.  All rights reserved.
1>ビルドログは "file://e:\program\VC\proc_vc\proc_vc\Debug\BuildLog.htm" に保存されました。
1>proc_vc - エラー 0、警告 4
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========
7 ビルドしたプログラムを実行する
ビルドが成功するとプロジェクトディレクトリ配下に\Debug\proc_vc.exeが出力されます。 コマンドラインから実行し、dept表のDNAME列の値が出力されることを確認します。

C:\Documents and Settings\Administrator>cd /d E:\program\VC\Debug

E:\program\VC\Debug>proc_vc.exe
PRINT DEPT START
 ACCOUNTING
 RESEARCHNG
 SALESRCHNG
 OPERATIONS
PRINT DEPT END
★ORACLE案件承ります