#include "BaseHeader.h"
sql_context ConnectDataBase(CString oracleStr);sql_context ConnectPSDataBase();BOOL DisconnectDataBase(sql_context _disConnection);
BOOL Update2DB(const char *piName, long srcSize, long tezhSize, long modiTime);BOOL GetPictBDParamByZjbh(const char *zjbh1, const char *zjbh2, int *outKV1, int *outKV2);int GetFreeConnect();void FreeConnect(int &iConnect);void DisposeConnect(int iConnect);void DisposeAllConnect(BOOL forceDis);sql_context GetDBConnectPtr(int dbid);void sql_error(char *msg, sqlca m_sqlca);int alloc_descriptors(int size, int max_vname_len, int max_iname_len,SQLDA * bind_dp,SQLDA * select_dp);void process_select_list(CStringArray& AFieldsarray,SQLDA * bind_dp,SQLDA * select_dp);
错误代码如下:
ProcessDBEvent.h:3: error: expected constructor, destructor, or type conversion before '*' token
ProcessDBEvent.h:4: error: expected constructor, destructor, or type conversion before '*' token
ProcessDBEvent.h:5: error: 'sql_context' was not declared in this scope
ProcessDBEvent.h:5: error: '_disConnection' was not declared in this scope
ProcessDBEvent.h:14: error: 'sql_context' does not name a type
ProcessDBEvent.h:15: error: 'sqlca' has not been declared
ProcessDBEvent.h:16: error: 'SQLDA' has not been declared
ProcessDBEvent.h:16: error: 'SQLDA' has not been declared
ProcessDBEvent.h:17: error: 'SQLDA' has not been declared
ProcessDBEvent.h:17: error: 'SQLDA' has not been declared

解决方案 »

  1.   

    对于上面的错误,头文件或者pc文件中,加没加这几句话:
    EXEC SQL INCLUDE oraca;
    EXEC SQL INCLUDE sqlca;
    EXEC SQL INCLUDE sqlda;
    EXEC ORACLE OPTION (ORACA=YES);
      

  2.   

    首先感谢兰兰的回答,现在出现了新的问题
    ProcessDBEvent.h: In function 'void process_select_list(CStringArray&, SQLDA*, SQLDA*, void*)':
    ProcessDBEvent.h:947: error: 'sqlnul' was not declared in this scope
    ProcessDBEvent.h:952: error: 'sqlprc' was not declared in this scope
    ProcessDBEvent.h: In function 'int alloc_descriptors(int, int, int, SQLDA*, SQLDA*)':
    ProcessDBEvent.h:996: error: 'sqlald' was not declared in this scope
    ProcessDBEvent.h:1002: error: 'sqlald' was not declared in this scope
    ProcessDBEvent.h:1012: error: cannot convert 'short int*' to 'char*' in assignment
    ProcessDBEvent.h:1016: error: cannot convert 'short int*' to 'char*' in assignment
    ProcessDBEvent.h: In function 'int RunSqlAndGetXML(MystrBuf&, const char*, void*)':
    ProcessDBEvent.h:1219: error: 'sqlclu' was not declared in this scope我写了一个测试PRO×C连接oracle的数据库,能通过,也包含上面的函数
    不知道这个错误是怎么回事,注,我先proc生成.h文件,然后g++编译出现上边的错误
      

  3.   

    哦,。。
    g++编译的时候,没加别的参数么?
    至少应该加些参数。。比如说:
    gcc/g++ include=${ORACLE_HOME}/rdbms/demo include=${ORACLE_HOME}/rdbms/public ...
      

  4.   

    gcc -o DBTranfer DBTMain.cpp -lsqlora8 /home/oracle/oracle/product/10.2.0/db_1/lib/libclntsh.soproc ProcessDBEvent oname=ProcessDBEvent.h parse=none code=cpp HOLD_CURSOR=NO ORACA=YES
    以上是编译的选项,有问题吗?
      

  5.   

    工程中调用帮不了你了sorry.....
      

  6.   

    PROC的问题:
    第一步:
    sql_context ConnectDataBase(CString oracleParam)
    {
    CString errormessage, errorstr; 
    EXEC SQL BEGIN DECLARE SECTION;
    VARCHAR ConnStr[100];
    sql_context context;
    struct sqlca m_sqlca;
    EXEC SQL END DECLARE SECTION;
    memcpy(ConnStr.arr,oracleParam.c_str(),oracleParam.GetLength());
    ConnStr.len = oracleParam.GetLength();
    try //建立数据库连接 

    if(strlen(oracleParam)>5)
    {
    EXEC SQL ENABLE THREADS;
    EXEC SQL CONTEXT ALLOCATE :context;
    EXEC SQL CONTEXT USE :context;
    EXEC SQL CONNECT :ConnStr;
    if (SQLCODE < 0)
    {
    errormessage+=("Failed: ");
    errormessage+="OracleString=";
    errormessage+=oracleParam;
    errorstr.Format("\n创建数据库连接失败,,%d:%s\n",SQLCODE, m_sqlca.sqlerrm.sqlerrmc);
    errormessage += errorstr;
    WriteLogFile(errormessage);
    return NULL;
    }
    }
    return context;

    catch(...) 
    {
    errormessage+=("Exception: ");
    errormessage+="OracleString=";
    errormessage+=oracleParam;
    WriteLogFile(errormessage);
    return NULL; 

    }
    建立连接池
    第二步:传入sql语句执行
    int RunSqlAndGetXML(MystrBuf &opBuf, const char *sqlStr, sql_context inCon)
    {
    printf("RunSqlAndGetXML_0\n");
    EXEC SQL BEGIN DECLARE SECTION;
    VARCHAR sqlexec[1024];
    // char vc_user[30] = {"hzchanncel/hzchanncel@orcl"};
    EXEC SQL END DECLARE SECTION;
    bool teOK=false;
    CString ErrorStr;
    memcpy(sqlexec.arr,sqlStr,strlen(sqlStr));
    sqlexec.len = strlen(sqlStr);
     //   EXEC SQL CONNECT :vc_user; EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE ERRROR: ",inCon);
    printf("RunSqlAndGetXML_1\n");
    EXEC SQL CONTEXT USE :inCon;
    printf("RunSqlAndGetXML_2\n");
    printf("%s\t\t%d\n",sqlexec.arr,inCon);
    EXEC SQL PREPARE S FROM :sqlexec;
    printf("RunSqlAndGetXML_3\n");
    EXEC SQL DECLARE C CURSOR FOR S;  
    printf("RunSqlAndGetXML_4\n");     
    if( (strncmp(sqlStr,"SELECT",6)) != 0 && (strncmp(sqlStr,"select",6) != 0))
    {   
        EXEC SQL open C;
     if(sqlca.sqlcode >= 0)
     {
      teOK = true;
    return 0;
    }
     else
    {
    ErrorStr.Format("EXEC SQL Failed:%s",sqlStr);
    WriteLogFile(ErrorStr);
    return -1;
    }
    }
    printf("RunSqlAndGetXML_5\n"); CString str;
    CStringArray fieldsarray;
    long i, recCnt=0;
    SQLDA * bind_dp;
    SQLDA * select_dp;
    DWORD dwStart = GetTickCount();
    printf("RunSqlAndGetXML_6\n");
    if(alloc_descriptors(MAX_ITEMS,MAX_VNAME_LEN,MAX_INAME_LEN,bind_dp,select_dp)!= 0 )
            {
        return -1;
            }
    printf("RunSqlAndGetXML_7\n");
    process_select_list(fieldsarray,bind_dp,select_dp,inCon);
    printf("RunSqlAndGetXML_8\n");
    if(fieldsarray.GetSize() <= 0)
    return 0;
    MyAddString(&opBuf, "<?xml version=\"1.0\" standalone=\"yes\"?>\r\n");
    MyAddString(&opBuf, "<DEFAULT>\r\n");
    EXEC SQL WHENEVER NOT FOUND GOTO end_select_loop;
    printf("RunSqlAndGetXML_9\n");
      for(;;)
    {
       EXEC SQL FETCH C USING DESCRIPTOR select_dp;
    MyAddString(&opBuf, "<RecordSetXML>\r\n");
       for( i=0;i<select_dp->F;i++)
       {
    printf("RunSqlAndGetXML_10\n");
        if( *select_dp->I[i] < 0)
         str.Format("%.*s",(int)select_dp->L[i],select_dp->V[i]);
        else
        {
         str.Format("%.*s",(int)select_dp->L[i],select_dp->V[i]);
        }
    str.TrimLeft();
    str.TrimRight();
    MyAddString(&opBuf, "<");
    MyAddString(&opBuf, fieldsarray.GetAt(i));
    MyAddString(&opBuf, ">");
    MyAddString(&opBuf, str);
    MyAddString(&opBuf, "</");
    MyAddString(&opBuf, fieldsarray.GetAt(i));
    MyAddString(&opBuf, ">\r\n");
       }
    recCnt++;
    MyAddString(&opBuf, "</RecordSetXML>\r\n");
    }
    end_select_loop:
    printf("RunSqlAndGetXML_11\n");
    DWORD dwEnd = GetTickCount() - dwStart;
    CString strTime;
    strTime.Format("%s execute %d",sqlStr,  dwEnd);
    WriteLogFile(strTime);
    for( i=0;i<MAX_ITEMS;i++ )
    {
    if( bind_dp->V[i] != (char *)NULL )
        free(bind_dp->V[i]);
        free(bind_dp->I[i]);
       if( select_dp->V[i] != (char *)NULL )
        free(select_dp->V[i]);
        free(select_dp->I[i]);
     }
     sqlclu(bind_dp);
     sqlclu(select_dp);
     EXEC SQL WHENEVER SQLERROR CONTINUE;
     return recCnt;
    }执行后发现在EXEC SQL PREPARE S FROM :sqlexec;是出错,错误代码是-3114,提示数据库未连接上,不知何解?