一个好用的ODBC数据库类CMYODBC

一、引言

感觉MFC的CRecordset类不是很好用,因为我们要想使用的话必须为每个查询从CRecordset类派生出一个新类,或者进行动态数据交换。在VC知识库第六期上面有一篇介绍"单独使用CRecordset"文章,可是上面的CRecordset打开方式只能使用CRecordset::forwardOnly,游标只能向前滚动,而且用这种方式,你根本无法从打开的记录集中获得本次查询得到了有多少列。有一次在应用的时候,我只好通过捕获CRecordset::GetFieldValue()的异常来得到查询的结果有多少列。为了使用的方便,我自己写了一个数据库类CMYODBC,它是用ODBC API写的,它支持各种sql语句,支持事务处理。它最好的地方在于,对于查询的记录集实现了动态绑定,这是通过类CODBCSet来实现的。要说明的是,这两个类可以说比较简单,两个类的代码量很少,所以建议感兴趣的朋友看一下它的代码,下图是本代码运行效果图:

二、原理

其实无论是使用ODBC API还是使用ORACLE的OCI(对于ORACLE的OCI感兴趣的朋友,欢迎一起探讨,OCI的功能很强大,支持动态绑定,支持pl/sql,它的类的封装和CMYODBC很相似,用它来代替ODBC编程,可以解决ODBC的效率问题)其过程都很相似,一般分为以下几个过程:

1 初始化工作环境

2 连接数据源

3 操作数据源

4 检索结果集

5 更新结果集

6 事务处理

7 断开连接,释放各种句柄

大家都知道在使用CDatabase时候,如果要执行的是select语句的话,那么要通过CRecordset来检索结果集,而CRecordset类要我们先选择表等来先进行绑定,这样我们使用的时候很不方便,其实我们根本不需要这样做,而且我们也不需要知道这次执行的是关于那个数据库那张表的sql语句,因为在执行完SQLExecDirect()后,可以通过调用SQLNumResultCols() 、SQLColAttribute()等函数来获得执行的结果的很多属性,如这次执行的结果集是多少列、每列的字段名、列的类型等,然后根据类型可以动态分配内存,然后在用这些内存去绑定,最后能过SQLFetch()来得到结果集。在CMYODBC这个类里是通过CODBCSet类应用上面的原理来实现自动绑定的。

下面介绍一下类CMYODBC的使用方法:

1  通过调用ConnectDB(const char *cpServerName, const char *cpUserName, const char *cpPassword)函数来联接数据库。其中的参数意义如下:

cpServerName-----ODBC数据源名

cpUserName-------用户名

cpPassword-----口令

2  通过调用ExeSqlDirect(const char *cpSqlStmt)函数可以执行一些操作数据源的语句,如修改、删除语句等。其中的参数意义如下: cpSqlStmt------你要执行的sql语句,如delete from emp where deptno < 20

3  如果要执行事务的话,调用ExecTrans(CStringList &strSqlList)函数,其中的参数 strSqlList表示你要执行的一系列sql语句。

4 如果要执行select语句的话,通过下面的步骤:

I 声明一个CODBCSet 对象,如 CODBCSet rSet;

II然后调用函数PrepareSql(const char *cpSql, CODBCSet &rset),其中的参数的意义如下:

cpSql----代表要执行的select语句

rset-----表示一个CODBCSet的引用,你要把上面声明的对象传递进去。

III调用FetchData()函数来取得结果集。

5 通过调用函数DisConnect()断开和数据源的连接。

时间: 2025-01-20 09:37:56

一个好用的ODBC数据库类CMYODBC的相关文章

MySQL数据库SQL语句的C++ ODBC接口类测试结果 (转载)

c++|mysql|odbc|数据|数据库|语句 发信人: engineer (剑胆琴心~还是得走,sigh...), 信区: Linux 标  题: MySQL数据库SQL语句的C++ ODBC接口类测试结果 (转载) 发信站: BBS 水木清华站 (Mon Aug  9 18:03:47 1999)   [ 以下文字转载自 Database 讨论区 ] [ 原文由 engineer 所发表 ]         MySql数据库SQL语句的C++ ODBC接口类测试结果            

对《一个完善的ODBC数据库程序》一文的补充

编者注:本文是作者对不久前发布的一篇文章的补充,在阅读本文之前,最好先看一下原来的文章:"一个完善的ODBC数据库程序". 从方便用户的角度考虑,应该在程序中采用动态创建数据源.经过编者的提醒,我查找了一些资料,还好最终实现了.代码如下: int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; //取的数据库的路

codeigniter自带数据库类使用方法说明

 在 CodeIgniter 中,使用数据库是非常频繁的事情.你可以使用框架自带的数据库类,就能便捷地进行数据库操作 初始化数据库类   依据你的数据库配置载入并初始化数据库类:   代码如下: this->load->database();     被载入之后你可以在任何地方使用它.   以对象形式返回查询结果    代码如下: $query = $this->db->query('SELECT name, title, email FROM my_table');   fore

codeigniter自带数据库类使用方法说明_php实例

初始化数据库类 依据你的数据库配置载入并初始化数据库类: 复制代码 代码如下: this->load->database(); 被载入之后你可以在任何地方使用它. 以对象形式返回查询结果 复制代码 代码如下: $query = $this->db->query('SELECT name, title, email FROM my_table'); foreach ($query->result() as $row){    echo $row->title;    ec

html-本人菜鸟一枚,请教大神一个关于CSS中ID和类选择器不能用,而标签选择器能用的问题

问题描述 本人菜鸟一枚,请教大神一个关于CSS中ID和类选择器不能用,而标签选择器能用的问题 FIREFOX浏览器,代码如下: HTML代码片段: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> @import url(template/default/styl

php---数据库类封装

为了节省以后的时间,今天封装了操作sql语句的一个类,在此保存起来,方面以后使用. 这个类的文件名:SqlTool.class.php 主要有dql和dml两个函数 看下面的源码" <?php class SqlTool{ private $conn; private $username="root"; private $password="1234"; private $host="127.0.0.1"; private $db

ASP的数据库类

数据|数据库 ASP的数据库类 一.前言 提到ASP操作数据库,大多数人会想到:共用的连接字串ConStr.Conn.Open ConStr建立数据库连接.Conn.Execute SqlCmd方式执行命令.RecordSet.Open Sql,Conn,1,1取得记录集,的确这种方法被99%的人或公司采用.对于操作数据库过程中产生的错误,恐怕99%的人不会进行处理,要么在程序的开头加入on error resume next"轻松"跳过去.要么让错误信息连同错误代码一同"暴

MySQL数据库类的定义

俗话说"好的开始是成功的一半",而PHP+MySQL项目中数据库的操作是重点之一,能否简化数据库操作程序的编写,就成了影响工作效率的关键之一. 所以小阳并不是一开始就做页面,而是先建立一个"dbclass.php"文件,开始编写操作MySQL数据库的类"dbClass".即在"dbclass.php"中编写以下程序: $db_username="myusername"; //连接数据库的用户名 $db_pa

php备份数据库类分享

 php备份数据库类分享 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82