一组 ODBC 类






4.90/5 (22投票s)
2001 年 8 月 15 日
5分钟阅读

507501

3234
两个类,
- 概述
- CODBCDatabase 类
- CODBCDatabase
- 打开
- DriverConnect
- SetReadOnly
- SetLoginTimeout
- SetConnectionTimeout
- GetConnectionTimeout
- Execute
- GetRowsAffected
- IsConnected
- Close
- CODBCRecordset 类
- CODBCRecordset
- 打开
- GetFieldLength
- GetFieldIndex
- GetFieldName
- GetFieldAttributes
- GetFieldCount
- GetFieldValue
- MoveFirst
- MoveNext
- MovePrevious
- MoveLast
- IsEof
- IsBof
- Close
概述
我创建这些类是为了方便使用 ODBC。为此,我创建了 CODBCDatabase
和 CODBCRecordset
类。
构造一个 CODBCDatabase 对象。
CODBCDatabase();
Open 函数建立到驱动程序和数据源的连接。
BOOL Open(CHAR* lpstrDSN, CHAR* lpstrUser = NULL, CHAR* lpstrPass = NULL);
参数
CHAR* lpstrDSN
指向一个以 null 结尾的字符串,其中包含数据源名称
CHAR* lpstrUser = NULL
指向一个以 null 结尾的字符串,其中包含用户标识符
CHAR* lpstrPass = NULL
指向一个以 null 结尾的字符串,其中包含身份验证字符串(通常是密码)。
如果函数成功,则返回 TRUE。
DriverConnect 支持需要比 Open 函数中的三个参数更多的连接信息的数据源、用于提示用户输入所有连接信息的对话框以及未在系统信息中定义的数据源。
BOOL DriverConnect(CHAR* szConnStr, CHAR* szConnStrOut = NULL, HWND hWnd = NULL, enum drvCompletion drvConn = sqlNoPrompt);
参数
CHAR* szConnStr
指向一个以 null 结尾的字符串,其中包含完整的连接字符串(请参阅“注释”中的语法)、部分连接字符串或空字符串。
CHAR* szConnStrOut = NULL
指向一个用于完成的连接字符串的缓冲区。
HWND hWnd = NULL
窗口句柄。应用程序可以传递父窗口的句柄(如果适用),或者在窗口句柄不适用或 DriverConnect 不会显示任何对话框的情况下传递 null 指针。
enum drvCompletion drvConn
指示驱动程序管理器或驱动程序是否必须提示输入更多连接信息的标志
CODBCDatabase::sqlNoPrompt
CODBCDatabase::sqlPrompt
如果函数成功,则返回 TRUE。
SetReadOnly 指示符,表示连接不需要支持导致更新发生的 SQL 语句。
void SetReadOnly(BOOL bReadOnly = TRUE);
参数
BOOL bReadOnly = TRUE
设置为只读
如果函数成功,则返回 TRUE。
CODBCDatabase::SetLoginTimeout
SetLoginTimeout 设置在返回到应用程序之前等待登录请求完成的秒数。
void SetLoginTimeout(LONG nSeconds);
参数
LONG nSeconds
秒数。如果为 0,则禁用超时,连接尝试将无限期等待。
CODBCDatabase::SetConnectionTimeout
SetConnectionTimeout 设置在返回到应用程序之前等待连接上的任何请求完成的秒数。
void SetConnectionTimeout(LONG nSeconds);
参数
LONG nSeconds
秒数
CODBCDatabase::GetConnectionTimeout
GetConnectionTimeout 返回连接超时的秒数。
LONG GetConnectionTimeout();
Execute 函数执行 SQL 可准备语句。
BOOL Execute(CHAR* szSqlStr);
参数
CHAR* szSqlStr
指向一个以 null 结尾的字符串,其中包含要执行的 SQL 语句
如果函数成功,则返回 TRUE。
CODBCDatabase pdb; if(!pdb.DriverConnect("DSN=Test;SERVER=ServerSQL;UID=;PWD=;DATABASE=TestDatabase;")) return FALSE; pdb.Execute("Delete Test Where Field1 >= 17"); n = pdb.GetRowsAffected();
CODBCDatabase::GetRowsAffected
GetRowsAffected 返回最后一次 Execute 操作受影响的行数。
int GetRowsAffected();
如果与数据库的连接已打开,则 IsConnected 返回 true
。
BOOL IsConnected();
Close 函数关闭连接。
void Close();
CODBCRecordset::CODBCRecordset
构造一个 CODBCRecordset 对象。
CODBCRecordset(CODBCDatabase* pDb);
参数
CODBCDatabase* pDb
指向 CODBCDatabase 对象。
Open 执行一个可准备的 SQL 语句。
BOOL Open(CHAR* szSqlStr);
参数
CHAR* szSqlStr
指向一个以 null 结尾的字符串,其中包含 SQL 语句。
CODBCRecordset::GetFieldLength
GetFieldLength 返回数据源中字段的大小。
LONG GetFieldLength(int nField);
参数
int nField
结果数据的字段索引,按顺序排列,从 0 开始
GetFieldIndex 返回特定字段名的索引。如果字段名不存在,则 GetFieldIndex
返回 -1。
int GetFieldIndex(CHAR* szFieldName);
参数
CHAR* szFieldName
指向一个以 null 结尾的字符串,其中包含字段名。
GetFieldName 返回结果集中的字段名。
BOOL GetFieldName(int nField, CHAR* szFieldName);
参数
int nField
CHAR* szFieldName
指向一个缓冲区,用于返回字段名。
CODBCRecordset::GetFieldAttributes
GetFieldAttributes 返回结果集中的一列的结果描述符(字段名、类型、字段大小)。
BOOL GetFieldAttributes(int nField, CHAR* szFieldName, int& nType, int& nLength);
参数
int nField
结果数据的字段索引,按顺序排列,从 0 开始
CHAR* szFieldName
指向一个缓冲区,用于返回字段名。
int& nType
指向一个缓冲区,用于返回字段的 SQL 数据类型。
int& nLength
指向一个缓冲区,用于返回数据源中字段的大小。
CODBCRecordset::typeChar
CODBCRecordset::typeVarChar
CODBCRecordset::typeLongVarChar
CODBCRecordset::typeWChar
CODBCRecordset::typeWVarChar
CODBCRecordset::typeWLongVarChar
CODBCRecordset::typeDecimal
CODBCRecordset::typeNumeric
CODBCRecordset::typeSmallint
CODBCRecordset::typeInteger
CODBCRecordset::typeReal
CODBCRecordset::typeFloat
CODBCRecordset::typeDouble
CODBCRecordset::typeBit
CODBCRecordset::typeTinyint
CODBCRecordset::typeBigInt
CODBCRecordset::typeBinary
CODBCRecordset::typeVarBinary
CODBCRecordset::typeLongVarBinary
CODBCRecordset::typeDate
CODBCRecordset::typeTime
CODBCRecordset::typeTimeStamp
CODBCRecordset::typeIntervalMonth
CODBCRecordset::typeIntervalYear
CODBCRecordset::typeIntervalYearToMonth
CODBCRecordset::typeIntervalDay
CODBCRecordset::typeIntervalHour
CODBCRecordset::typeIntervalMinute
CODBCRecordset::typeIntervalSecond
CODBCRecordset::typeIntervalDayToHour
CODBCRecordset::typeIntervalDayToMinute
CODBCRecordset::typeIntervalDayToSecond
CODBCRecordset::typeIntervalHourToMinute
CODBCRecordset::typeIntervalHourToSecond
CODBCRecordset::typeIntervalMinuteToSecond
CODBCRecordset::typeGUID
GetFieldCount 返回结果集中的字段数。
int GetFieldCount();
GetFieldValue。
BOOL GetFieldValue(int nField, CHAR* szData); BOOL GetFieldValue(CHAR* szFieldName, CHAR *szData); BOOL GetFieldValue(int nField, LONG *lData); BOOL GetFieldValue(CHAR* szFieldName, LONG *lData); BOOL GetFieldValue(int nField, DOUBLE *dblData); BOOL GetFieldValue(CHAR* szFieldName, DOUBLE *dblData); BOOL GetFieldValue(int nField, struct tm* time); BOOL GetFieldValue(CHAR* szFieldName, struct tm* time);
参数
int nField
结果数据的字段索引,按顺序排列,从 0 开始
CHAR* szFieldName
指向一个以 null 结尾的字符串,其中包含字段名
CHAR* szData
指向一个缓冲区,用于返回数据。
LONG *lData
指向一个以 null 结尾的字符串缓冲区,用于返回数据。
DOUBLE *dblData
指向一个 double 缓冲区,用于返回数据。
struct tm* time
指向一个 time 结构缓冲区,用于返回数据
如果函数成功,则返回 TRUE。
MoveFirst 使记录集中的第一条记录成为当前记录。
BOOL MoveFirst();
如果函数成功,则返回 TRUE。
MoveNext 使记录集中的下一条记录成为当前记录。
BOOL MoveNext();
如果函数成功,则返回 TRUE。
MovePrevious 使记录集中的上一条记录成为当前记录。
BOOL MovePrevious();
如果函数成功,则返回 TRUE。
MoveLast 使记录集中的最后一条记录成为当前记录。
BOOL MoveLast();
如果函数成功,则返回 TRUE。
如果当前位置不包含任何记录,则 IsEof 返回 true
。
BOOL IsEof();
如果函数成功,则返回 TRUE。
如果当前位置是记录集的底部,则 IsBof 返回 true
。
BOOL IsBof();
如果函数成功,则返回 TRUE。
Close。
void Close();
示例
CODBCDatabase pdb; pdb.SetConnectionTimeout(15); if(!pdb.DriverConnect("DSN=Test;SERVER=ServerSQL;UID=;PWD=;DATABASE=TestDatabase;")) return FALSE; CODBCRecordset prs = CODBCRecordset(&pdb); prs.Open("Select * From test"); char szData[256]; while(!prs.IsEof()) { int nType; long lData; double dblData; int nLen; struct tm time; prs.GetFieldAttributes(0, NULL, nType, nLen); switch(nType) { case CODBCRecordset::typeChar: case CODBCRecordset::typeVarChar: memset(szData, 0, sizeof(szData)); prs.GetFieldValue(0, szData); break; } prs.GetFieldValue(1, &lData); memset(szData, 0, sizeof(szData)); prs.GetFieldValue(2, szData); prs.GetFieldValue(3, &time); memset(szData, 0, sizeof(szData)); prs.GetFieldValue(4, szData); dblData = 0; prs.GetFieldValue(5, &dblData); dblData = 0; prs.GetFieldValue(6, &dblData); prs.MoveNext(); } prs.Close(); pdb.Close();
Carlos A. Antollini。
更新
2001 年 8 月 14 日 版本 1.0 发布。
2001 年 8 月 29 日 更新了源文件。
特别感谢
CODBC* 类收到了读者的大量建议。感谢大家的支持与合作。