【第一步】在Windows下编辑一个.pc程序(Pro*C源程序,作者用到:C:\proctest\exam1.pc),其内容如下:

  1. #include <stdio.h>
  2. #include <string.h>
  3. EXEC SQL INCLUDE SQLCA;
  4. int main()
  5. {
  6. /*declare variables*/
  7. EXEC SQL BEGIN DECLARE SECTION;
  8. VARCHAR usr[20], pass[20], serv[20];
  9. char name[8];
  10. int age;
  11. EXEC SQL END DECLARE SECTION;
  12. /*connect DB*/
  13. strcpy(usr.arr,"any3");
  14. usr.len=(unsigned short)strlen((char *)usr.arr);
  15. strcpy(pass.arr,"any3");
  16. pass.len=(unsigned short)strlen((char *)pass.arr);
  17. strcpy(serv.arr,"ORCL");
  18. serv.len=(unsigned short)strlen((char *)serv.arr);
  19. /*Connecting DB Command*/
  20. EXEC SQL CONNECT :usr IDENTIFIED BY :pass USING :serv;
  21. printf("Connect!\n");
  22. /*Input*/
  23. printf("Input Member Age:");
  24. scanf("%d", &age);
  25. /*Exec SQL*/
  26. EXEC SQL SELECT age, name into :age, :name from family_lu where age=:age;
  27. printf("Name=%s    ,Age=%d\n", name, age);
  28. /*commit and disconnect DB*/
  29. EXEC SQL COMMIT WORK RELEASE;
  30. printf("Disconnect!\n");
  31. return 1;
  32. }

作者机器上使用到的oracle实例ORCL,并以用户名/密码(any3/any3)登陆。

为示例,作者建立测试数据表 family_lu ,其结构明细为:

CREATE TABLE family_lu
(
       age   number,
       name  varchar2(20),
       reltn varchar2(20)          
);

插入数据:

insert into family_lu values(0, 'anan', 'child');

【第二步】在Windows下使用Oracle数据库的...\bin\Proc.exe预编译该.pc文件,生成对应的.c源程序。

【建议一】

注意到安装Oracle时已经将“D:\oracle\product\10.2.0\db_1\bin;”自动添加到“系统环境变量->系统变量->Path”中,因此,在“开始->运行->cmd”回车后,直接进入到.pc文件所在路径,输入proc命令。

如本人Win7系统下为:

C:\Users\Administrator>cd ../../proctest

然后输入命令:proc exam1.pc

【第三步】使用Windows下的gcc编译器对上述.c源文件进行编译,并生成windows下的可执行文件。

注意到这里是最容易报错(非犯错)的地方!!!

【建议二】使用最新的gcc编译器。

对于较低版本的gcc,对于这一段源程序

usr.len=(unsigned short)strlen((char *)usr.arr);

编译会报错:

invalid conversion from `const char*' to `char*'

而升级到最新编译器则不存在此问题

——当然也可能是编码时语法不严谨导致,但无论如何,最新的编译器可用性更好,并且向下兼容。

作者机器上安装了JFE and GCC,它自动被添加到了“系统环境变量->系统变量->Path”中,但其版本较低。

这里手动将“D:\Program Files\CodeBlocks\MinGW\bin;”添加到“系统环境变量->系统变量->Path”的最前方(注意MinGW已经安装在本机上,为作者安装CodeBlocks时自带),即对于同名的gcc编译器,希望调用Path中靠前的那一个。MinGW的GCC编译器版本为4.7.1。

【建议三】使用正确的库文件

对于.pc源程序中有SQL(DB连接、数据查询等)相关代码的,在Pro*C将.pc转化为.c时,会自动在.c文件中声明并引用

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 *);

等相关函数,因为在简单的Pro*C编程示例中,在.pc预编译成.c文件后,多数情况下都只使用了sqlcxt函数(而未使用sqlbuft等),因此,gcc在编译.c时将报错:

undefined reference to `sqlcxt(void**, unsigned*, sqlexd*, sqlcxp const*)'

这是由于gcc在编译时未加入Pro*C指定的库文件(静态库.lib或动态连接库.dll),该库包括了sqlcxt的定义。

由于Pro*C广泛应用于Linux+Oracle环境,因此在多数博客文章或论坛发帖中,常见到:

////////////引用部分开始////////////

需要用到$ORACLE_HOME/lib/libclntsh.so
故需加上 -L $ORACLE_HOME/lib -l clntsh
更正后的命令为:
gcc -o test test.c -I /home/oracle/oracle/product/10.2.0/db_1/precomp/public -L $ORACLE_HOME/lib -l clntsh

////////////引用部分结束////////////LINK: http://blog.chinaunix.net/uid-261392-id-2138943.html

在百度中搜索关键字“windows libclntsh”,非常好运地找到了《OCI Instant Client》 LINK:http://www.cnblogs.com/freewater/archive/2011/08/09/2132801.html

作者找到Linux和Unix下的libclntsh.so.11.1(.so是Linux等下的动态连接库),正好对应于Windows下的oci.dll。

最后,在《gcc编译dll和调用dll》一文中

LINK:http://blog.csdn.net/denglei265/article/details/3889470

找到调用.dll库文件生成windows下可执行文件的(简单)方法,如作者使用命令:

C:\proctest>gcc exam1.c D:\oracle\product\10.2.0\db_1\BIN\oci.dll -o exam1

成功生成可执行文件,运行之得到效果:

C:\proctest>exam1
Connect!
Input Member Age:0
Name=anan       ,Age=0
Disconnect!

而这恰好是本文Pro*C程序示例希望实现的效果!

Pro*C编程研究一:从.pc到.exe的更多相关文章

  1. 近中期3D编程研究目标

    近几年一直在用业余时间研究3D编程,研究的中期目标是建立一个实用的开源3D编程框架.3D编程技术最直接的应用是开发游戏,所以3D编程框架也就是3D游戏开发框架.在我看来,游戏是否好玩的关键是能否为玩家 ...

  2. USB编程研究之二(常见设备类型的GUID)

    在USB编程之前要事先了解一下GUID的概念. 应用其他网页中的定义: 全球唯一标识符 (GUID) 是一个字母数字标识符,用于指示产品的唯一性安装.在许多流行软件应用程序(例如 Web 浏览器和媒体 ...

  3. macbook pro retina 编程字体推荐

    使用VS2010.VS2012.Qt Creator编译工具首推等宽字体,等宽字体中consolas. 首先大家都知道等宽对于编码来说的直观性不言而喻,其次retina屏幕的特殊性,整天用特别小的字体 ...

  4. Autofac的AOP面向切面编程研究

    *:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...

  5. C#异步编程研究学习(一)

    可以使用Func<T>或者Action<T>简单实现如: Func<string, string,string,string, int> func = new Fu ...

  6. GDI+与图形编程研究

    GDI+的基本概念 GDI+的常用对象,包括Graphics.Font.Brush.Pen等对象的创建和使用 常用图形的绘制 Color结构.Point结构和Rectangle结构 1.GDI+的概念 ...

  7. 关于用C-free进行C语言编程在电脑中生成的.exe和.o文件

    在使用C-free进行C语言编程时,程序运行后会自动在电脑文件中生成以.exe和.o为后缀名的文件: 1,生成的.exe文件为系统自动打包完成的应用程序,该程序可直接在其他无C-free环境的电脑上运 ...

  8. IDA,IDA PRO 产品介绍

    IDA理念这是我们在开发产品时竭尽全力遵循的理念--在此过程中,我们相信我们将开发出能够为您带来所需的可靠性.便利性和易用性的软件.没有什么能打败人脑因为我们知道一秒钟的洞察力仍然胜过百年的处理时间, ...

  9. 十年学会编程 著者: Peter Norvig 翻译: Dai Yuwen

    为何人人都这么着急? 信步走进任何一家书店,你会看到名为<如何在7天内学会Java>的书,还有各 种各样类似的书: 在几天内或几小时内学会Visual Basic, Windows, In ...

随机推荐

  1. 【Salesforce】入门篇

    Salesforce.com 一开始是一个云端的销售自动化(Sales Force Automation, SFA)以及客户关系管理工具(Customer Relationship Managemen ...

  2. vulnhub攻略

    https://www.vulnhub.com/entry/21ltr-scene-1,3/ 这个靶机国内https://www.cnblogs.com/hack404/p/11423228.html ...

  3. 3.Redis数据类型

    Redis的五大数据类型: 1.string(字符串) string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value. string类型是二进制安 ...

  4. sklearn特征工程

    目录 一.    特征工程是什么?    2 ①特征使用方案    3 ②特征获取方案    4 ③特征处理    4 1.    特征清洗    4 2.    数据预处理    4 3.    特 ...

  5. Window脚本学习笔记之BAT调用设置

    用一句bat脚本调用window的系统设置: rem 调用回收站 explorer.exe ::{645FF040-5081-101B-9F08-00AA002F954E} rem 检查Windows ...

  6. Java锁--LockSupport

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3505784.html LockSupport介绍 LockSupport是用来创建锁和其他同步类的基本线 ...

  7. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡 (高斯消元)

    题面 题目传送门 分析 令爆炸概率为PPP.设 f(i)=∑k=0∞pk(i)\large f(i)=\sum_{k=0}^{\infty}p_k(i)f(i)=∑k=0∞​pk​(i),pk(i)p ...

  8. 2019ICPC区域赛(银川)总结

    2019ICPC银川 作为第一次打区域赛的我,心情异常激动,加上学校给坐飞机(事实上赶飞机很痛苦). 热身赛很难受,oj上不去,写AC自动机输入没写好.. 现场赛,开场直觉倒着看,发现签到.然后看B, ...

  9. Appium自动化测试教程-自学网-monkey简介

    Monkey简介 在Android的官方自动化测试领域有一只非常著名的“猴子”叫Monkey,这只“猴子”一旦启动,就会让被测的Android应用程序像猴子一样活蹦乱跳,到处乱跑.人们常用这只“猴子” ...

  10. Catalan Number-卡特兰数入门

    卡特兰数 首先,我们设f(n)=序列个数为n的出栈序列种数.同时,我们假定,从开始到栈第一次出到空为止,这段过程中第一个出栈的序数是k.特别地,如果栈直到整个过程结束时才空,则k=n. 令h(0)=1 ...