📄 ado.cpp
字号:
/*####################################################################
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 + -