📄 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 "ADO.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
/*####################################################################
------------------------------------------------
CAdoConnection class
------------------------------------------------
####################################################################*/
CAdoConnection::CAdoConnection()
{
m_pConnection = NULL;
}
CAdoConnection::~CAdoConnection()
{
Disconnect();
}
BOOL CAdoConnection::OleInit()
{
return AfxOleInit();
}
/*===================================================================
Name: 连接到数据源.
-----------------------------------------------------
Params: strConnect: 连接字符串,包含连接信息.
lOptions: 可选。决定该方法是在连接建立之后(异步)还是连接
建立之前(同步)返回。可以是如下某个常量:
常量 说明
adConnectUnspecified (默认)同步方式打开连接。
adAsyncConnect 异步方式打开连接。Ado用 ConnectComplete 事
件来通知何时完成连接。
=====================================================================*/
BOOL CAdoConnection::Connect(LPCTSTR strConnect, long lOptions)
{
m_strConnect = strConnect;
try
{
///创建 Connection 对象---------------------------
HRESULT hr = m_pConnection.CreateInstance("ADODB.Connection");
if (SUCCEEDED(hr))
{
// 连接数据库---------------------------------------------
if (SUCCEEDED(m_pConnection->Open(strConnect, "", "", lOptions)))
{
return TRUE;
}
}
}
catch (_com_error e)
{
TRACE(_T(":( 连接数据库发生错误: %s\n"), e.ErrorMessage());
return FALSE;
}
catch (...)
{
TRACE(_T(":( 连接数据库时发生未知错误:"));
}
return FALSE;
}
/*===================================================================
Name: 关闭与数据源的连接.
-----------------------------------------------------
Remarks: 使用 Close 方法可关闭 Connection 对象以便释放所有关联的系统资
源。关闭对象并非将它从内存中删除,可以更改它的属性设置并且在此后再
次打开。要将对象从内存中完全删除,可将对象变量设置为 Nothing。
=====================================================================*/
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;
}
/*========================================================================
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()
{
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;
}
BOOL CAdoConnection::IsOpen()
{
try
{
return (m_pConnection != NULL && m_pConnection->State == adStateOpen);
}
catch (_com_error e)
{
TRACE(_T(":( IsOpen方法发生错误: %s\n"), e.ErrorMessage());
return FALSE;
}
return FALSE;
}
BOOL CAdoConnection::SetConnectTimeOut(long lTime)
{
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;
}
/*########################################################################
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -