WEB开发网
开发学院软件开发VC 一个好用的ODBC数据库类CMYODBC 阅读

一个好用的ODBC数据库类CMYODBC

 2008-04-19 20:27:59 来源:WEB开发网   
核心提示:一、引言感觉MFC的CRecordset类不是很好用,因为我们要想使用的话必须为每个查询从CRecordset类派生出一个新类,一个好用的ODBC数据库类CMYODBC,或者进行动态数据交换,在VC知识库第六期上面有一篇介绍"单独使用CRecordset"文章,你要把上面声明的对象传递进去,III调

一、引言

感觉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()断开和数据源的连接。

1 2  下一页

Tags:一个 好用 ODBC

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接