• ADO中最重要的对象有三个:Connection、Recordset和Command


     

    ConnectionPtr:

    _ConnectionPtr m_pConnection;
    HRESULT hr;
    try{
    hr = m_pConnection.CreateInstance(_uuidof(Connection));///创建Connection实例
    if(SUCCEEDED(hr)){
      m_pConnection->ConnectionTimeout=600;//设置连接超时时间
      m_pConnection->CommandTimeout=120;//设置执行命令超时时间
    hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=My.mdb","","",adModeUnknown);///连接数据库
    }
    }
    catch(_com_error e)///捕捉异常
    {
    CString errormessage;
    errormessage.Format("连接数据库失败! 错误信息:%s",e.ErrorMessage());
    AfxMessageBox(errormessage);///显示错误信息
    return FALSE;
    }
    // 关闭ADO连接状态
    if (m_pConnection->GetState() == adStateOpen)
    {
    m_pConnection->Close();
    }
    if (m_pConnection)
    {
    m_pConnection.Release();
    m_pConnection = NULL;
    }
     
    _RecordsetPtr:
    _RecordsetPtr m_pRecordset;
    m_pRecordset.CreateInstance("ADODB.Recordset");
    m_pRecordset->Open(bstrSQL,_variant_t((IDispatch*)pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
     
    if (m_pRecordset->GetState() == adStateOpen)
    {
    m_pRecordset->Close();
    }
    if (m_pRecordset)
    {
    m_pRecordset.Release();
    m_pRecordset = NULL;
    }
     
    _CommandPtr:
    _CommandPtr pCommandPtr;
    try
    {
    hr = pCommandPtr.CreateInstance(_uuidof(Command));
    if (SUCCEEDED(hr))
    {
    pCommandPtr->put_ActiveConnection(_variant_t((IDispatch*)pConnection,true));
    pCommandPtr->CommandText=_bstr_t(strinSQL);
    pCommandPtr->Execute(NULL,NULL,adCmdText);
    }
     
    }catch(_com_error *e)
    {
    return;
    }

    ADO中最重要的对象有三个:Connection、Recordset和Command,分别表示连接对象、记录集对象和命令对象。

    三个对象对应的智能指针分别是:_ConnectionPtr、_RecordsetPtr、_CommandPtr。

    ADO使用_ConnectionPtr这个指针来操纵Connection对象,类似地,后面用到的_CommandPtr和_RecordsetPtr分别表示命令对象指针和记录集对象指针。

    Connection对象是这三个对象的基础,它的主要作用是建立与数据库的连接,建立了与数据库的连接后,才能进行其它有关数据库的访问和操作。也就是说,使用ADO操作数据库,通常先用Connection对象的Open方法打开一个库连接,然后才能进行数据库的操作。操作完成后,要关闭这个库连接。

    本文只讲述Connection对象最常用的Open方法和Execute方法。

    注意:在使用ADO进行操作之前,必须使用AfxOleInit()函数来进行初始化;

    1. Open()方法

    用于打开一个库连接,而Execute()方法一般用于执行一条SQL语句。

    _ConnectionPtr智能指针的用法:

    首先定义一个Connection类型的指针,然后调用CreateInstance()来创建一个连接对象的实例,再调用Open()函数建立与数据源的连接。

    在建立连接对象后,可以使用连接对象的Execute()函数来执行SQL命令。

    _ConnectionPtr智能指针Open()方法的原型:

    Open(_bstr_t ConnectionString,_bstr_t UserID,_bstr_t Password,long Options)

    ConnectionString为连接字串,UserID是用户名,Password是登陆密码

    Options是连接选项,可以是如下几个常量:

        1> adModeUnknown 缺省,当前的许可权未设置

         2> adModeRead 只读

         3> adModeWrite 只写

         4> adModeReadWrite 可以读写

         5> adModeShareDenyRead 阻止其它Connection对象以读权限打开连接

         6> adModeShareDenyWrite 阻止其它Connection对象以写权限打开连接

         7> adModeShareExclusive 阻止其它Connection对象打开连接

         8> adModeShareDenyNone 阻止其它程序或对象以任何权限建立连接

    2. Execute方法

    函数原型:

    _RecordsetPtr Connection::Execute(_bstr_t CommandText,VARIANT* RecordsAffected,long Options)

    参数:

    CommandText是命令字串,通常是SQL命令,

    RecordsAffected是操作完成后所影响的行数

    Options表示CommandText中内容的类型,可以取下列值之一:

        1> adCmdText 表明CommandText是文本命令

        2>adCmdTable 表明CommandText是一个表名

        3>adCmdProc 表明CommandText是一个存储过程

        4>adCmdUnknown 未知

    Execute执行完后返回一个指向记录集的指针(_RecordsetPtr类型)

    3. 异常捕获

    出现的异常为:_com_error

    控件名称    ID                                            用途

    按钮           IDC_BTN_INSERT_INTO  执行INSERT INTO语句

    按钮           IDC_BTN_UPDATE             执行Update语句

    按钮           IDC_BTN_SELECT            执行SELECT语句

    列表框       IDC_LIST1                           显示SELECT语句执行结果

    void CConnPtr_Open_ExeDlg::OnBtnInsertInto()   

    {  

        _ConnectionPtr m_pConnection;  

        _variant_t RecordsAffected;  

    try  

        {  

            m_pConnection.CreateInstance(__uuidof(Connection));  

            m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);  

        }  

    catch(_com_error e)  

        {  

            CString errormessage;  

            errormessage.Format("连接数据库失败! 错误信息:%s",e.ErrorMessage());  

            AfxMessageBox(errormessage);  

    return;  

        }  

    try  

        {  

            _bstr_t strCmd="INSERT INTO Employees(EmployeeID,FirstName,LastName,HireDate,City,Country) VALUES(10,'Mary','Williams','15/4/1993 12:00:00','New York','USA')";  

            m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);  

        }  

    catch(_com_error &e)  

        {  

            AfxMessageBox(e.Description());  

        }  

    if(m_pConnection->State)  

        {  

            m_pConnection->Close();  

        }  

    }  

    双击IDC_BTN_UPDATE按钮,并编辑OnBtnUpdate()函数如下:


    void CConnPtr_Open_ExeDlg::OnBtnUpdate()   

    {  

        _ConnectionPtr m_pConnection;  

        _variant_t RecordsAffected;  

    try  

        {  

            m_pConnection.CreateInstance(__uuidof(Connection));  

            m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);  

        }  

    catch(_com_error e)  

        {  

            CString errormessage;  

            errormessage.Format("连接数据库失败! 错误信息:%s",e.ErrorMessage());  

            AfxMessageBox(errormessage);  

    return;  

        }  

    try  

        {  

            _bstr_t strCmd="UPDATE Employees SET FirstName='Bill',LastName='Clinton',HireDate='25/11/1994 12:00:00',City='Los Angeles' WHERE EmployeeID=10";  

            m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);  

        }  

    catch(_com_error &e)  

        {  

            AfxMessageBox(e.Description());  

        }  

    if(m_pConnection->State)  

        {  

            m_pConnection->Close();   

        }  

    }  

    双击IDC_BTN_SELECT按钮,并编辑OnBtnSelect()函数如下:


     

    void CConnPtr_Open_ExeDlg::OnBtnSelect()   

    {  

        _ConnectionPtr m_pConnection;  

        _variant_t RecordsAffected;  

        _RecordsetPtr m_pRecordset;  

    try  

        {  

            m_pConnection.CreateInstance(__uuidof(Connection));  

            m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);  

        }  

    catch(_com_error e)  

        {  

            CString errormessage;  

            errormessage.Format("连接数据库失败! 错误信息:%s",e.ErrorMessage());  

            AfxMessageBox(errormessage);  

    return;  

        }  

    try  

        {  

            m_pRecordset.CreateInstance("ADODB.Recordset"); //为Recordset对象创建实例  

            _bstr_t strCmd="SELECT EmployeeID,FirstName,LastName,HireDate,City FROM Employees WHERE City='London'";  

            m_pRecordset=m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);  

        }  

    catch(_com_error &e)  

        {  

            AfxMessageBox(e.Description());  

        }  

        _variant_t vEmployeeID,vFirstName,vLastName,vHireDate,vCity;  

    try  

        {  

    while(!m_pRecordset->adoEOF)  

            {  

                vEmployeeID=m_pRecordset->GetCollect(_variant_t((long)0));  

    //取得第1列的值,从0开始计数,你也可以直接列出列的名称,如下一行  

                vFirstName=m_pRecordset->GetCollect("FirstName");  

                vLastName=m_pRecordset->GetCollect("LastName");  

                vHireDate=m_pRecordset->GetCollect("HireDate");  

                vCity=m_pRecordset->GetCollect("City");  

                CString strtemp;  

    if(vEmployeeID.vt!=VT_NULL)  

                {  

                    strtemp.Format("%d",vEmployeeID.lVal);  

                }  

    if(vFirstName.vt!=VT_NULL)  

                {  

                    strtemp+=" ";  

                    strtemp+=(LPCTSTR)(_bstr_t)vFirstName;  

                }  

    if(vLastName.vt!=VT_NULL)  

                {  

                    strtemp+=" ";  

                    strtemp+=(LPCTSTR)(_bstr_t)vLastName;  

                }  

    if(vHireDate.vt!=VT_NULL)  

                {  

                    strtemp+=" ";  

                    strtemp+=(LPCTSTR)(_bstr_t)vHireDate;  

                }  

    if(vCity.vt!=VT_NULL)  

                {  

                    strtemp+=" ";  

                    strtemp+=(LPCTSTR)(_bstr_t)vCity;  

                }  

                m_list1.AddString(strtemp);  

                m_list1.AddString(" ");  

    //移动到下一条记录  

                m_pRecordset->MoveNext();  

            }  

        }  

    catch(_com_error &e)  

        {  

            AfxMessageBox(e.Description());  

        }  

        m_pRecordset->Close();  

        m_pRecordset=NULL;  

        m_pConnection->Close();   

        m_pConnection=NULL;  

    }  

    附加操作(重要):

    1> 在stdafx.h中加入如下语句:

    #import "C:Program FilesCommon Filessystemadomsado15.dll" rename("EOF","adoEOF")

    2> 在BOOL CConnPtr_Open_ExeApp::InitInstance()函数中加入:

    AfxOleInit();

    该部分演示了如何使用_ConnectionPtr接口开发ACCESS数据库:先创建一个Connection对象实例,然后用Open方法打开一个库连接,最后使用Execute方法执行SQL语句进行其它有关数据库的访问和操作。

    oracle连接字符串

    CString strConnect = _T("DRIVER=Oracle ODBC Driver;UID=xxx;PWD=xxx;DBQ=xxx;SERVER=xxx;QTO=F;");
    //CString strConnect = _T("Provider=OraOLEDB.Oracle;User ID=xxx;Password=xxx;Persist Security Info=True;Data Source=xxx");

    m_pConnection->ConnectionTimeout=600;//设置连接超时时间
      m_pConnection->CommandTimeout=120;//设置执行命令超时时间
     
    获取状态:
    m_pConnection->GetState() == adStateOpen
     
    关闭:
    m_pConnection->Close();
    m_pConnection.Release();
    m_pConnection = NULL;
     
     
    另:
    CommandPtr:
    _CommandPtr pCommandPtr;
    try
    {
    hr = pCommandPtr.CreateInstance(_uuidof(Command));
    if (SUCCEEDED(hr))
    {
    pCommandPtr->put_ActiveConnection(_variant_t((IDispatch*)pConnection,true));
    pCommandPtr->CommandText=_bstr_t(strinSQL);
    pCommandPtr->Execute(NULL,NULL,adCmdText);
    }
     
    }catch(_com_error *e)
    {
    return;
    }
     
    if (pCommandPtr)
    {
    pCommandPtr.Release();
    pCommandPtr = NULL;
    }
     
     
     
     
     
    ado调用存储过程:

     

     

    以下步骤的前提条件COM ADO库已初始化,已经设置_ConnectionPtr连接对象。

     

    步骤一: 创建 _CommandPtr 对象并初始化

     

         _CommandPtr pCommand;

    pCommand.CreateInstance(__uuidof(Command));

     

    步骤二:设置_CommandPtr 对象的属性

     

    1)设置连接字符串

    pCommand->ActiveConnection = < _ConnectionPtr 类型的变量>;//连接字符串

    例如:pCommand->ActiveConnection = m_OraDateBase.m_pConnection;

     

    2) 标记该操作为存储过程 (如果存储过程输出参数为记录集,忽略此步骤)

    pCommand->CommandType = adCmdStoredProc;

     

    3)设置PLSQLRSet属性(如果存储过程输出参数不是记录集,忽略此步骤)

    pCommand->Properties->GetItem("PLSQLRSet")->Value = true;

    步骤三:设置存储过程的输入/输出参数(如果没有输入参数忽略此步骤)

     

       1) 创建 _ParameterPtr对象并初始化

            _ParameterPtr pParam;

            pParam.CreateInstance(__uuidof(Parameter));

     

       2)设置_ParameterPtr对象的变量相关参数

         pParam = pCommand->CreateParameter(<变量名称>,

    <变量类型>,

    <创建类型>,

    <变量大小>);

       <变量名称> : 这个名称会在取数据的时候用到

       <变量类型> :变量类型可以参考以下网页:

      http://school.it168.com/special/manual/ado/index.htm?url=/special/manual/ado/html/mdidxparametervcppsyntax.htm

     

    <创建类型>:输入参数为:adParamInput 输出参数为:adParamOutput

    <变量大小> :例如int为4 , 字符串为字符串的长度

     

      例如:

     pParam = pCommand->CreateParameter(_bstr_t("GAMEID"),

    adInteger,

    adParamInput,

    4);

    pParam = pCommand->CreateParameter(_bstr_t("val"),

    adInteger,

    adParamOutput,

    4);

     

       3)设置传入的变量值 (如果是输出参数忽略此步骤)

        pParam->Value = _variant_t(< 变量值>);

    < 变量值> : 要设置的数值

     

    4)加入到Command对象的参数集属性中

    pCommand->Parameters->Append(< 参数对象名>);

    例如:

    pCommand->Parameters->Append(pParam);

     

    步骤四: 执行存储过程(返回记录集的情况)

    1)      设置要调用的存储过程名称

    pCommand->CommandText = _bstr_t(<存储过程名称>?);

    <存储过程名称>:为数据库中存储过程的名称

    ?的个数为输入参数的个数,例如有三个输入参数,调用格式如下:

    pCommand->CommandText = _bstr_t(<存储过程名称>?,?,?));

     

       如下图:

      

     

    3)      执行调用

    <记录集对象指针> =

    pCommand->Execute(NULL,NULL,adCmdStoredProc | adCmdUnspecified);

    例如:

    m_OraDateBase.m_pTempRecord = pCommand->Execute(NULL,NULL,adCmdStoredProc | adCmdUnspecified);

     

     

     

    步骤四: 执行存储过程(一般情况)

    1)      设置要调用的存储过程名称

         pCommand->CommandText = _bstr_t(<存储过程名称>);

    <存储过程名称>:为数据库中存储过程的名称

     

       如下图:

      



    例如:

    pCommand->CommandText = _bstr_t("RP_KEYWORDS_STATISTICS");

     

    2)      执行调用

     pCommand->Execute(NULL,NULL,adCmdStoredProc);

     

    步骤五:获取输出参数结果

     

    <变量名> = pCommand->Parameters->GetItem(<输出参数名>)->GetValue();

     

    <变量名> :为C++中接收输出值的变量名

    <输出参数名> :为设置输出参数时设置的变量名称

     

     

     

    完整调用示例:

    存储过程代码:

    create or replace procedure RP_KEYWORDS_STATISTICS

    (
        v_keywords varchar2
     )
       IS
         num number;

         begin
         select count(*) into num from t_keywords where c_keycontent=v_keywords;
         if num=then
         insert into t_keywords select sequence_keywords.nextval,v_keywords,from dual;
         elsif num>then
         update t_keywords set i_num=i_num+where c_keycontent=v_keywords;
         end if;
        
         commit;

     end RP_KEYWORDS_STATISTICS;

    C++ADO调用代码:

     

    void CExecuteSql::LogUserSearchKey(std::string strKey)

    {

        std::string strProcName;

        _CommandPtr pCommand;

        int iExpVal;

     

        try {

     

            pCommand.CreateInstance(__uuidof(Command));

     

            pCommand->ActiveConnection = m_OraDateBase.m_pConnection;//连接字符串

            pCommand->CommandType = adCmdStoredProc;//标记该操作为存储过程

     

            _variant_t vt;

            vt.SetString("2");

            _ParameterPtr pParam, pParam1;

            pParam.CreateInstance(__uuidof(Parameter));

            pParam = pCommand->CreateParameter(_bstr_t("keyval"),adChar,adParamInput,strKey.length());//给参数设置各属性

            pParam->Value = _variant_t( strKey.c_str() );

            pCommand->Parameters->Append(pParam);//加入到Command对象的参数集属性中

        

            pCommand->CommandText = _bstr_t("RP_KEYWORDS_STATISTICS");//存储过程名

     

            pCommand->Execute(NULL,NULL,adCmdStoredProc);

     

            //iExpVal = pCommand->Parameters->GetItem("val")->GetValue();

     

        } catch (_com_error e) {

            CString m_strErrMsg;

            m_strErrMsg.Format("LogUserSearchKey failure! message error:%s ",e.ErrorMessage());

            printf("%s ", m_strErrMsg.GetBuffer());

            IsDatabaseClose();

            iExpVal = 0;

            //shGameCoin = 0;

            return ;

        }

     

        return ;

    }

    oracle中limit offset 怎么实现

    select * from (select rownum rn,emp.* from emp) where rn between 5 and 10;




    ado事务处理
    m_pRecordset->LockType = adLockOptimistic;
    m_pRecordset->CursorType = adOpenDynamic;
    m_pRecordset->CursorLocation = adUseServer;


    m_pRecordset->Open(strSource, source, adOpenDynamic,
    adLockOptimistic, adCmdText);

    m_pConnection->BeginTrans();

    for(i =1; i<=5; i++)
    {
    str.Format("%d", i);
    m_pRecordset->AddNew();

    vIndex = (short)0;
    m_pRecordset->PutCollect(&vIndex, _variant_t(str + "_YOU"));

    vIndex = (short)1;
    m_pRecordset->PutCollect(&vIndex, _variant_t(str + "_I"));

    vIndex = (short)2;
    m_pRecordset->PutCollect(&vIndex, _variant_t(str + "_HE"));

    m_pRecordset->Update();
    }

    if(MessageBox("是否完成修改?", NULL, MB_ICONQUESTION | MB_YESNO)
    == IDYES)
    {
    m_pConnection->CommitTrans();
    }
    else
    {
    m_pConnection->RollbackTrans();
    }


     
  • 相关阅读:
    使用getattr() 分类: python基础学习 divide into python 2014-02-24 15:50 198人阅读 评论(0) 收藏
    使用locals()获得类,进行分发 分类: python 小练习 divide into python python基础学习 2014-02-21 14:51 217人阅读 评论(0) 收藏
    第1课第4.4节_Android硬件访问服务编写HAL代码
    第4.3节_Android硬件访问服务编写APP代码
    函数说明
    第1课第1节_编写第1个Android应用程序实现按钮和复选框
    vue生命周期
    程序代码中,怎么区分status和state?
    百度UEditor -- ZeroClipboard is not defined
    webstorm 设置ES6语法支持以及添加vuejs开发配置
  • 原文地址:https://www.cnblogs.com/liaocheng/p/4502510.html
Copyright © 2020-2023  润新知