`
kevinhrw
  • 浏览: 192027 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

VC下ADO数据库操作的封装类

    博客分类:
  • C++
c 
阅读更多
/******************************************************************
模块名称:数据库操作类;
实现功能:提供接口,实现数据的索引,和操作。
研究人员:长寿梦;
最后更新:2010-05-12

预先操作:
【1】在stdafx.h中添加
    #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
【2】在主进程的InitInstance()中添加
         if(!AfxOleInit())
        {
         AfxMessageBox("OLE初始化错误");
         return FALSE;
         }

【3】在.cpp文件中要包含"CPFile.h"
*********************************************************************/

/*****************************************************************
CPFile.h
******************************************************************/
class CPData 
{
public:
   
    //默认初始化构造函数
    CPData();
   
    //传入连接的构造函数
    CPData(_ConnectionPtr pConnection);
   
    //析构函数
    virtual ~CPData();
public:
   
    //连接数据库
    BOOL Connect(CString strUser,CString strPassword,CString strFileName="ConnectionParam.udl",int nOptions=-1,CString strConStr="Provider=sqloledb.1;Data Source=(local);Database=VLan");
   
    //关闭数据库的连接
    void DisConnect();
   
    //数据库查询语句,用来对数据库的各种字段进行查询
    //如果成功返回TRUE,否则返回FALSE.查询的结果存储在类的共有成员变量m_pRecordset中
    //查询结果的行数和列数分别保存在共有成员变量m_nResultRow和m_nResultCol中
    BOOL Select(CString strSql);
   
    //查询语句,负责对仅仅查询一个字段的情况进行处理
    //结果存放在CStringArray类型的变量pResult中
    BOOL Select(CString strSql,CStringArray& Result);
   
    //对多个字段进行查询
    BOOL SelectMulitCol(CString strSql,CStringArray& Result);
   
    //打开表
    BOOL OpenTable(CString strTable);
   
    //打开表
    BOOL OpenTable(CString strTable,CStringArray& Result);
   
    //进行其它的更新操作
    BOOL Execute(CString strSql);
public:
    BOOL ExecuteTrans(CStringArray& aSql);   
   
    //关闭结果集合
    void CloseRecordset();
   
    //得到操作结果的列数
    long GetResultCol();
   
    //得到操作结果的条数
    long GetResultRow();
   
    //得到操作结果
    _RecordsetPtr GetResult();
private:
   
    //数据库操作返回的结果条数
    long m_nResultRow;
   
    //返回的_RecordsetPtr中列数
    long m_nResultCol;
   
    //连接指针
    _ConnectionPtr m_pConnection;
   
    //命令执行指针
    _CommandPtr m_pCommand;
   
    //结果集指针
    _RecordsetPtr m_pRecordset;
};

/**************************************************************
CPFile.cpp
**************************************************************/

//////////////////////////////////////////////////////////////////////
// 构造函数
//////////////////////////////////////////////////////////////////////
//默认的构造函数
CPData::CPData()
{
    //初始化
    m_nResultRow = 0;
    m_nResultCol=0;
    m_pConnection = NULL;
    //创建对象
    m_pRecordset.CreateInstance(_uuidof(Recordset));
    m_pCommand.CreateInstance(_uuidof(Command));
}

//传入参数的构造函数
CPData::CPData(_ConnectionPtr pConnection)
{
    m_pConnection = pConnection;
    m_nResultRow = 0;
    m_nResultCol=0;
    //创建对象
    m_pRecordset.CreateInstance(_uuidof(Recordset));
    m_pCommand.CreateInstance(_uuidof(Command));
   
}
//////////////////////////////////////////////////////////////////////
// 析构函数
//////////////////////////////////////////////////////////////////////
CPData::~CPData()
{
    if(m_pRecordset->State!=adStateClosed)
        m_pRecordset->Close();
    m_pRecordset = NULL;

    if(m_pCommand->State!=adStateClosed)
        m_pCommand->Release();
    m_pCommand = NULL;

    if(m_pConnection->State!=adStateClosed)
        m_pConnection->Close();
    m_pConnection = NULL;
}

/////////////////////////////////////////////////////////////////////
///简单操作函数
////////////////////////////////////////////////////////////////////

//得到操作结果的行数
long CPData::GetResultRow()
{
    return this->m_nResultRow;
}

//得到操作结果的列数
long CPData::GetResultCol()
{
    return this->m_nResultCol;
}

//得到操作结果
_RecordsetPtr CPData::GetResult()
{
    return this->m_pRecordset;
}

///////////////////////////////////////////////////////////////////////
///连接操作
///////////////////////////////////////////////////////////////////////

//连接到数据库
//1.连接字符串可以自己构造,也可以从文件中读出
BOOL CPData::Connect(CString strUser,CString strPassword,CString strFileName,int nOptions,CString strConStr)
{
    try{
        m_pConnection.CreateInstance(__uuidof(Connection));
        HRESULT hr;
        //如果用文件方式配置数据源,进行配置
        if(strFileName.Compare("")!=0&&CPFile::IsFileExist(strFileName))
        {
            CString con = "File Name="+strFileName;
            m_pConnection->ConnectionString =(_bstr_t)con;
            hr=m_pConnection->Open("","","",nOptions);   
        }
        else
        {
            //自己配置连接字符串
            m_pConnection->ConnectionString = (_bstr_t)strConStr;
            hr=m_pConnection->Open("",_bstr_t(strUser),_bstr_t(strPassword),nOptions); 
        }
        //进行连接
        //连接失败
        if(FAILED(hr))
        {  
            AfxMessageBox("连接失败!");
            return FALSE;
        }
    }
    catch(_com_error&e)
    {
        AfxMessageBox(e.Description()+"B");
        return FALSE;
    }
    return TRUE;
}

//断开连接
void CPData::DisConnect()
{
    if(m_pConnection->State!=adStateClosed)
        m_pConnection->Close();
}

///////////////////////////////////////////////////////////////////////
///更新操作
///////////////////////////////////////////////////////////////////////
BOOL CPData::Execute(CString strSql)
{
    try
    {
        _variant_t vNULL;
        vNULL.vt = VT_ERROR;
       
        ///定义为无参数
        vNULL.scode = DISP_E_PARAMNOTFOUND;
       
        ///非常关键的一句,将建立的连接赋值给它
        m_pCommand->ActiveConnection = m_pConnection;
       
        ///命令字串
        m_pCommand->CommandText = (_bstr_t)strSql;
       
        ///执行命令,取得记录集
        m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);
       
        //确实,vNULL中的intVal是执行操作所影响的行数
        m_nResultRow = 0;
        m_nResultRow = vNULL.intVal; 
    }
    catch(_com_error&e)
    {
        m_nResultRow = 0; 
        return FALSE;
    }
    return TRUE;
}

///////////////////////////////////////////////////////////////////////
///查询操作
///////////////////////////////////////////////////////////////////////
BOOL CPData::Select(CString strSql)
{
    try
    {
        m_nResultCol=0;
        m_nResultRow=0; 
        m_pRecordset->CursorLocation=adUseClient;    //设置游标位置,设置为客户端形式,否则GetRecordCount()返回值不对
        m_pRecordset->Open(_variant_t(strSql),_variant_t((IDispatch *)m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdText);
        m_nResultCol = m_pRecordset->Fields->GetCount();//得到查询结果的列数
        m_nResultRow = m_pRecordset->GetRecordCount();  //得到查询结果的行数
    }
    catch(_com_error&e)
    { 
        AfxMessageBox(e.Description()+"D");
        return FALSE;
    }
    return TRUE;
}

//查询语句,负责对仅仅查询一个字段的情况进行处理
//结果存放在CStringArray类型的变量pResult中
BOOL CPData::Select(CString strSql,CStringArray& Result)
{
    if(Select(strSql)!=0)
    {
        Result.RemoveAll();
        for(int i=0;i<m_nResultRow;i++)
        {
            _variant_t value;
            value=m_pRecordset->Fields->Item[(long)0]->Value;  
            if(value.vt==3||value.vt==14)
            {
                CString strTrans;
                strTrans.Format("%ld",value.intVal);
                Result.Add(strTrans);
            }
            else
                Result.Add(value.bstrVal);//
            m_pRecordset->MoveNext();
        }
        m_pRecordset->Close();
        return TRUE;
    }
    else
    {
        m_pRecordset->Close();
        return FALSE;
    }
}

BOOL CPData::SelectMulitCol(CString strSql,CStringArray& Result)
{
    if(Select(strSql)!=0)
    {
        Result.RemoveAll();
        _variant_t value;
        for(int i=0;i<m_nResultRow;i++)
        {  
            for(int j=0;j<m_nResultCol;j++)
            {
                value=m_pRecordset->Fields->Item[(long)(/*i*m_nResultCol+*/j)]->Value;
                if(value.vt==3||value.vt==14)
                {
                    CString strTrans;
                    strTrans.Format("%ld",value.intVal);
                    Result.Add(strTrans);
                }
                else
                    if(value.vt==7)
                    {
                        COleDateTime time = value.date;
                        CString strTemp;
                        strTemp.Format("%d-%d-%d %s",time.GetYear(),time.GetMonth(),time.GetDay(),time.Format("%H:%M:%S"));
                        Result.Add(strTemp);
                    }
                    else
                        Result.Add(value.bstrVal);//
            }
            m_pRecordset->MoveNext();
        }
        m_pRecordset->Close();
        return TRUE;
    }
    else
    {
        m_pRecordset->Close();
        return FALSE;
    }
}

//打开整张表
BOOL CPData::OpenTable(CString strTable)
{
    try
    {
        m_nResultCol=0;
        m_nResultRow=0; 
        m_pRecordset->CursorLocation=adUseClient;    //设置游标位置,设置为客户端形式,否则GetRecordCount()返回值不对
        m_pRecordset->Open(_variant_t(strTable),_variant_t((IDispatch *)m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdTable);
        m_nResultCol = m_pRecordset->Fields->GetCount();//得到查询结果的列数
        m_nResultRow = m_pRecordset->GetRecordCount();  //得到查询结果的行数
    }
    catch(_com_error&e)
    { 
        AfxMessageBox(e.Description()+"E");
        return FALSE;
    }
    return TRUE;
}

BOOL CPData::OpenTable(CString strTable,CStringArray& Result)
{
    if(OpenTable(strTable)!=0)
    {
        Result.RemoveAll();
        _variant_t value;
        for(int i=0;i<m_nResultRow;i++)
        {  
            for(int j=0;j<m_nResultCol;j++)
            {
                value=m_pRecordset->Fields->Item[(long)(/*i*m_nResultCol+*/j)]->Value;
                if(value.vt==3||value.vt==14)
                {
                    CString strTrans;
                    strTrans.Format("%ld",value.intVal);
                    Result.Add(strTrans);
                }
                else
                    if(value.vt==7)
                    {
                        COleDateTime time = value.date;
                        CString strTemp;
                        strTemp.Format("%d-%d-%d %s",time.GetYear(),time.GetMonth(),time.GetDay(),time.Format("%H:%M:%S"));
                        Result.Add(strTemp);
                    }
                    else
                        Result.Add(value.bstrVal);//
            }
            m_pRecordset->MoveNext();
        }
        m_pRecordset->Close();
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

/////////////////////////////////////////////////////////////////////////////
///关闭结果集
/////////////////////////////////////////////////////////////////////////////
void CPData::CloseRecordset()
{
    if(m_pRecordset->State != adStateClosed)
        m_pRecordset->Close();
}
BOOL CPData::ExecuteTrans(CStringArray& aSql)
{
    try{
        int nNum = aSql.GetSize();
        m_pConnection->BeginTrans();
        for(int i=0;i<nNum;i++)
        {
            CString strSql = aSql.GetAt(i); 
            m_pConnection->Execute((_bstr_t)aSql.GetAt(i),NULL,adCmdText);
        }
        m_pConnection->CommitTrans();
        return TRUE;
    }
    catch(_com_error& e)
    {
        m_pConnection->RollbackTrans(); 
        AfxMessageBox(e.Description()+"F");
        return FALSE;
    }
}
分享到:
评论

相关推荐

    VC下利用ADO操作数据库类和文件目录操作类

    1. **ADO数据库操作**: - **连接数据库**:使用CADOConnection类建立与数据库的连接。需要设置ConnectionString属性,包含数据库类型、服务器地址、数据库名、用户名和密码等信息。 - **执行SQL语句**:创建...

    VC Ado数据库操作类(ado2)

    `VC ADO数据库操作类(ado2)`是一个专门为VC++设计的类库,简化了数据库操作,使开发者能够更加高效地处理数据库任务。 `ado2.cpp`和`ado2.h`是这个类库的核心文件,其中`ado2.cpp`包含了类库的实现细节,而`ado2.h`...

    VC++ 封装的Ado操作类

    封装类中,可能包括填充记录集、移动记录、添加新记录、更新和删除记录的方法。 4. **参数对象(Parameter Object)**:用于在命令对象中传递参数,常用于存储过程。 在`Ado.cpp`和`Ado.h`文件中,我们可以期待...

    VC与ADO数据库操作1.doc

    【VC与ADO数据库操作】 在VC++开发数据库应用程序时,ADO(ActiveX Data Objects)是一种常用的接口,它基于OLE DB,提供了一种高效且易于使用的数据访问方式。ADO简化了数据库交互,使得开发者无需深入理解底层的...

    VC MFC_ADO 数据库操作

    例如,“第21章 ADO数据库编程”很可能包含了一系列的实例,讲解如何使用MFC ADO进行数据库操作,包括连接数据库、执行查询、处理结果集等步骤。 总之,MFC ADO为VC程序员提供了一种高效、灵活的数据库访问方式,...

    VC封装ADO访问数据库的代码实例

    本代码实例将展示如何在VC++中通过MFC封装ADO来实现对数据库的操作。 首先,理解ADO的基本概念是非常重要的。ADO主要包含几个核心组件,如Connection、Command、Recordset和Field等。Connection对象用于建立与数据...

    VC下ADO访问数据库的类

    这个"VC下ADO访问数据库的类"源码是一个实用的工具,它封装了ADO的基本操作,方便开发者在VC项目中快速实现数据库的读写功能。 首先,我们需要了解ADO的核心组件。主要包括: 1. **Connection对象**:这是ADO的...

    VC访问数据库的ADO封装类

    ADO封装类是将ADO接口进行包装,以便于开发者更简单、直观地操作数据库。这篇文档将深入探讨如何在VC中使用ADO封装类来实现数据库的访问。 首先,ADO是.NET Framework的一部分,但在VC++环境下,我们通常使用的是...

    使用VC及ADO进行数据库编程

    在实现过程中,作者创建了一个名为`cRecorder`的自定义数据库类,该类封装了ADO的基本接口,包括建立数据库连接、执行SQL语句以及对记录的增删查改操作。`cRecorder`类的成员变量和函数包括用于存储和操作数据库信息...

    VC数据库操作类 ADO操作类

    总结来说,"VC数据库操作类 ADO操作类"是一个强大的数据库操作工具,它通过封装ADO接口,为VC++开发者提供了简单易用的数据库操作API,使得数据库操作更加便捷高效。同时,考虑到其对OFFICE文档的支持,它在数据导入...

    VC中操作ADO数据库资料.rar_VC ADO sql_sqlserver_vc ado sql server_vc sql

    2. **在VC中用ADO数据库编程**: 这部分内容可能涵盖了如何在VC项目中引入ADO库,创建ADO对象,以及如何编写代码来执行基本的数据库操作,如打开、关闭连接,执行SELECT、INSERT、UPDATE、DELETE等SQL语句。 3. **...

    vc++ADO数据库连接、.pdf

    描述:“vc++ADO数据库连接、.pdf”和标题相同,表明内容专注于VC++环境下如何操作ADO数据库连接,是具体实现数据库交互的技术文档。 标签:未提供标签信息。 部分内容提取的知识点如下: 1. ADO技术概述: ADO...

    VC结合ADO处理数据库图片.rar_LOD_VC 图片_Vc ado 数据库_ado 图片_数据库 图片

    首先,你需要包含必要的头文件,如`#include &lt;afxdb.h&gt;`,这将引入ADO的MFC封装类,如`CDatabase`和`CRecordset`。然后,创建一个`CDatabase`对象,设置正确的连接字符串(包括数据库路径、用户名、密码等信息),...

    VC++操作数据库ADO封装类

    整理文件发现,参考接口说明: http://www.vckbase.com/module/articleContent.php?id=469 ...源码基于win平台下的MFC 【名 称】: ADO 封装类. 【版 本】: 0.20 【作 者】: 成真 【E-mail】: anyou@sina.com

    ADO封装类文件 数据库访问

    在这个场景中,"ADO封装类文件 数据库访问"指的是在VC6.0环境下,已经编写完成的用于简化ADO操作的C++类库,包括两个文件:ADOConn.h和ADOConn.cpp。 **ADOConn.h** 文件通常会定义一个名为ADOConn的类,这个类是对...

    vc.net_ADO_MSSQL.RAR_SQL 封装类_SQL VC 学生_VC.NET 数据库_c++ ado访问类

    标题中的"vc.net_ADO_MSSQL.RAR_SQL 封装类_SQL VC 学生_VC.NET 数据库_c++ ado访问类"揭示了主要的技术栈和目标。VC++.NET是Microsoft的C++编译器与.NET框架的结合,用于构建Windows应用程序。ADO是Microsoft提供的...

    ADO.rar_ado封装类_vc ado

    "ADO操作封装类"可能是将上述ADO对象的功能进行包装,提供了一套面向对象的API,使得开发者可以通过更简洁的接口来完成数据库操作,例如创建连接、执行SQL、处理结果集等。封装类可能还包括错误处理、事务管理、性能...

    ADO封装类 VC操作数据库容易方便

    ADO封装类使得开发者能够更简单、方便地执行SQL语句并操作数据库,无需深入了解底层的数据库通信细节。本文将深入探讨如何使用ADO在VC++中进行数据库操作,并基于提供的文件`SqlServer.cpp`、`SqlServer.h`以及可能...

Global site tag (gtag.js) - Google Analytics