我的PC文件在Solaris 10上用gcc编译能够通过,能够生成c文件,访问Oracle 10g数据库,但是将同样的PC文件移到windows xp下用VC6.0进行PRO*C编译无法通过,windows xp上安装了Oracle 10g客户端,这是什么原因?那些编译环境需要设置那?我在tools-->options-->directories中include了E:\ORAHOME_1\PRECOMP\PUBLIC;;E:\ORAHOME_1\OCI\INCLUDE;;executable files中加了E:\ORAHOME_1\BIN;;在project-->setting中commands加了proc connectora.pc oname=connectora.cpp sqlcheck=SYNTAX;;outputs中加了connectora.cpp;;工程中加了orasql10.lib文件,pcscfg.cfg文件中内容为:
define=(WIN32_LEAN_AND_MEAN)
sys_include=($ORACLE_HOME/precomp/public,/usr/include,/home/tuxedo/include)
include=$ORACLE_HOME/precomp/public
include=$ORACLE_HOME/precomp/hdrs
include=$ORACLE_HOME/precomp/LIB
include=$ORACLE_HOME/tpcc2x_2/src
include=$ORACLE_HOME/precomp/include
include=$ORACLE_HOME/oracore/include
include=$ORACLE_HOME/oracore/public
include=$ORACLE_HOME/rdbms/include
include=$ORACLE_HOME/rdbms/public
include=$ORACLE_HOME/rdbms/demo
include=$ORACLE_HOME/nlsrtl/include
include=$ORACLE_HOME/nlsrtl/public
include=$ORACLE_HOME/network_src/include
include=$ORACLE_HOME/network_src/public
include=$ORACLE_HOME/network/include
include=$ORACLE_HOME/network/public
include=$ORACLE_HOME/plsql/public
ltype=short
PARSE=none
这是所有的配置,我想问问还有什么需要注意的吗,为什么VC中编译通不过那?请高手指点指点啊。感激涕零!!!

解决方案 »

  1.   

    之前我已经在VC6.0上调通了一个测试PC文件,可以预编译通过,能生成C文件,编译连接生成的可执行文件能够读取数据库中的数据。
      

  2.   

    源码很多,很多个文件,现在我在头文件里定义了结构体,并在头文件里用typedef给结构体重命名,然后在s声明区里用新的命名定义变量.部分源码如下:example.pc
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <time.h>
    #include "resource.h"
    #include "db_interface.h"
    #include "stype.h"
    #include "db_stype.h"
    #include "oci.h"{
      EXEC SQL BEGIN DECLARE SECTION;
     PLATFORM_PAIR_TYPE *PlatformPairPtr;
     DB_PP_SCALAR_COLUMN  *DBPPScalarColumnBuf=NULL, *DBPPScalarColumnPtr;
     DB_TIME_PLS  **DBTimePLsBuf=NULL, **DBTimePLsPtr;
     USHORT  i, PlatformPairCount;
      EXEC SQL END DECLARE SECTION; boolean  CursorOpen=FALSE;
    struct sqlca  sqlca;
     USHORT  rc = 0;do {     .........   EXEC SQL FOR :PlatformPairCount ALLOCATE :DBTimePLsBuf;////////出错的语句
       if ( !!(rc=CheckError(ContextId, sqlca.sqlcode, IDS_DB_ERR_ALLOC_TIME_PLS, __FILE__, __LINE__)) ) {
          if ( rc != CONNECT_ERROR )
         rc = 0xfc;
      break;
       }
       EXEC SQL DECLARE SqlCursor CURSOR FOR SELECT * FROM performance_level;
       EXEC SQL OPEN SqlCursor;
       CursorOpen = TRUE;
       EXEC SQL FOR :PlatformPairCount FETCH SqlCursor INTO :DBPPScalarColumnBuf, :DBTimePLsBuf;
       if ( !!(rc=CheckError(ContextId, sqlca.sqlcode, IDS_DB_ERR_PL_FETCH, __FILE__, __LINE__)) ) {
          if (  rc == NO_ENOUGH_DATA )
         rc = 0;
      else {
             if ( rc != CONNECT_ERROR )
            rc = 0xfa;
         break;
      }
       }        ..................       }
       }
    } while (0);
    }stype.h中有定义
    {
    #ifndef USHORT
    #define USHORT unsigned short
    #endif
    }
    db_interface.h中有定义
    {
    typedef struct _PLATFORM_PAIR_TYPE {
    int a;
            char b;
    } PLATFORM_PAIR_TYPE;
    }
    db_type.h中有定义
    {
    typedef OCIArray DB_TIME_PLS;
    }
    更多的变量定义我就不说了,但是下面的错误信息是在第 70 行, 第 46 列, 文件 .\db_basic.pc 有语义错误: 
       EXEC SQL FOR :PlatformPairCount ALLOCATE :DBTimePLsBuf;
    .............................................1
    PCC-S-02420, 不完整的 (或缺少) 类型说明
    在第 70 行, 第 36 列, 文件 .\db_basic.pc 有语义错误: 
       EXEC SQL FOR :PlatformPairCount ALLOCATE :DBTimePLsBuf;
    ...................................1
    PCC-S-02319, 表达式类型与用法不相符
    这只是其中的一处错误,不明白有没有说明白,这到底是什么错误那,我差了很多网上的,但是都没解决。
    参数parse=none,sqlcheck=syntax,code=cpp
      

  3.   

    proc 中需要加上 include 参数,需要包含 oracle 头文件路径等等,建议先用命令行将proc 编译通过后,再将命令贴到编译命令中
    proc  userid=spf_syn_sb/spf_syn_sb@ACC2011 include=C:\bea\tuxedo8.1\include include="D:\Software\Visual Studio 6\VC98\Include"  include=$(InputDir) sqlcheck=full parse=full iname=$(InputPath)
      

  4.   

    楼上说的不错,确实要把VC包含文件也加上,我是直接加到配置文件里了,另外还有就是包含头文件也要用EXEC SQL BEGIN DECLARE SECTION;
    EXEC SQL END DECLARE SECTION;
    包起来,因为我的头文件里定义的结构体,在pc文件里有用到头文件中定义的结构体,因此要把头文件中定义的东西算是全都加入到声明区中去。其他人还有没有意见。