我写了一个pc文件编译生成.cpp文件后,把它拆分成一个类包装起来,结果出现如下的编译错误:
sqlexample_d error LNK2001: 无法解析的外部符号 _sqlca,请各位老师给与指点,谢谢!
----------------------------------------------
我的pc文件:
#include <stdio.h>
#include <stdlib.h>
#include<string.h>//#include <oraca.h>
//EXEC SQL INCLUDE SQLCA;
#define SQLCA_STORAGE_CLASS extern
#include <sqlca.h>
EXEC SQL INCLUDE D:\myProgram\sqlexample\querytabspaceratio.h;QueryTabSpaceRatio::QueryTabSpaceRatio()
{
}QueryTabSpaceRatio::~QueryTabSpaceRatio()
{
}void QueryTabSpaceRatio::sql_error()
{
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("Connect error:");
printf("\n%.70s \n", sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK;
exit(EXIT_FAILURE);
}void QueryTabSpaceRatio::connect()
{
strcpy(username.arr,"ies_his");
  strcpy(passwd.arr,"iesapp");
  username.len = strlen(username.arr);
  passwd.len = strlen(passwd.arr);
  memset(db_name,'\0',20);
  strcpy(db_name,"history");
  EXEC SQL WHENEVER SQLERROR DO sql_error();
  EXEC SQL CONNECT:username IDENTIFIED BY:passwd USING:db_name;
  if(sqlca.sqlcode == 0)
   printf("\nConnected to ORACLE as user: %s\n", username.arr);
  else
    printf("Connected to ORACLE failed!!!!\n");
}float QueryTabSpaceRatio::queryRatio()
{
EXEC SQL SELECT round(SUM(bytes) / 1024 / 1024) totalspace
  INTO :m_total
  FROM dba_data_files
  where tablespace_name = :("USERS")
  GROUP by tablespace_name;
    
  EXEC SQL SELECT round(SUM(bytes) / 1024 / 1024) freespace
  INTO :m_user             
  FROM dba_free_space             
  WHERE tablespace_name = :("USERS")         
  GROUP BY tablespace_name;
    
  printf("total = %f\n", m_total);
  printf("user = %f\n", m_user);
  m_ratio = (1-m_total/m_user)*100;
  printf("tablespace ratio : %f\n",m_ratio);
        
  EXEC SQL COMMIT WORK;
  
  return m_ratio;
}编译命令:D:\myProgram\sqlexample>proc querytabspaceratio CODE=cpp

解决方案 »

  1.   

    补充:对了,我是在vc7的环境下编译的。
    .h文件:
    #ifndef QUERYTABLESPACERATIO_H
    #define QUERYTABLESPACERATIO_H/* Result Sets Interface */
    #ifndef SQL_CRSR
    #  define SQL_CRSR
    struct sql_cursor
    {
    unsigned int curocn;
    void *ptr1;
    void *ptr2;
    unsigned int magic;
    };
    typedef struct sql_cursor sql_cursor;
    typedef struct sql_cursor SQL_CURSOR;
    #endif /* SQL_CRSR *//* Thread Safety */
    typedef void * sql_context;
    typedef void * SQL_CONTEXT;/* Object support */
    struct sqltvn
    {
    unsigned char *tvnvsn; 
    unsigned short tvnvsnl; 
    unsigned char *tvnnm;
    unsigned short tvnnml; 
    unsigned char *tvnsnm;
    unsigned short tvnsnml;
    };
    typedef struct sqltvn sqltvn;struct sqladts
    {
    unsigned int adtvsn; 
    unsigned short adtmode; 
    unsigned short adtnum;  
    sqltvn adttvn[1];       
    };
    typedef struct sqladts sqladts;static struct sqladts sqladt = {
    1,1,0,
    };/* Binding to PL/SQL Records */
    struct sqltdss
    {
    unsigned int tdsvsn; 
    unsigned short tdsnum; 
    unsigned char *tdsval[1]; 
    };
    typedef struct sqltdss sqltdss;
    static struct sqltdss sqltds =
    {
    1,
    0,
    };/* File name & Package Name */
    struct sqlcxp
    {
    unsigned short fillen;
    char  filnam[22];
    };
    static const struct sqlcxp sqlfpn =
    {
    21,
    "querytabspaceratio.pc"
    };
    static unsigned int sqlctx = 169167715;
    static struct sqlexd {
    unsigned int   sqlvsn;
    unsigned int   arrsiz;
    unsigned int   iters;
    unsigned int   offset;
    unsigned short selerr;
    unsigned short sqlety;
    unsigned int   occurs;
    const short *cud;
    unsigned char  *sqlest;
    const char  *stmt;
    sqladts *sqladtp;
    sqltdss *sqltdsp;
    void  **sqphsv;
    unsigned int   *sqphsl;
    int   *sqphss;
    void  **sqpind;
    int   *sqpins;
    unsigned int   *sqparm;
    unsigned int   **sqparc;
    unsigned short  *sqpadto;
    unsigned short  *sqptdso;
    unsigned int   sqlcmax;
    unsigned int   sqlcmin;
    unsigned int   sqlcincr;
    unsigned int   sqlctimeout;
    unsigned int   sqlcnowait;
    int   sqfoff;
    unsigned int   sqcmod;
    unsigned int   sqfmod;
    void  *sqhstv[4];
    unsigned int   sqhstl[4];
    int   sqhsts[4];
    void  *sqindv[4];
    int   sqinds[4];
    unsigned int   sqharm[4];
    unsigned int   *sqharc[4];
    unsigned short  sqadto[4];
    unsigned short  sqtdso[4];
    } sqlstm = {12,4};// Prototypes
    extern "C" {
    void sqlcxt (void **, unsigned int *,
    struct sqlexd *, const struct sqlcxp *);
    void sqlcx2t(void **, unsigned int *,
    struct sqlexd *, const struct sqlcxp *);
    void sqlbuft(void **, char *);
    void sqlgs2t(void **, char *);
    void sqlorat(void **, unsigned int *, void *);
    }// Forms Interface
    static const int IAPSUCC = 0;
    static const int IAPFAIL = 1403;
    static const int IAPFTL  = 535;
    extern "C" { void sqliem(char *, int *); }typedef struct { unsigned short len; unsigned char arr[1]; } VARCHAR;
    typedef struct { unsigned short len; unsigned char arr[1]; } varchar;/* cud (compilation unit data) array */
    static const short sqlcud0[] =
    {12,4130,852,0,0,
    5,0,0,1,0,0,31,25,0,0,0,0,0,1,0,
    20,0,0,2,0,0,27,38,0,0,4,4,0,1,0,1,9,0,0,1,9,0,0,1,97,0,0,1,10,0,0,
    51,0,0,3,130,0,4,47,0,0,2,1,0,1,0,2,4,0,0,1,97,0,0,
    74,0,0,4,129,0,4,53,0,0,2,1,0,1,0,2,4,0,0,1,97,0,0,
    97,0,0,5,0,0,29,64,0,0,0,0,0,1,0,
    };#define SQLCA_STORAGE_CLASS extern "C"#include <stdio.h>
    #include <stdlib.h>
    #include<string.h>
    #include <sqlca.h>
    //#include <oraca.h>
    //EXEC SQL INCLUDE SQLCA;
    /* EXEC SQL INCLUDE D:\myProgram\sqlexample\querytabspaceratio.h;
    */ 
    class QueryTabSpaceRatio
    {
    public:
    QueryTabSpaceRatio();
    ~QueryTabSpaceRatio(); void connect(); //Connect database
    float queryRatio(); // Query ratio
    void sql_error(); // Error Handler /* EXEC SQL BEGIN DECLARE SECTION; */  /* VARCHAR username[20]; */ 
    struct { unsigned short len; unsigned char arr[20]; } username; /* VARCHAR passwd[20]; */ 
    struct { unsigned short len; unsigned char arr[20]; } passwd; /* VARCHAR user_name[20]; */ 
    struct { unsigned short len; unsigned char arr[20]; } user_name; /* VARCHAR password[20]; */ 
    struct { unsigned short len; unsigned char arr[20]; } password; /* VARCHAR email[40]; */ 
    struct { unsigned short len; unsigned char arr[40]; } email; /* VARCHAR SQLSTATE[6]; */ 
    struct { unsigned short len; unsigned char arr[6]; } SQLSTATE; char db_name[20];
    char input[20];
    float m_ratio;
    float m_total;
    float m_user;
    /* EXEC SQL END DECLARE SECTION; */ };#endif //QUERYTABLESPACERATIO_H
      

  2.   

    继续补充:
    ----------------
    .cpp文件:
    #include "querytablespaceratio.h"
    QueryTabSpaceRatio::QueryTabSpaceRatio()
    {
    }QueryTabSpaceRatio::~QueryTabSpaceRatio()
    {
    }void QueryTabSpaceRatio::sql_error()
    {
    /* EXEC SQL WHENEVER SQLERROR CONTINUE; */  printf("Connect error:");
    printf("\n%.70s \n", sqlca.sqlerrm.sqlerrmc);
    /* EXEC SQL ROLLBACK WORK; */  {
    struct sqlexd sqlstm;
    sqlstm.sqlvsn = 12;
    sqlstm.arrsiz = 0;
    sqlstm.sqladtp = &sqladt;
    sqlstm.sqltdsp = &sqltds;
    sqlstm.iters = (unsigned int  )1;
    sqlstm.offset = (unsigned int  )5;
    sqlstm.cud = sqlcud0;
    sqlstm.sqlest = (unsigned char  *)&sqlca;
    sqlstm.sqlety = (unsigned short)256;
    sqlstm.occurs = (unsigned int  )0;
    sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
    }
    exit(EXIT_FAILURE);
    }void QueryTabSpaceRatio::connect()
    {
    strcpy((char*)username.arr,"ies_his");
    strcpy((char*)passwd.arr,"iesapp");
    username.len = strlen((char*)username.arr);
    passwd.len = strlen((char*)passwd.arr);
    memset(db_name,'\0',20);
    strcpy(db_name,"history");
    /* EXEC SQL WHENEVER SQLERROR DO sql_error(); */  /* EXEC SQL CONNECT:username IDENTIFIED BY:passwd USING:db_name; */  {
    struct sqlexd sqlstm;
    sqlstm.sqlvsn = 12;
    sqlstm.arrsiz = 4;
    sqlstm.sqladtp = &sqladt;
    sqlstm.sqltdsp = &sqltds;
    sqlstm.iters = (unsigned int  )10;
    sqlstm.offset = (unsigned int  )20;
    sqlstm.cud = sqlcud0;
    sqlstm.sqlest = (unsigned char  *)&sqlca;
    sqlstm.sqlety = (unsigned short)256;
    sqlstm.occurs = (unsigned int  )0;
    sqlstm.sqhstv[0] = (         void  *)&username;
    sqlstm.sqhstl[0] = (unsigned int  )22;
    sqlstm.sqhsts[0] = (         int  )22;
    sqlstm.sqindv[0] = (         void  *)0;
    sqlstm.sqinds[0] = (         int  )0;
    sqlstm.sqharm[0] = (unsigned int  )0;
    sqlstm.sqadto[0] = (unsigned short )0;
    sqlstm.sqtdso[0] = (unsigned short )0;
    sqlstm.sqhstv[1] = (         void  *)&passwd;
    sqlstm.sqhstl[1] = (unsigned int  )22;
    sqlstm.sqhsts[1] = (         int  )22;
    sqlstm.sqindv[1] = (         void  *)0;
    sqlstm.sqinds[1] = (         int  )0;
    sqlstm.sqharm[1] = (unsigned int  )0;
    sqlstm.sqadto[1] = (unsigned short )0;
    sqlstm.sqtdso[1] = (unsigned short )0;
    sqlstm.sqhstv[2] = (         void  *)db_name;
    sqlstm.sqhstl[2] = (unsigned int  )20;
    sqlstm.sqhsts[2] = (         int  )20;
    sqlstm.sqindv[2] = (         void  *)0;
    sqlstm.sqinds[2] = (         int  )0;
    sqlstm.sqharm[2] = (unsigned int  )0;
    sqlstm.sqadto[2] = (unsigned short )0;
    sqlstm.sqtdso[2] = (unsigned short )0;
    sqlstm.sqphsv = sqlstm.sqhstv;
    sqlstm.sqphsl = sqlstm.sqhstl;
    sqlstm.sqphss = sqlstm.sqhsts;
    sqlstm.sqpind = sqlstm.sqindv;
    sqlstm.sqpins = sqlstm.sqinds;
    sqlstm.sqparm = sqlstm.sqharm;
    sqlstm.sqparc = sqlstm.sqharc;
    sqlstm.sqpadto = sqlstm.sqadto;
    sqlstm.sqptdso = sqlstm.sqtdso;
    sqlstm.sqlcmax = (unsigned int )100;
    sqlstm.sqlcmin = (unsigned int )2;
    sqlstm.sqlcincr = (unsigned int )1;
    sqlstm.sqlctimeout = (unsigned int )0;
    sqlstm.sqlcnowait = (unsigned int )0;
    sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
    if (sqlca.sqlcode < 0) sql_error();
    }
    if(sqlca.sqlcode == 0)
    printf("\nConnected to ORACLE as user: %s\n", username.arr);
    else
    printf("Connected to ORACLE failed!!!!\n");
    }float QueryTabSpaceRatio::queryRatio()
    {
    /* EXEC SQL SELECT round(SUM(bytes) / 1024 / 1024) totalspace
    INTO :m_total
    FROM dba_data_files
    where tablespace_name = :("USERS")
    GROUP by tablespace_name; */  {
    struct sqlexd sqlstm;
    sqlstm.sqlvsn = 12;
    sqlstm.arrsiz = 4;
    sqlstm.sqladtp = &sqladt;
    sqlstm.sqltdsp = &sqltds;
    sqlstm.stmt = "select round(((sum(bytes)/1024)/1024)) totalspace into :b0 \
      from dba_data_files where tablespace_name=:b1 group by tablespace_name";
    sqlstm.iters = (unsigned int  )1;
    sqlstm.offset = (unsigned int  )51;
    sqlstm.selerr = (unsigned short)1;
    sqlstm.cud = sqlcud0;
    sqlstm.sqlest = (unsigned char  *)&sqlca;
    sqlstm.sqlety = (unsigned short)256;
    sqlstm.occurs = (unsigned int  )0;
    sqlstm.sqhstv[0] = (         void  *)&m_total;
    sqlstm.sqhstl[0] = (unsigned int  )sizeof(float);
    sqlstm.sqhsts[0] = (         int  )0;
    sqlstm.sqindv[0] = (         void  *)0;
    sqlstm.sqinds[0] = (         int  )0;
    sqlstm.sqharm[0] = (unsigned int  )0;
    sqlstm.sqadto[0] = (unsigned short )0;
    sqlstm.sqtdso[0] = (unsigned short )0;
    sqlstm.sqhstv[1] = (         void  *)("USERS");
    sqlstm.sqhstl[1] = (unsigned int  )0;
    sqlstm.sqhsts[1] = (         int  )0;
    sqlstm.sqindv[1] = (         void  *)0;
    sqlstm.sqinds[1] = (         int  )0;
    sqlstm.sqharm[1] = (unsigned int  )0;
    sqlstm.sqadto[1] = (unsigned short )0;
    sqlstm.sqtdso[1] = (unsigned short )0;
    sqlstm.sqphsv = sqlstm.sqhstv;
    sqlstm.sqphsl = sqlstm.sqhstl;
    sqlstm.sqphss = sqlstm.sqhsts;
    sqlstm.sqpind = sqlstm.sqindv;
    sqlstm.sqpins = sqlstm.sqinds;
    sqlstm.sqparm = sqlstm.sqharm;
    sqlstm.sqparc = sqlstm.sqharc;
    sqlstm.sqpadto = sqlstm.sqadto;
    sqlstm.sqptdso = sqlstm.sqtdso;
    sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
    if (sqlca.sqlcode < 0) sql_error();
    } /* EXEC SQL SELECT round(SUM(bytes) / 1024 / 1024) freespace
    INTO :m_user             
    FROM dba_free_space             
    WHERE tablespace_name = :("USERS")         
    GROUP BY tablespace_name; */  {
    struct sqlexd sqlstm;
    sqlstm.sqlvsn = 12;
    sqlstm.arrsiz = 4;
    sqlstm.sqladtp = &sqladt;
    sqlstm.sqltdsp = &sqltds;
    sqlstm.stmt = "select round(((sum(bytes)/1024)/1024)) freespace into :b0 \
      from dba_free_space where tablespace_name=:b1 group by tablespace_name";
    sqlstm.iters = (unsigned int  )1;
    sqlstm.offset = (unsigned int  )74;
    sqlstm.selerr = (unsigned short)1;
    sqlstm.cud = sqlcud0;
    sqlstm.sqlest = (unsigned char  *)&sqlca;
    sqlstm.sqlety = (unsigned short)256;
    sqlstm.occurs = (unsigned int  )0;
    sqlstm.sqhstv[0] = (         void  *)&m_user;
    sqlstm.sqhstl[0] = (unsigned int  )sizeof(float);
    sqlstm.sqhsts[0] = (         int  )0;
    sqlstm.sqindv[0] = (         void  *)0;
    sqlstm.sqinds[0] = (         int  )0;
    sqlstm.sqharm[0] = (unsigned int  )0;
    sqlstm.sqadto[0] = (unsigned short )0;
    sqlstm.sqtdso[0] = (unsigned short )0;
    sqlstm.sqhstv[1] = (         void  *)("USERS");
    sqlstm.sqhstl[1] = (unsigned int  )0;
    sqlstm.sqhsts[1] = (         int  )0;
    sqlstm.sqindv[1] = (         void  *)0;
    sqlstm.sqinds[1] = (         int  )0;
    sqlstm.sqharm[1] = (unsigned int  )0;
    sqlstm.sqadto[1] = (unsigned short )0;
    sqlstm.sqtdso[1] = (unsigned short )0;
    sqlstm.sqphsv = sqlstm.sqhstv;
    sqlstm.sqphsl = sqlstm.sqhstl;
    sqlstm.sqphss = sqlstm.sqhsts;
    sqlstm.sqpind = sqlstm.sqindv;
    sqlstm.sqpins = sqlstm.sqinds;
    sqlstm.sqparm = sqlstm.sqharm;
    sqlstm.sqparc = sqlstm.sqharc;
    sqlstm.sqpadto = sqlstm.sqadto;
    sqlstm.sqptdso = sqlstm.sqtdso;
    sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
    if (sqlca.sqlcode < 0) sql_error();
    } printf("total = %f\n", m_total);
    printf("user = %f\n", m_user);
    m_ratio = (1-m_total/m_user)*100;
    printf("tablespace ratio : %f\n",m_ratio); /* EXEC SQL COMMIT WORK; */  {
    struct sqlexd sqlstm;
    sqlstm.sqlvsn = 12;
    sqlstm.arrsiz = 4;
    sqlstm.sqladtp = &sqladt;
    sqlstm.sqltdsp = &sqltds;
    sqlstm.iters = (unsigned int  )1;
    sqlstm.offset = (unsigned int  )97;
    sqlstm.cud = sqlcud0;
    sqlstm.sqlest = (unsigned char  *)&sqlca;
    sqlstm.sqlety = (unsigned short)256;
    sqlstm.occurs = (unsigned int  )0;
    sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
    if (sqlca.sqlcode < 0) sql_error();
    } return m_ratio;
    }就是这些了,请看过的老师,多多指教,谢谢了!!!
      

  3.   

    这一行为什么要注释掉呢,应该需要的吧:
    //EXEC SQL INCLUDE SQLCA;