山寨:不是最好的,是最适合我们的!欢迎体验山寨 中文版MSDN

Blog @ Blog

当华美的叶片落尽,生命的脉络才历历可见。 -- 聂鲁达

常用链接

统计

积分与排名

BBS

Blog

Web

最新评论

封装ADO编程Connection对象的类

 

// ADOConnection.cpp: implementation of the CADOConnection class.
//
//////////////////////////////////////////////////////////////////////
/******************************************************************************
[文件名]: ADOConnection.cpp(ADO连接对象_ConnectionPtr封装类)
[版本号]: Ver1.0(2008-06-09)
[作  者]: isabc (E-mail:isabc@163.com QQ:272126451)
-------------------------------------------------------------------------------
连接:通过"连接"可从应用程序访问数据源,连接是交换数据所必需的环境。
-------------------------------------------------------------------------------
注意事项:
        1. 必须在下面指明 msado15.dll 的全路径, 一般在 "C:\Program Files\
           Common Files\System\ADO\" 目录下.
        2. 在使用本类之前必须要初始化 COM 环境, 可以调用 CoInitialize(NULL)  
           来初始化, 用 CoUninitialize() 释放;
        3. 在使用记录集对象前必须先调用 CAdoConnection::Open() 连接数据库,
           连接后可给多个 CAdoRecordSet 对象使用, 用完后须关闭数据库.
        4. 使用记录集执行SQL语句之前, 要使用构建方法或调用 SetAdoConnection() 
           关联到连接对象.
*****************************************************************************
*/

#include 
"stdafx.h"
#include 
"ADODataBase.h"
#include 
"ADOConnection.h"
#include 
<math.h>

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


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CADOConnection::CADOConnection()
{
    
//-----------------------创建 Connection 对象-----------------------------
    m_pConnection.CreateInstance("ADODB.Connection");
    #ifdef _DEBUG
    
if (m_pConnection == NULL)
    
{
        AfxMessageBox(
"Connection 对象创建失败! 请确认是否初始化了COM环境\r\n");
    }

    
#endif
    ASSERT(m_pConnection 
!= NULL);
}


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

}


/*=============================================================================
Name: 连接到数据源.
-------------------------------------------------------------------------------
Params:    [lpszConnect]: 连接字符串, 包含连接信息.
        [lOptions]:    可选. 决定该方法是以同步还是异步的方式连接数据源. 
                    可以是如下某个常量:
---------------------|---------------------------------------------------------
[常量]                 |[说明] 
---------------------|---------------------------------------------------------
adConnectUnspecified |(默认)同步方式打开连接. 
adAsyncConnect         |异步方式打开连接. Ado用 ConnectComplete 事件来通知已经完成连接. 
-------------------------------------------------------------------------------
Remark: 调用连接对象的成员函数Open()
=============================================================================
*/

BOOL CADOConnection::Open(LPCTSTR lpszConnect, 
long lOptions)
{
    ASSERT(m_pConnection 
!= NULL);
    ASSERT(AfxIsValidString(lpszConnect));
    
    
if (strcmp(lpszConnect, _T("")) != 0)
    
{
        m_strConnect 
= lpszConnect;
    }


    
if (m_strConnect.IsEmpty())
    
{
        ASSERT(FALSE);
        
return FALSE;
    }


    
if (IsOpen()) 
        Close();

    
try
    
{
        
// 连接数据库 ---------------------------------------------
        return (m_pConnection->Open(_bstr_t(LPCTSTR(m_strConnect)), """", lOptions) == S_OK);
    }

    
catch (_com_error e)
    
{
        TRACE(_T(
"Warning: 连接数据库发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
        TRACE(_T(
"%s\r\n"), GetLastErrorText());
        
return FALSE;
    }
 
    
catch ()
    
{
        TRACE(_T(
"Warning: 连接数据库时发生未知错误:"));
    }

    
return FALSE;
}


/*=============================================================================
Name:    连接 SQL SERVER 数据库. 
-------------------------------------------------------------------------------
Params:        [dbsrc]:    SQL SERVER 服务器名.
            [dbname]:    默认的数据库名.
            [user]:        用户名.
            [pass]:        密码.
------------------------------------------------------------------------------
调用本类成员函数Open()
=============================================================================
*/

BOOL CADOConnection::ConnectSQLServer(CString dbsrc, CString dbname, CString user, CString pass, 
long lOptions)
{
    CString strConnect 
= _T("Provider=SQLOLEDB.1; Data Source="+ dbsrc + 
                         _T(
"; Initial Catalog="+ dbname  +
                         _T(
"; User ID="+ user + 
                         _T(
"; PWD="+ pass;
    
return Open(LPCTSTR(strConnect), lOptions);
}


/*=============================================================================
Name:    连接 ACCESS 数据库. 
-------------------------------------------------------------------------------
Params:        [dbpath]:    MDB 数据库文件路径名.
            [pass]:        访问密码.
------------------------------------------------------------------------------
调用本类成员函数Open()
=============================================================================
*/

BOOL CADOConnection::ConnectAccess(CString dbpath, CString pass, 
long lOptions)
{
    CString strConnect 
= _T("Provider=Microsoft.Jet.OLEDB.4.0; Data Source="+ dbpath;
    
if (pass != _T("")) 
    
{
        strConnect 
+= _T("Jet OLEDB:Database Password="+ pass + _T(";");
    }

    
return Open(LPCTSTR(strConnect), lOptions);
}


/*=============================================================================
Name:    通过 udl 文件连接数据库. 
-------------------------------------------------------------------------------
Params:        [strFileName]:    UDL 数据库连接文件路径名.
------------------------------------------------------------------------------
调用本类成员函数Open()
=============================================================================
*/

BOOL CADOConnection::OpenUDLFile(LPCTSTR strFileName, 
long lOptions)
{
    CString strConnect 
= _T("File Name=");
    strConnect 
+= strFileName;
    
return Open(LPCTSTR(strConnect), lOptions);
}



/*=============================================================================
Name:    关闭与数据源的连接.
-------------------------------------------------------------------------------
Remarks: 使用 Close 方法可关闭 Connection 对象以便释放所有关联的系统资源. 调用
连接对象成员函数Close()
=============================================================================
*/

void CADOConnection::Close()
{
    
try
    
{
        
if (m_pConnection != NULL && IsOpen()) 
        
{
            m_pConnection
->Close();//关闭连接
        }

    }

    
catch (_com_error e)
    
{
        TRACE(_T(
"Warning: 关闭数据库发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
    }
 
}


/*=============================================================================
Name:    关闭连接并释放对象.
-------------------------------------------------------------------------------
Remarks: 关闭连接并释放connection对象.
=============================================================================
*/

void CADOConnection::Release()
{
    
if (IsOpen()) 
        Close();
    m_pConnection
->Release();//释放连接对象
}


/*=============================================================================
Name:        执行指定的查询、SQL 语句、存储过程等.
----------------------------------------------------------
Remarks:    请参考 CAdoRecordSet 类的Open方法. 返回的 Recordset 对象始
            终为只读、仅向前的游标.
=============================================================================
*/

_RecordsetPtr CADOConnection::Execute(LPCTSTR lpszSQL, 
long lOptions)
{
    ASSERT(m_pConnection 
!= NULL);
    ASSERT(AfxIsValidString(lpszSQL));

    
try
    
{
        
return m_pConnection->Execute(_bstr_t(lpszSQL), NULL, lOptions);
    }

    
catch (_com_error e)
    
{
        TRACE(_T(
"Warning: Execute 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"),
                    e.ErrorMessage(), __FILE__, __LINE__);
        
return FALSE;
    }
 
    
return FALSE;
}


/*=============================================================================
Name:        取消操作
-------------------------------------------------------------------------------
Remarks:    请参考 CAdoRecordSet 类 Cancel 方法.
=============================================================================
*/

BOOL CADOConnection::Cancel()
{
    ASSERT(m_pConnection 
!= NULL);
    
try
    
{
        
return m_pConnection->Cancel();
    }

    
catch (_com_error e)
    
{
        TRACE(_T(
"Warning: Cancel 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"),
                    e.ErrorMessage(), __FILE__, __LINE__);
        
return FALSE;
    }
 
    
return FALSE;
}


/*=============================================================================
Name:    取得最后发生的错误信息.
=============================================================================
*/

CString CADOConnection::GetLastErrorText()
{
    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\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(
"Warning: GetLastError 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
        
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(
"Warning: GetErrors 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
        
return NULL;
    }
 
    
return NULL;
}


ErrorPtr CADOConnection::GetError(
long index)
{
    ASSERT(m_pConnection 
!= NULL);
    
try
    
{
        
if (m_pConnection != NULL)
        
{
            ErrorsPtr pErrors 
=  m_pConnection->Errors;
            
if (index >= 0 && index < pErrors->Count)
            
{
                
return pErrors->GetItem(_variant_t(index));
            }

        }

        
return NULL;
    }

    
catch (_com_error e)
    
{
        TRACE(_T(
"Warning: GetError 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
        
return NULL;
    }
 
    
return NULL;
}


/*========================================================================
    Name:        取得默认数据库的名称.
==========================================================================
*/

CString CADOConnection::GetDefaultDatabase()
{
    ASSERT(m_pConnection 
!= NULL);
    
try
    
{
        
return CString(LPCTSTR(_bstr_t(m_pConnection->GetDefaultDatabase())));//默认数据库名
    }

    
catch (_com_error e)
    
{
        TRACE(_T(
"Warning: GetDefaultDatabase 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
        
return CString(_T(""));
    }
 
}


/*=============================================================================
Name:        取得 Connection 对象提供者的名称.
=============================================================================
*/

CString CADOConnection::GetProviderName()
{
    ASSERT(m_pConnection 
!= NULL);
    
try
    
{
        
return CString(LPCTSTR(_bstr_t(m_pConnection->GetProvider())));//连接对象提供者
    }

    
catch (_com_error e)
    
{
        TRACE(_T(
"Warning: GetProviderName 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
        
return CString(_T(""));
    }
 
}


/*=============================================================================
    Name:        取得 ADO 的版本号
=============================================================================
*/

CString CADOConnection::GetVersion()
{
    ASSERT(m_pConnection 
!= NULL);
    
try
    
{
        
return CString(LPCTSTR(_bstr_t(m_pConnection->GetVersion())));//获取ADO版本信息
    }

    
catch (_com_error e)
    
{
        TRACE(_T(
"Warning: GetVersion 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
        
return CString(_T(""));
    }
 
}

/*=============================================================================
    Name:    检测连接对象是否为打开状态.
=============================================================================
*/

BOOL CADOConnection::IsOpen()
{
    
try
    
{
        
return (m_pConnection != NULL && (m_pConnection->State & adStateOpen));//是否打开状态
    }

    
catch (_com_error e)
    
{
        TRACE(_T(
"Warning: IsOpen 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
        
return FALSE;
    }
 
    
return FALSE;
}


/*=============================================================================
Name:        取得对象的状态(同 Recordset 对象的 GetState 方法).
-------------------------------------------------------------------------------
returns:    返回下列常量之一的长整型值.
        [常量]                [说明] 
-------------------------------------------------------------------------------
        adStateClosed        指示对象是关闭的. 
        adStateOpen            指示对象是打开的. 
-------------------------------------------------------------------------------
    Remarks:        可以随时使用 State 属性取得指定对象的当前状态.
=============================================================================
*/

long CADOConnection::GetState()
{
    ASSERT(m_pConnection 
!= NULL);
    
try
    
{
        
return m_pConnection->GetState();//对象状态
    }

    
catch (_com_error e)
    
{
        TRACE(_T(
"Warning: GetState 发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
        
return -1;
    }
 
    
return -1;
}


/*=============================================================================
Name:        取得在 Connection 对象中修改数据的可用权限.
-------------------------------------------------------------------------------
    returns:    返回以下某个 ConnectModeEnum 的值.
        [常量]                 [说明] 
-------------------------------------------------------------------------------
        adModeUnknown         默认值. 表明权限尚未设置或无法确定. 
        adModeRead             表明权限为只读. 
        adModeWrite             表明权限为只写. 
        adModeReadWrite         表明权限为读/写. 
        adModeShareDenyRead  防止其他用户使用读权限打开连接. 
        adModeShareDenyWrite 防止其他用户使用写权限打开连接. 
        adModeShareExclusive 防止其他用户打开连接. 
        adModeShareDenyNone  防止其他用户使用任何权限打开连接.
-------------------------------------------------------------------------------
    Remarks: 使用 Mode 属性可设置或返回当前连接上提供者正在使用的访问权限.
=============================================================================
*/

ConnectModeEnum CADOConnection::GetMode()
{
    ASSERT(m_pConnection 
!= NULL);
    
try
    
{
        
return m_pConnection->GetMode();//获取连接模式(权限)
    }

    
catch (_com_error e)
    
{
        TRACE(_T(
"Warning: GetMode 发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
        
return adModeUnknown;
    }
 
    
return adModeUnknown;
}


/*=============================================================================
Name:        设置在 Connection 中修改数据的可用权限. 请参考 GetMode 方法.
-------------------------------------------------------------------------------
Remarks:    只能在关闭 Connection 对象时方可设置 Mode 属性.
=============================================================================
*/

BOOL CADOConnection::SetMode(ConnectModeEnum mode)
{
    ASSERT(m_pConnection 
!= NULL);
    ASSERT(
!IsOpen());

    
try
    
{
        m_pConnection
->PutMode(mode);//设置连接模式(权限)
    }

    
catch (_com_error e)
    
{
        TRACE(_T(
"Warning: SetMode 发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
        
return FALSE;
    }
 
    
return TRUE;
}


/*=============================================================================
Name:        取得连接时间.
===============================================================================
*/

long CADOConnection::GetConnectTimeOut()
{
    ASSERT(m_pConnection 
!= NULL);
    
try
    
{
        
return m_pConnection->GetConnectionTimeout();//获取连接时间
    }

    
catch (_com_error e)
    
{
        TRACE(_T(
"Warning: GetConnectTimeOut 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
        
return -1;
    }
 
    
return -1;
}


/*========================================================================
Name:        设置连接时间.
==========================================================================
*/

BOOL CADOConnection::SetConnectTimeOut(
long lTime)
{
    ASSERT(m_pConnection 
!= NULL);
    
try
    
{
        m_pConnection
->PutConnectionTimeout(lTime);//设置超时时间
        return TRUE;
    }

    
catch (_com_error e)
    
{
        TRACE(_T(
"Warning: SetConnectTimeOut 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
        
return FALSE;
    }
 
}


/*========================================================================
    Name:        从数据源获取数据库信息.
    -----------------------------------------------------
    Params:        QueryType  所要运行的模式查询类型.
    -----------------------------------------------------
    returns:    返回包含数据库信息的 Recordset 对象. Recordset 将以只读、静态
            游标打开.
==========================================================================
*/

_RecordsetPtr CADOConnection::OpenSchema(SchemaEnum QueryType)
{
    ASSERT(m_pConnection 
!= NULL);
    
try
    
{
        
return m_pConnection->OpenSchema(QueryType, vtMissing, vtMissing);//从提供者获取数据库模式信息
    }

    
catch(_com_error e)
    
{
        TRACE(_T(
"Warning: OpenSchema方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
        
return NULL;
    }
 
    
return NULL;
}


/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
              ------------------------------------------------
                                    事务处理
              ------------------------------------------------
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
*/


/*=============================================================================
Name:        开始新事务.
-------------------------------------------------------------------------------
returns:    对于支持嵌套事务的数据库来说, 在已打开的事务中调用 BeginTrans 
    方法将开始新的嵌套事务. 返回值将指示嵌套层次: 返回值为 1 表示已打开顶层
    事务 (即事务不被另一个事务所嵌套), 返回值为 2 表示已打开第二层事务(嵌套
    在顶层事务中的事务), 依次类推.
-------------------------------------------------------------------------------
Remarks:    一旦调用了 BeginTrans 方法, 在调用 CommitTrans 或 RollbackTrans
    结束事务之前, 数据库将不再立即提交所作的任何更改.
=============================================================================
*/

long CADOConnection::BeginTrans()
{
    ASSERT(m_pConnection 
!= NULL);
    
try
    
{
        
return m_pConnection->BeginTrans();//开始新事务
    }

    
catch (_com_error e)
    
{
        TRACE(_T(
"Warning: BeginTrans 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
        
return -1;
    }
 
    
return -1;
}


/*=============================================================================
Name:        保存任何更改并结束当前事务.
-------------------------------------------------------------------------------
Remarks:    调用 CommitTrans 或 RollbackTrans 只影响最新打开的事务; 在处理任何
    更高层事务之前必须关闭或回卷当前事务.
=============================================================================
*/

BOOL CADOConnection::CommitTrans()
{
    ASSERT(m_pConnection 
!= NULL);
    
try
    
{
        
return SUCCEEDED(m_pConnection->CommitTrans());//保存任何更改并结束当前事务
    }

    
catch (_com_error e)
    
{
        TRACE(_T(
"Warning: CommitTrans 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
        
return FALSE;
    }
 
    
return FALSE;
}


/*=============================================================================
    Name:        取消当前事务中所作的任何更改并结束事务.
==============================================================================
*/

BOOL CADOConnection::RollbackTrans()
{
    ASSERT(m_pConnection 
!= NULL);
    
try
    
{
        
return SUCCEEDED(m_pConnection->RollbackTrans());//取消当前事务中所作的任何更改并结束事务
    }

    
catch (_com_error e)
    
{
        TRACE(_T(
"Warning: RollbackTrans 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
        
return FALSE;
    }
 
    
return FALSE;
}



posted on 2008-06-10 21:20 isabc 阅读(2095) 评论(0)  编辑 收藏 引用 所属分类: 分享代码数据库


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


广告信息(免费广告联系)

中文版MSDN:
欢迎体验