65.9K
CodeProject 正在变化。 阅读更多。
Home

一组 ODBC 类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (22投票s)

2001 年 8 月 15 日

5分钟阅读

viewsIcon

507501

downloadIcon

3234

两个类, 使与 ODBC 的工作更轻松。

概述

我创建这些类是为了方便使用 ODBC。为此,我创建了 CODBCDatabaseCODBCRecordset 类。

CODBCDatabase 类

CODBCDatabase::CODBCDatabase

构造一个 CODBCDatabase 对象。

CODBCDatabase();

请参阅示例

CODBCDatabase::Open

Open 函数建立到驱动程序和数据源的连接。

BOOL Open(CHAR* lpstrDSN, CHAR* lpstrUser = NULL, CHAR* lpstrPass = NULL);

参数

CHAR* lpstrDSN 指向一个以 null 结尾的字符串,其中包含数据源名称

CHAR* lpstrUser = NULL 指向一个以 null 结尾的字符串,其中包含用户标识符

CHAR* lpstrPass = NULL 指向一个以 null 结尾的字符串,其中包含身份验证字符串(通常是密码)。

如果函数成功,则返回 TRUE。

请参阅示例

CODBCDatabase::DriverConnect

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。

请参阅示例

CODBCDatabase::SetReadOnly

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();

CODBCDatabase::Execute

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();

请参阅示例

CODBCDatabase::IsConnected

如果与数据库的连接已打开,则 IsConnected 返回 true

BOOL IsConnected();

CODBCDatabase::Close

Close 函数关闭连接。

void Close();

请参阅示例

CODBCRecordset 类

CODBCRecordset::CODBCRecordset

构造一个 CODBCRecordset 对象。

CODBCRecordset(CODBCDatabase* pDb);

参数

CODBCDatabase* pDb 指向 CODBCDatabase 对象。

请参阅示例

CODBCRecordset::Open

Open 执行一个可准备的 SQL 语句。

BOOL Open(CHAR* szSqlStr);

参数

CHAR* szSqlStr 指向一个以 null 结尾的字符串,其中包含 SQL 语句。

请参阅示例

CODBCRecordset::GetFieldLength

GetFieldLength 返回数据源中字段的大小。

LONG GetFieldLength(int nField);

参数

int nField 结果数据的字段索引,按顺序排列,从 0 开始

CODBCRecordset::GetFieldIndex

GetFieldIndex 返回特定字段名的索引。如果字段名不存在,则 GetFieldIndex 返回 -1。

int GetFieldIndex(CHAR* szFieldName);

参数

CHAR* szFieldName 指向一个以 null 结尾的字符串,其中包含字段名。

CODBCRecordset::GetFieldName

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

CODBCRecordset::GetFieldCount

GetFieldCount 返回结果集中的字段数。

int GetFieldCount();

CODBCRecordset::GetFieldValue

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。

请参阅示例

CODBCRecordset::MoveFirst

MoveFirst 使记录集中的第一条记录成为当前记录。

BOOL MoveFirst();

如果函数成功,则返回 TRUE。

CODBCRecordset::MoveNext

MoveNext 使记录集中的下一条记录成为当前记录。

BOOL MoveNext();

如果函数成功,则返回 TRUE。

请参阅示例

CODBCRecordset::MovePrevious

MovePrevious 使记录集中的上一条记录成为当前记录。

BOOL MovePrevious();

如果函数成功,则返回 TRUE。

CODBCRecordset::MoveLast

MoveLast 使记录集中的最后一条记录成为当前记录。

BOOL MoveLast();

如果函数成功,则返回 TRUE。

CODBCRecordset::IsEof

如果当前位置不包含任何记录,则 IsEof 返回 true

BOOL IsEof();

如果函数成功,则返回 TRUE。

请参阅示例

CODBCRecordset::IsBof

如果当前位置是记录集的底部,则 IsBof 返回 true

BOOL IsBof();

如果函数成功,则返回 TRUE。

CODBCRecordset::Close

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* 类收到了读者的大量建议。感谢大家的支持与合作。


© . All rights reserved.