一个例子

原创 2001年06月18日 23:59:00

一个例子

这一章,我们要把我们已学的知识集合起来。具体来讲,我们来写一个使用ODBC APIs的程序.为简单起见,这个程序中我使用Microsoft的Access数据库(Microsoft Access 97) .

下载例子源程序.

注意:如果你使用的windows.inc 是1.18及其以下版本,在开始编译之前要修改其中的一个小bug.在windows.inc中查找 "SQL_NULL_HANDLE",将得到下面这行:

SQL_NULL_HANDLE equ 0L

将0后面的"L"删除,象这样:

SQL_NULL_HANDLE equ 0

这个程序是一个基于对话框的程序,有一个简单的菜单.当用户选择"connect"时,它将试图连接test.mdb数据库,如果连接成功,将显示由ODBC驱动程序返回的完整连接字符串.接下来,用户可选择"View All Records"命令,程序会使用listview control来显示数据库中的所有数据.用户还可以选择"Query"命令来查询特定的记录.例子程序将会显示一个小对话框提示用户输入想找的人名.当用户按下OK钮或回车键,程序将执行一个查询来查找符合条件的记录.当用户完成对数据库的操作时,可以选择"disconnect"命令与数据库断开连接.

现在看一下源程序:


分析

当程序开始时,将获得实例句柄并获得所在路径.默认情况下数据库 test.mdb应与程序处于同一文件夹.

 

GetProgramPath调用GetModuleFileName来获得程序的全路径名.接着在路径中查找最后一个"/"符",通过将文件名的第一个字符置为0获得(truncate)" 文件名. 因此我们在ProgPath中获得了程序的路径名.

然后程序将用DialogBoxParam显示主对话框.当主对话框第一次被载入时,它将获得菜单句柄和listview control句柄.接下来在listview control中插入三列(因为我们已经知道结果集将包含三列.因为是我们先建的表.)

现在,它就等待用户的动作了.如果用户在菜单中选择"connect",将会调用ODBCConnect函数.


它做的第一件事是调用SQLAllocHandle来分配一个环境句柄.


获得环境句柄后,程序调用SQLSetEnvAttr来表示将要使用ODBC 3.x的语法.


如果一切顺利,程序将通过调用SQLAllocHandle获得连接句柄来实现连接.


接着填写连接字符串.完整的连接字符串将被用在ConnectionString


当连接字符串完成,程序将调用SQLDriverConnect来通过MS Access ODBC 驱动程序连接test.mdb数据库.如果文件test.mdb不存在,ODBC driver将提示用户输入该文件的位置,因为我们已经设定了SQL_DRIVER_COMPLETE标志.当SQLDriverConnect成功返回时, Conn 被填入由ODBC驱动程序创建的完整连接字符串.我们通过一个message box来将其显示给用户. SwitchMenuState是一个单纯切换菜单选项可用的函数.

现在,到数据库的连接已经建立并被打开,并一直保持打开状态直到用户选择关闭.

当用户选择了"View All Records"命令, 对话框过程将调用RunQuery.函数


由于listview control在创建时是不可见的,现在我们把它显示出来.还有 要把其中的所有元素(如果有的话)删掉.


接下来,程序将获得一个语句句柄.


通过 SQLExecDirect执行已准备好的SQL语句.我这里选择SQLExecDirect 的原因是只须执行一次.


执行SQL语句后,将返回一个结果集.我们使用 FillData函数来从结果集中解出数据并将其放入listview control中.


现在,结果集被返回.我们要绑定结果集的所有三列到我们提供的缓冲区中.这是调用SQLBindCol来实现的.注意我们要对每一列分别调用.并且我们并不需要绑定所有的列:只要绑定要获得数据的列就行了.


当列中没有数据时,我们初始化缓冲区为NULLs.更好的方法是用SQLBindCol指定的变量中数据的长度.在我们的例子中,我们可以检查NameLength, SurnameLengthTelNoLength中的值的确切长度.


其它都很简单了.调用SQLFetch 来获得结果集的一行,并将其存入listview control的缓冲区中.当没有更多的行供检索时(已到达文件尾), SQLFetch返回SQL_NO_DATA并且程序跳出循环.


当完成对结果集的操作时,调用SQLCloseCursor关闭结果集并调用SQLFreeHandle释放语句句柄.

当用户选择"Query"命令,程序显示另一个对话框供用户输入要查询的名字.


对话框做的第一件事是显示listview control.接下来分配一个语句句柄以创建SQL语句.这个SQL语句有一个"where"子句及一个参数标志符"?". 完整的SQL语句是:

select * from main where name=?

接着程序调用SQLBindParameter 来建立参数标志符与缓冲区SearchName的连接,这样当SQL语句被执行时,ODBC驱动程序就可从SearchName中获得需要的字符串.接下来,程序调用SQLPrepare来编译SQL语句. 这样我们只要准备/编译SQL语句一次就可多次使用.因为SQL语句已被编译过,接下来的执行过程会快一些.


当用户在编辑框(edit control)中填入了一些名字并按下回车键, 程序将获得编辑框中的文本并检查是否是空字符串.如果是,则显示一个message box并将键盘焦点设在编辑框上,提示用户输入名字.


如果编辑框中已有字符串,程序会获得它的长度并将其放入StrLen中供ODBC驱动程序使用(记住我们已将StrLen的地址传送给了SQLBindParameter). 接下来程序使用获得的语句句柄调用SQLExecute执行已准备好的SQL语句.当 SQLExecute返回时,程序调用FillData在listview control显示结果.因为我们不会再用到结果集,调用SQLCloseCursor来关闭它.

Java一个简单的死锁例子

内容:一个简单的死锁例子,大概的思路:两个线程A和B,两把锁X和Y,现在A先拿到锁X,然后sleep()一段时间,我们知道sleep()是不会释放锁资源的。然后如果这段时间线程B拿到锁Y,也sleep...
  • u011345136
  • u011345136
  • 2015年05月16日 20:07
  • 1787

写一个Singleton模式的例子

public class Singleton{  private static Singleton single = new Singleton();  private Singleton(){}  ...
  • owenliu563
  • owenliu563
  • 2014年03月08日 13:18
  • 932

关于数据库查询优化的一个例子(责任中心例子)

CREATE OR REPLACE FUNCTION "GET_EMPCENTER"(PI_EMPOID     Number,                                    ...
  • shuifeiru
  • shuifeiru
  • 2011年02月24日 14:36
  • 400

工厂模式的简单例子

当A对象需要调用B对象的方法是,许多初学者会选择使用new关键字来创建一个B实例,然后调用B实例的方法。从语法角度来看,这种做法没有任何问题,这种做法的坏处在于:A类的方法实现直接调用了B类的类名(这...
  • lishaojun0115
  • lishaojun0115
  • 2016年02月26日 14:17
  • 522

JAVA的单例模式(用java写一个singleton的例子)。

代码如下: package test; public class SingleObject { // 创建 SingleObject 的一个对象 private static ...
  • suyu_yuan
  • suyu_yuan
  • 2016年08月18日 12:58
  • 3313

[Oracle]Plsql的一个例子

CREATE OR REPLACE PROCEDURE PROCSAMPLE IS BEGIN  DELETE TABLESAMPLE   WHERE KEY1 NOT IN     (SELECT ...
  • delicioussmoke
  • delicioussmoke
  • 2006年01月05日 17:01
  • 662

举个例子解释下什么是线程不安全?

答:上厕所的时候,厕门不关,多个人进同一个坑,一个人还没完,另一个人就进去了 什么是线程同步? 答:给厕所加一把锁,所有人有序的上厕所 什么是死锁呢? 答:有个人进去把门锁了,不知道为...
  • xpp1993
  • xpp1993
  • 2013年09月04日 11:36
  • 1109

一个单例模式的简单例子

ex1: public class Singleton    {        private static final Singleton singleton = null;           p...
  • silence1214
  • silence1214
  • 2009年03月29日 14:56
  • 23535

shell编程例子 -- 一个makefile例子

unix.mkf ======== #=============================================================================# # ...
  • Chendy
  • Chendy
  • 2008年03月25日 10:29
  • 669

Android popupWindow一个小例子

效果如图所示,点击开始按钮,popWindow从下往上出来,再点击popWindow外面,popWindow又从上往下消失 可以看出来,上面的popupWindow是半透明的,后面我会细...
  • qq_25835645
  • qq_25835645
  • 2015年09月19日 18:58
  • 696
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个例子
举报原因:
原因补充:

(最多只允许输入30个字)