proc + vs2005 start
1,安装oracle proc 组件
安装好后的目录主要如下:
E:\oracle\ora92\precomp --主目录
E:\oracle\ora92\precomp\admin --控制文件目录
E:\oracle\ora92\precomp\demo --demo目录
E:\oracle\ora92\precomp\doc --doc目录
E:\oracle\ora92\precomp\lib --库文件目录
E:\oracle\ora92\precomp\public --公共调用目录
程序项:
oracle--> application development --> proc c c++
2,使用proc 编译pc文件
新建一个pc文件:
#include
#include
#include
/*包含sqlca头文件*/
#include
char username[10],password[10],server[10];
void main()
{
/*
*定义输入宿主变量:接收用户名,口令和网络服务名
*/
/*char username[10],password[10],server[10];*/
/*也可以输入相关的数据库连接信息:*/
/*printf("输入用户名: ");
gets(username);
printf("输入口令: ");
gets(password);
printf("输入网络服务名: ");
gets(server);*/
/*连接到数据库*/
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR oraCN[30];
EXEC SQL END DECLARE SECTION;
strcpy(oraCN.arr,"test/test@yellow");//
oraCN.len = strlen(oraCN.arr);
oraCN.arr[oraCN.len]='\0';
EXEC SQL CONNECT :oraCN;
printf("\n [CONNECTED!]");
if (sqlca.sqlcode == 0) printf("连接成功!\n");
else /*显示连接错误*/
printf("%.*s\n",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);
printf("%.*s\n",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);
printf("按q结束");
while(getchar() == 'q')
return 0;
}
新建一个pre项目
设置proc的首选项为:生成c文件
添加pc文件到项目
然后预编译
如果成功会有绿色的勾出现,如果报错双击查看报错信息
可能会出现使用当前的控制文件后出现错误的情况
在控制文件目录下找到:
pcscfg.cfg
加入以下代码:
define=(WIN32_LEAN_AND_MEAN)
char_map=string
DYNAMIC=ANSI
mode=ANSI
parse=full
SQLCHECK=SEMANTICS
RELEASE_CURSOR=NO
HOLD_CURSOR=YES
VARCHAR=YES
include=E:\Program Files\Microsoft Visual Studio 8\VC\include
其中:
include=E:\Program Files\Microsoft Visual Studio 8\VC\include
是设置vs2005的vc运行库目录
成功的生成的c文件如下:
/* 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[50];
};
static const struct sqlcxp sqlfpn =
{
49,
"e:\\oracle\\ora92\\precomp\\test\\proc\\conn\\connect.pc"
};
static unsigned int sqlctx = 1870954357;
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};
/* SQLLIB Prototypes */
extern void sqlcxt (void **, unsigned int *,
struct sqlexd *, const struct sqlcxp *);
extern void sqlcx2t(void **, unsigned int *,
struct sqlexd *, const struct sqlcxp *);
extern void sqlbuft(void **, char *);
extern void sqlgs2t(void **, char *);
extern void sqlorat(void **, unsigned int *, void *);
/* Forms Interface */
static const int IAPSUCC = 0;
static const int IAPFAIL = 1403;
static const int IAPFTL = 535;
extern 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,4128,852,27,0,
5,0,0,1,0,0,283,31,0,0,4,4,0,1,0,1,9,0,0,1,10,0,0,1,10,0,0,1,10,0,0,
};
#include
#include
#include
/*包含sqlca头文件*/
#include
char username[10],password[10],server[10];
void main()
{
/*
*定义输入宿主变量:接收用户名,口令和网络服务名
*/
/*char username[10],password[10],server[10];*/
/*也可以输入相关的数据库连接信息:*/
/*printf("输入用户名: ");
gets(username);
printf("输入口令: ");
gets(password);
printf("输入网络服务名: ");
gets(server);*/
/*连接到数据库*/
/* EXEC SQL BEGIN DECLARE SECTION; */
/* VARCHAR oraCN[30]; */
struct { unsigned short len; unsigned char arr[30]; } oraCN;
/* EXEC SQL END DECLARE SECTION; */
strcpy(oraCN.arr,"test/test@yellow");//
oraCN.len = strlen(oraCN.arr);
oraCN.arr[oraCN.len]='\0';
/* EXEC SQL CONNECT :oraCN; */
{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 12;
sqlstm.arrsiz = 4;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )10;
sqlstm.offset = (unsigned int )5;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlstm.sqhstv[0] = ( void *)&oraCN;
sqlstm.sqhstl[0] = (unsigned int )32;
sqlstm.sqhsts[0] = ( int )32;
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.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);
}
printf("\n [CONNECTED!]");
if (sqlca.sqlcode == 0) printf("连接成功!\n");
else /*显示连接错误*/
printf("%.*s\n",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);
printf("%.*s\n",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);
printf("按q结束");
while(getchar() = 'q')
return 0;
}
然后用vs2005新建一个32位的控制台项目
将c代码复制到项目下,添加到工程
直接编译,应该会报错:
找不到sqlca.h
等错误
解决步骤:
1,将c文件重命名为.cpp文件,编译后依然报错,
如果提示找不到文件头,找到c文件中的 #include 修改为 #include "sqlca.h"
2,项目属性 --> 配置属性 -->c/c++ --> 预编译头 --> 创建/使用预编译头 -->选择不使用预编译头
3,项目属性 --> 配置属性 -->链接器 --> 附加目录库 -->
添加oracle proc的lib目录,如:
E:\oracle\ora92\precomp\lib;E:\oracle\ora92\precomp\lib\msvc;E:\oracle\ora92\precomp\public
4,选择要编译的cpp文件,右键属性 --> 配置属性 --> c/c++ -->高级 -->编译为:编译为c代码(/TC)
5,编译文件,查看信息,如果报错,则查看代码,上述代码中可能会报错:
大致是说找不到struct的定义,将struct { unsigned short len; unsigned char arr[30]; } oraCN;
放在合适的地方就可以了。
ok,完成。
-----------------------
在windowsxp,oracle 9i,vs2005下完成。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16179598/viewspace-611219/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/16179598/viewspace-611219/