/*-- 专项技术学习 -数据库访问技术之ODBC API 这个类 通过ODBC API 函数访问ODBC 数据源的数据表 功能简介:能够帮定一个临时指定表,调用类的函数即可对该表 插入、增加、修改、简单统计等等操作(注:通过动态改变表的信息:表名字、 表字段总数、字段名字、字段类型、字段是否为数值、字段是否为主键。这样 就可以访问ODBC 数据源的所有表了) 另外提供一个函数 可以对该数据源的其他表(包括帮定的表)进行 删除、修改功能 LSZ 2001.08.25 */
/*头文件*/
#ifndef _WDC_DATABASE_H #define _WDC_DATABASE_H
#include <sql.h> #include <sqlext.h>
#define MAX_FIELDS 500 #define MAX_ERROR_MSG 1024 #define MAX_DATA 500
class CWdcDatabase { public: CWdcDatabase(); virtual ~CWdcDatabase(); BOOL Open(const CString& sDSN, const CString& sTable, const CString& sUserId, const CString& sPassword) ; /*打开一个ODBC数据源数据库*/
public: BOOL m_bOpen; /*标志数据库是否打开*/ BOOL m_bBrackets; /*标识表名、字段名是否用方扩号扩起来*/ int m_nError; /*ODBC错误返回代码*/ CString m_sQuery; /*操作ODBC 数据源公用的语句,用于方便构造*/ CString m_sErrMsg; /*ODBC错误返回信息*/ CString m_sDSN; /*ODBC 数据源的 DSN*/ CString m_sTable; /*临时绑定的表名*/
public: void DropHstmtSelect(); /*确保公共查询的语句句柄释放*/ long GetRecordCount(CString &sSel); /*取得符合条件的记录数*/ BOOL NextMatchingRecord(); /*查询符合条件的下一条记录*/ int SelectMatchingRecords(CString& sWhereContext); /*查询符合条件的记录*/ BOOL UpdateRecord(); /*更新临时绑定的表的一条记录*/ BOOL AddRecord(); /*增加临时绑定表一条新记录*/ BOOL DeleteRecord(CString &sWhereDelete); /*删除临时绑定表符合条件记录*/ BOOL Execute(const CString &sText); /*执行一个SQL语句,注:可以执行存储过程*/ void Close(); /*关闭数据库*/ public: int m_nFields; /*临时绑定表字段的总数*/ CString m_sFieldName[MAX_FIELDS]; /*临时绑定表字段名字*/ CString m_sFieldValue[MAX_FIELDS];/*临时绑定表字段值*/ BOOL m_bKeyField[MAX_FIELDS];/*临时绑定表字段是否为主键*/ BOOL m_bNumeric[MAX_FIELDS];/*临时绑定表字段是否为数值类型*/
private: CString Quote(CString &sQuote); /*字符串替换*/ RETCODE rc; /*ODBC API 涵数执行返回码*/ HSTMT hstmt, hstmt_select; /*公共语句句柄*/ unsigned char szDSN[200]; /*连接数据源的 DSN */ unsigned char szID[200]; /*连接数据源的 UID */ unsigned char szPassword[200]; /*连接数据源的 PWD*/ unsigned char szQuery[3000]; /*公共执行的语句句柄*/ unsigned char szTemp[1000]; /*公共使用的字符串*/ CString sTemp ; /*公共使用的字符串*/ HENV henv; /*环境句柄*/ HDBC hdbc; /*ODBC 连接句柄*/ };
#endif
/*实现文件*/
#include "stdafx.h" #include "WdcDatabase.h" #include <sql.h> #include <sqlext.h>
#ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif
CWdcDatabase::CWdcDatabase() { m_nError = 0; m_bOpen = false; m_nFields = 0; m_bBrackets = false; }
CWdcDatabase::~CWdcDatabase() { if(m_bOpen) { Close() ; } }
BOOL CWdcDatabase::Open(const CString& sDSN, const CString& sTable, const CString& sUserId, const CString& sPassword) { if(m_bOpen) { Close() ; } hstmt_select = NULL ; RETCODE rc ; CString stemp ;
memset(szDSN,0x00,200) ; memset(szID,0x00,200) ; memset(szPassword,0x00,200) ; /*Open Database */ SQLAllocEnv(&henv) ; SQLAllocConnect(henv,&hdbc) ;
strcpy((char*)szDSN,sDSN) ;
stemp = sUserId ; strcpy((char*)szID,stemp) ;
stemp = sPassword ; strcpy((char*)szPassword,stemp) ;
m_sDSN = sDSN ; m_sTable = sTable ;
rc = SQLConnect(hdbc, szDSN, SQL_NTS, szID, SQL_NTS, szPassword, SQL_NTS);
m_nError = (int) rc ;
if((rc == SQL_SUCCESS ) |
关键词: 一个用技巧强大的ODBC API 函数访问数据库类