⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ado.cpp

📁 ADO使用和封装的例子
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/*####################################################################
	Filename: 	ado.cpp
	----------------------------------------------------
	Remarks:	...
	----------------------------------------------------
	Author:		成真
	Email:		anyou@sina.com
				anyou@msn.com
	Created:	20/1/2003 19:19
  ####################################################################*/
#include "stdafx.h"
#include "resource.h"
#include <math.h>
#include "ADO.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif


/*####################################################################
			------------------------------------------------
						CAdoConnection class
			------------------------------------------------
  ####################################################################*/

CAdoConnection::CAdoConnection()
{
	///创建 Connection 对象---------------------------
	m_pConnection.CreateInstance("ADODB.Connection");
	ASSERT(m_pConnection != NULL);
}

CAdoConnection::~CAdoConnection()
{
	if (m_pConnection != NULL)
	{
		Release();
	}
}

/*===================================================================
	Name:		连接到数据源.
	-----------------------------------------------------
	Params:		strConnect: 连接字符串,包含连接信息.
				lOptions:	可选。决定该方法是在连接建立之后(异步)还是连接
						建立之前(同步)返回。可以是如下某个常量:
		常量					说明 
		adConnectUnspecified	(默认)同步方式打开连接。 
		adAsyncConnect			异步方式打开连接。Ado用 ConnectComplete 事
							件来通知何时完成连接。 
=====================================================================*/
BOOL CAdoConnection::Connect(LPCTSTR strConnect, long lOptions)
{
	ASSERT(m_pConnection != NULL);
	m_strConnect = strConnect;
	try
	{
		// 连接数据库---------------------------------------------
		return SUCCEEDED(m_pConnection->Open(strConnect, "", "", lOptions));
	}
	catch (_com_error e)
	{
		TRACE(_T(":( 连接数据库发生异常: %s\n"), e.ErrorMessage());
		return FALSE;
	} 
	catch (...)
	{
		TRACE(_T(":( 连接数据库时发生未知错误:"));
	}
	return FALSE;
}

/*===================================================================
	Name:	关闭与数据源的连接.
	-----------------------------------------------------
	Remarks: 使用 Close 方法可关闭 Connection 对象以便释放所有关联的系统资
		源。关闭对象并非将它从内存中删除,可以更改它的属性设置并且在此后再
		次打开。要将对象从内存中完全删除,需调用Release方法。
=====================================================================*/
BOOL CAdoConnection::Disconnect()
{
	try
	{
		if (m_pConnection != NULL && m_pConnection->State == adStateOpen) 
		{
			if (SUCCEEDED(m_pConnection->Close()))
			{
				return TRUE;
			}
		}
	}
	catch(_com_error e)
	{
		TRACE(_T(":( 关闭数据库发生异常: %s\n"), e.ErrorMessage());
		return FALSE;
	} 
	return FALSE;
}

/*===================================================================
	Name:	关闭连接并释放对象.
	-----------------------------------------------------
	Remarks: 关闭连接并释放connection对象,这样基本上从内容中完全清除
		了connection对象。
=====================================================================*/
BOOL CAdoConnection::Release()
{
	try
	{
		Disconnect();
		m_pConnection.Release();
		return TRUE;
	}
	catch(_com_error e)
	{
		TRACE(_T(":( Release方法发生异常: %s\n"), e.ErrorMessage());
		return FALSE;
	} 
	return TRUE;
}

/*========================================================================
	Remarks:	请考参 CAdoRecordSet 类 Cancel 方法.
==========================================================================*/
BOOL CAdoConnection::Cancel()
{
	ASSERT(m_pConnection != NULL);
	try
	{
		return m_pConnection->Cancel();
	}
	catch (_com_error e)
	{
		TRACE(_T(":( Cancel发生异常: %s\n"), e.ErrorMessage());
		return FALSE;
	} 
	return FALSE;
}

_ConnectionPtr CAdoConnection::GetConnection()
{
	return m_pConnection;
}

/*===================================================================
	Name:	取得最后发生的错误信息.
	-----------------------------------------------------
	Remarks: 任何涉及 ADO 对象的操作都可以产生一个或多个提供者错误。产生错
		误时,可以将一个或多个 Error 对象置于 Connection 对象的 Errors 集合
		中。其他 ADO 操作产生错误时,将清空 Errors 集合,并且将新的 Error 
		对象置于 Errors 集合中。 
			每个 Error 对象代表特定的提供者错误,而不是 ADO 错误。ADO 错误
		被记载在运行时的异常处理机制中。
			没有产生错误的 ADO 操作对 Errors 集合没有影响。使用 Clear 方式
		可手工清除 Errors 集合。
			Errors 集合中的 Error 对象集合描述响应单个语句时产生的所有错误。
		列举 Errors 集合中指定错误可使错误处理例程更精确地确定产生错误的原
		因及错误来源,并执行适当还原步骤。
			某些属性和方法将返回作为 Errors 集合中的 Error 对象显示的警告,
		但不会中止程序的执行。在调用 Recordset 对象上的 Resync、UpdateBatch
		或 CancelBatch 方法,Connection 的 Open 方法或者设置 Recordset 对象
		上的 Filter 属性前,请调用 Errors 集合上的 Clear 方法。这样您就可以
		阅读 Errors 集合的 Count 属性以测试返回的警告。
=====================================================================*/
CString CAdoConnection::GetLastError()
{
	ASSERT(m_pConnection != NULL);
	CString strErrors = "";
	try
	{
		if (m_pConnection != NULL)
		{
			ErrorsPtr pErrors = m_pConnection->Errors;
			CString strError;
			for (long n = 0; n < pErrors->Count; n++)
			{
				ErrorPtr pError = pErrors->GetItem(n);
				strError.Format(_T("Description: %s\r\n\r\nState: %s, Native: %d, Source: %s\r\n"),
								(LPCTSTR)pError->Description,
								(LPCTSTR)pError->SQLState,
										 pError->NativeError,
								(LPCTSTR)pError->Source);
				strErrors += strError;
			}
		}
		return strErrors;
	}
	catch(_com_error e)
	{
		TRACE(_T(":( GetLastError发生异常: %s\n"), e.ErrorMessage());
		return strErrors;
	} 
	return strErrors;
}

ErrorsPtr CAdoConnection::GetErrors()
{
	ASSERT(m_pConnection != NULL);
	try
	{
		if (m_pConnection != NULL)
		{
			return m_pConnection->Errors;
		}
		return NULL;
	}
	catch(_com_error e)
	{
		TRACE(_T(":( GetLastError发生异常: %s\n"), e.ErrorMessage());
		return NULL;
	} 
	return NULL;
}

BOOL CAdoConnection::IsOpen()
{
	try
	{
		long dwState = m_pConnection->State;
		return (m_pConnection != NULL && (dwState & adStateOpen));
	}
	catch (_com_error e)
	{
		TRACE(_T(":( IsOpen方法发生异常: %s\n"), e.ErrorMessage());
		return FALSE;
	} 
	return FALSE;
}

BOOL CAdoConnection::SetConnectTimeOut(long lTime)
{
	ASSERT(m_pConnection != NULL);
	try
	{
		return SUCCEEDED(m_pConnection->put_ConnectionTimeout(lTime));
	}
	catch (_com_error e)
	{
		TRACE(_T(":( SetConnectTimeOut方法发生异常: %s\n"), e.ErrorMessage());
		return FALSE;
	} 
	return FALSE;
}


/*========================================================================
    Name:		从数据源获取数据库信息.
	-----------------------------------------------------
	Params:		QueryType  所要运行的模式查询类型,可以为下列任意常量.
	adSchemaAsserts				CONSTRAINT_CATALOG
								CONSTRAINT_SCHEMA
								CONSTRAINT_NAME 
	adSchemaCatalogs			CATALOG_NAME 
	adSchemaCharacterSets		CHARACTER_SET_CATALOG
								CHARACTER_SET_SCHEMA
								CHARACTER_SET_NAME 
	adSchemaCheckConstraints	CONSTRAINT_CATALOG
								CONSTRAINT_SCHEMA
								CONSTRAINT_NAME 
	adSchemaCollations			 COLLATION_CATALOG
								COLLATION_SCHEMA
								COLLATION_NAME 
	adSchemaColumnDomainUsage	DOMAIN_CATALOG
								DOMAIN_SCHEMA
								DOMAIN_NAME
								COLUMN_NAME 
	adSchemaColumnPrivileges	TABLE_CATALOG
								TABLE_SCHEMA
								TABLE_NAME
								COLUMN_NAME
								GRANTOR
								GRANTEE 
	adSchemaColumns				TABLE_CATALOG
								TABLE_SCHEMA
								TABLE_NAME
								COLUMN_NAME 
	adSchemaConstraintColumnUsage TABLE_CATALOG
								TABLE_SCHEMA
								TABLE_NAME
								COLUMN_NAME 
	adSchemaConstraintTableUsage TABLE_CATALOG
								TABLE_SCHEMA
								TABLE_NAME 
	adSchemaForeignKeys			PK_TABLE_CATALOG
								PK_TABLE_SCHEMA
								PK_TABLE_NAME
								FK_TABLE_CATALOG
								FK_TABLE_SCHEMA
								FK_TABLE_NAME 
	adSchemaIndexes				TABLE_CATALOG
								TABLE_SCHEMA
								INDEX_NAME
								TYPE
								TABLE_NAME 
	adSchemaKeyColumnUsage		CONSTRAINT_CATALOG
								CONSTRAINT_SCHEMA
								CONSTRAINT_NAME
								TABLE_CATALOG
								TABLE_SCHEMA
								TABLE_NAME
								COLUMN_NAME 
	adSchemaPrimaryKeys			PK_TABLE_CATALOG
								PK_TABLE_SCHEMA
								PK_TABLE_NAME 
	adSchemaProcedureColumns	PROCEDURE_CATALOG
								PROCEDURE_SCHEMA
								PROCEDURE_NAME
								COLUMN_NAME 
	adSchemaProcedureParameters PROCEDURE_CATALOG
								PROCEDURE_SCHEMA
								PROCEDURE_NAME
								PARAMTER_NAME 
	adSchemaProcedures			PROCEDURE_CATALOG
								PROCEDURE_SCHEMA
								PROCEDURE_NAME
								PROCEDURE_TYPE 
	adSchemaProviderSpecific	 参见说明 
	adSchemaProviderTypes		DATA_TYPE
								BEST_MATCH 
	adSchemaReferentialConstraints CONSTRAINT_CATALOG
								CONSTRAINT_SCHEMA
								CONSTRAINT_NAME 
	adSchemaSchemata			CATALOG_NAME
								SCHEMA_NAME
								SCHEMA_OWNER 
	adSchemaSQLLanguages		<无> 
	adSchemaStatistics			TABLE_CATALOG
								TABLE_SCHEMA
								TABLE_NAME 
	adSchemaTableConstraints	CONSTRAINT_CATALOG
								CONSTRAINT_SCHEMA
								CONSTRAINT_NAME
								TABLE_CATALOG
								TABLE_SCHEMA
								TABLE_NAME
								CONSTRAINT_TYPE 
	adSchemaTablePrivileges		TABLE_CATALOG
								TABLE_SCHEMA
								TABLE_NAME
								GRANTOR
								GRANTEE 
	adSchemaTables				TABLE_CATALOG
								TABLE_SCHEMA
								TABLE_NAME
								TABLE_TYPE 
	adSchemaTranslations		TRANSLATION_CATALOG
								TRANSLATION_SCHEMA
								TRANSLATION_NAME 
	adSchemaUsagePrivileges		OBJECT_CATALOG
								OBJECT_SCHEMA
								OBJECT_NAME
								OBJECT_TYPE
								GRANTOR
								GRANTEE 
	adSchemaViewColumnUsage		VIEW_CATALOG
								VIEW_SCHEMA
								VIEW_NAME 
	adSchemaViewTableUsage		VIEW_CATALOG
								VIEW_SCHEMA
								VIEW_NAME 
	adSchemaViews				TABLE_CATALOG
								TABLE_SCHEMA
								TABLE_NAME 
	-----------------------------------------------------
	returns:	返回包含数据库信息的 Recordset 对象. Recordset 将以只读、静态
			游标打开.
	-----------------------------------------------------
	Remarks:	OpenSchema方法返回与数据源有关的信息,例如关于服务器上的表
			以及表中的列等信息, 上述数据仅供参考, 视具体的数据源可能会有不同。
==========================================================================*/
_RecordsetPtr CAdoConnection::OpenSchema(SchemaEnum QueryType)
{
	ASSERT(m_pConnection != NULL);
	try
	{
		return m_pConnection->OpenSchema(QueryType, vtMissing, vtMissing);
	}
	catch(_com_error e)
	{
		TRACE(_T(":( OpenSchema方法发生异常: %s\n"), e.ErrorMessage());
		return NULL;
	} 
	return NULL;
}

/*########################################################################
			  ------------------------------------------------
									事务处理
			  ------------------------------------------------
	BeginTrans		- 开始新事务。
	CommitTrans		- 保存任何更改并结束当前事务。它也可能启动新事务。
	RollbackTrans	- 取消当前事务中所作的任何更改并结束事务。它也可能启动
					新事务。

		一旦调用了 BeginTrans 方法,在调用 CommitTrans 或 RollbackTrans 结
	束事务之前,数据库将不再立即提交所作的任何更改。
		对于支持嵌套事务的数据库来说,在已打开的事务中调用 BeginTrans 方法
	将开始新的嵌套事务。返回值将指示嵌套层次:返回值为 1 表示已打开顶层事务
	(即事务不被另一个事务所嵌套),返回值为 2 表示已打开第二层事务(嵌套
	在顶层事务中的事务),依次类推。调用 CommitTrans 或 RollbackTrans 只影
	响最新打开的事务;在处理任何更高层事务之前必须关闭或回卷当前事务。
		调用 CommitTrans 方法将保存连接上打开的事务中所做的更改并结束事务。
	调用 RollbackTrans方法还原打开事务中所做的更改并结束事务。在未打开事务
	时调用其中任何一种方法都将引发错误。
		取决于 Connection 对象的 Attributes 属性,调用 CommitTrans 或 
	RollbackTrans 方法都可以自动启动新事务。如果 Attributes 属性设置为 
	adXactCommitRetaining,数据库在 CommitTrans 调用后会自动启动新事务。
	如果 Attributes 属性设置为 adXactAbortRetaining,数据库在调用 
	RollbackTrans 之后将自动启动新事务。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -