Pro*C编程初步 + 栽在了一个非常简单的问题上
2008-12-19 20:57
281 查看
搞了好长时间,总算编译过去了……
Pro*C程序好像就是用C语言来操作ORACLE数据库的程序(有待考证;-) )
Pro*C程序一般是以pc为后缀的,ORACLE也提供了预编译程序,可以将这些SQL语句之类的都预编译成C或C++程序,然后再编译相应的C/C++程序,生成可执行文件
要将pc编译成cpp文件,要使用proc程序:
它的命令用法如下:
proc iname=filename [Option_name1=vatue1 Option_name2=vatue2....]
如:pc文件名为dbop.pc
编译为CPP的命令为:
proc iname=dbop.pc oname=dbop.cpp code=cpp ltype=none
它后面的选项的意思分别为:
iname: 输入项名字
oname:输出项名字
code=cpp : 表示编译成C++程序,此项还可以是Ansi_c, Kr_c
ltype=none : 表示不生成中间的lst文件
proc的可选项还很多,如include、sqlcheck、threads等
如果没有语法错误,就已经生成了cpp文件
此时就像编译平常的c++程序了,不过要加上一些特定的库,否则会出现某些东西未定义的错误
用g++编译的命令如下:
g++ -g -Wall -L ORACLE_HOME/lib -l clntsh dbop.cpp -o dbop
此时就生成了dbop可执行程序
./dbop就可以运行了
下面是一个简单的makefile文件
NAME=dbop
PC=$(NAME).pc
CPP=$(NAME).cpp
PROC_FLAG=code=cpp ltype=none
CC_FLAG=-g -Wall -L ${ORACLE_HOME}/lib -l clntsh
$(NAME): $(CPP)
g++ $(CC_FLAG) $(CPP) -o $(NAME)
$(CPP): $(PC)
proc $(PROC_FLAG) iname=$(PC) oname=$(CPP)
clean:
rm -f *.cpp
我现在也是仅仅编译过了,数据库连接的时候总是出错,有待继续……
不过今天早上发现了有史以来最大的一个盲区……,绝对的盲区~~~
要设置某对话框上按钮的背景图,所以,想响应WM_CTLCOLORBTN,以前还没用过,只知道接到这个消息的时候,返回Brush就行,而且此时控件必须为自绘才行
但画出来之后,背景是改变了,但是文字的后面不是透明的,文字仍然是放在了一块白色的方块上,太难看了~~~
我明明用SetBkMode来设置了呀,怎么会不行呢?
开始我还以为自绘的按钮比较特别,可能不能这样用,但后来仍然没能解决~
但我仍坚信代码没有问题,即使是调试,都不知道往哪儿调……
但后来一步一步走下去,才终于发现,这么一个简单的问题,我竟然一直都不知道,好像也没在哪儿见到过……
我的代码是这样的:
switch(wParam)
{
SetBkMode(...);
case IDC_BEGIN:
DoSomething(...);
break;
case IDC_STOP:
DoOtherthings(...);
break;
}
我一直坚信代码会顺序往下执行,SetBkMode会正常执行,然后再在下一句判断wParam的值,而且我即使调试的时候也是直接在case后面下断点,也不知道SetBkMode执行没。
后来我把断点下在了switch外面,然后单步走,才发现,根本就不会执行SetBkMode,这才发现问题!!!
昨天晚上还有同学问我一个关于switch的简单问题,我给他说肯定×××,口气好像是说,怎么如此简单的问题都要问一下
但今天早上解决的这个问题却出在了这儿,其实这个问题也是在昨天晚上碰到的,当时没能解决,今天早上才解决,发现之后,当时就感觉眩晕~~~
估计编译器把switch语句汇编成如下的形式了
mov eax, wParam
cmp eax, IDC_BEGIN
jz lab1
cmp eax, IDC_STOP
jz lab2
jmp lab3 ;default
invoke SetBkMode, ,
lab1:
........
jmp lab4
lab2:
......
jmp lab4
lab3:
......
lab4:
……
以上代码纯属猜测,我的人脑编译出来的,非常不可靠 ;-)
我记得以前从来没有见到过呀,好像以前学C语言的时候也没在书上看到过,自认为很简单的一个问题,没想到就裁到这上面了。
呵呵,一个简单的问题,我竟然长篇大论的乱讲一通,不过,我以前确实不知道……
Pro*C程序好像就是用C语言来操作ORACLE数据库的程序(有待考证;-) )
Pro*C程序一般是以pc为后缀的,ORACLE也提供了预编译程序,可以将这些SQL语句之类的都预编译成C或C++程序,然后再编译相应的C/C++程序,生成可执行文件
要将pc编译成cpp文件,要使用proc程序:
它的命令用法如下:
proc iname=filename [Option_name1=vatue1 Option_name2=vatue2....]
如:pc文件名为dbop.pc
编译为CPP的命令为:
proc iname=dbop.pc oname=dbop.cpp code=cpp ltype=none
它后面的选项的意思分别为:
iname: 输入项名字
oname:输出项名字
code=cpp : 表示编译成C++程序,此项还可以是Ansi_c, Kr_c
ltype=none : 表示不生成中间的lst文件
proc的可选项还很多,如include、sqlcheck、threads等
如果没有语法错误,就已经生成了cpp文件
此时就像编译平常的c++程序了,不过要加上一些特定的库,否则会出现某些东西未定义的错误
用g++编译的命令如下:
g++ -g -Wall -L ORACLE_HOME/lib -l clntsh dbop.cpp -o dbop
此时就生成了dbop可执行程序
./dbop就可以运行了
下面是一个简单的makefile文件
NAME=dbop
PC=$(NAME).pc
CPP=$(NAME).cpp
PROC_FLAG=code=cpp ltype=none
CC_FLAG=-g -Wall -L ${ORACLE_HOME}/lib -l clntsh
$(NAME): $(CPP)
g++ $(CC_FLAG) $(CPP) -o $(NAME)
$(CPP): $(PC)
proc $(PROC_FLAG) iname=$(PC) oname=$(CPP)
clean:
rm -f *.cpp
我现在也是仅仅编译过了,数据库连接的时候总是出错,有待继续……
不过今天早上发现了有史以来最大的一个盲区……,绝对的盲区~~~
要设置某对话框上按钮的背景图,所以,想响应WM_CTLCOLORBTN,以前还没用过,只知道接到这个消息的时候,返回Brush就行,而且此时控件必须为自绘才行
但画出来之后,背景是改变了,但是文字的后面不是透明的,文字仍然是放在了一块白色的方块上,太难看了~~~
我明明用SetBkMode来设置了呀,怎么会不行呢?
开始我还以为自绘的按钮比较特别,可能不能这样用,但后来仍然没能解决~
但我仍坚信代码没有问题,即使是调试,都不知道往哪儿调……
但后来一步一步走下去,才终于发现,这么一个简单的问题,我竟然一直都不知道,好像也没在哪儿见到过……
我的代码是这样的:
switch(wParam)
{
SetBkMode(...);
case IDC_BEGIN:
DoSomething(...);
break;
case IDC_STOP:
DoOtherthings(...);
break;
}
我一直坚信代码会顺序往下执行,SetBkMode会正常执行,然后再在下一句判断wParam的值,而且我即使调试的时候也是直接在case后面下断点,也不知道SetBkMode执行没。
后来我把断点下在了switch外面,然后单步走,才发现,根本就不会执行SetBkMode,这才发现问题!!!
昨天晚上还有同学问我一个关于switch的简单问题,我给他说肯定×××,口气好像是说,怎么如此简单的问题都要问一下
但今天早上解决的这个问题却出在了这儿,其实这个问题也是在昨天晚上碰到的,当时没能解决,今天早上才解决,发现之后,当时就感觉眩晕~~~
估计编译器把switch语句汇编成如下的形式了
mov eax, wParam
cmp eax, IDC_BEGIN
jz lab1
cmp eax, IDC_STOP
jz lab2
jmp lab3 ;default
invoke SetBkMode, ,
lab1:
........
jmp lab4
lab2:
......
jmp lab4
lab3:
......
lab4:
……
以上代码纯属猜测,我的人脑编译出来的,非常不可靠 ;-)
我记得以前从来没有见到过呀,好像以前学C语言的时候也没在书上看到过,自认为很简单的一个问题,没想到就裁到这上面了。
呵呵,一个简单的问题,我竟然长篇大论的乱讲一通,不过,我以前确实不知道……
相关文章推荐
- [VB.NET]一个简单的编程问题
- 发一个非常简单的效果,是在浏览器里面上下左右都居中的问题
- 《解决问题1000.1》又是I2C驱动问题,产品应用上一个问题,非常简单,也比较典型,记录一下
- 大家都知道π=3.1415926……无穷多位, 历史上很多人都在计算这个数, 一直认为是一个非常复杂的问题。现在有了电脑, 这个问题就简单了。
- Spring @Async配置4. 基于@Async无返回值调用 使用的方式非常简单,一个标注即可解决所有的问题: 1 @Async //标注使用 2 public void asyncMe
- 一个非常有趣的QTcpServer多线程编程问题
- 一个简单的计算器,在此编程当中不断的制造和解决问题;
- 项目中一个简单SQL查询问题,已经解决了,留个纪念,非常感谢帮我的朋友们。
- 一个简单的问题
- TensorFlow练习1: 编程实现一个简单的CNN, Convolutional Neural Networks
- 对"一个非常难的查询问题(部门上下级的关系)"之解答的完善
- 编程乱码问题初步探索
- 高性能网络编程(二):上一个10年,著名的C10K并发连接问题
- 一个简单问题引起的对话
- Java Socket编程,一个完整的简单通信示例
- C#串口编程问题:一个测试数据怎么拆分成2个字符串,做了2次发送?
- 由一个简单的String c=a+b的Java问题引发一点想法
- opencv学习(6) 一个非常简单的图像均值模糊程序
- 对"一个非常难的查询问题(部门上下级的关系)"之解答的
- 问一个简单的问题