我写了一个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
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
.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
----------------
.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;
}就是这些了,请看过的老师,多多指教,谢谢了!!!
//EXEC SQL INCLUDE SQLCA;