Cancel 方法范例 (VC++/ADO)

原创 2007年10月09日 09:24:00
 

本范例使用 Cancel 方法,在连接繁忙时取消在 Connection 对象上执行的命令。

#import "C:/Program Files/Common Files/System/ADO/msado15.dll" /
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include<conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) com_issue_error(x);};
void CancelX();
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CancelX();

    ::CoUninitialize();
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      CancelX Function                                 //
//                                                       //
///////////////////////////////////////////////////////////

void CancelX()
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
     _ConnectionPtr pConnection = NULL;

     //Define Other Variables
    HRESULT  hr = S_OK;
    _bstr_t strCmdChange;
    _bstr_t strCmdRestore;
    BOOL booChanged = FALSE;

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
    "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // open a connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open(strCnn,"","",NULL);

        // Define command strings.
        strCmdChange = "UPDATE Titles SET type = 'self_help' "
        "WHERE type = 'psychology'";

        strCmdRestore = "UPDATE Titles SET type = 'psychology' "
        "WHERE type = 'self_help'";

        // Begin a transaction, then execute a command asynchronously.
        pConnection->BeginTrans();
        pConnection->Execute(strCmdChange,NULL,adAsyncExecute);

        // do something else for a little while - this could be changed
        for (int i = 1; i<=10 ;i++) 
        {
            i = i + i;
            printf("%d/n", i);
        }

        // If the command has NOT completed, cancel the execute
        // and roll back the transaction. Otherwise, commit the
        // transaction.
        if ((pConnection->GetState()) && (adStateExecuting))
        {
            pConnection->Cancel();
            pConnection->RollbackTrans();
            booChanged = FALSE;
            printf("Update canceled./n");
        }
        else
        {
            pConnection->CommitTrans();
            booChanged = TRUE;
            printf("Update complete./n");
        }

        // If the change was made, restore the data
        // because this is a demonstration.
        if (booChanged)
        {
            pConnection->Execute(strCmdRestore,NULL,0);
            printf("Data restored./n");
        }
        // Cleanup object before exit    
        pConnection->Close ();
    }

    catch(_com_error &e)
    {
        // Notify user of any errors that result from
        // executing the query.
        // Pass a connection pointer accessed from the Connection.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x/t%s/n", pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.  
    printf("Error/n");
    printf("/tCode = %08lx/n", e.Error());
    printf("/tCode meaning = %s/n", e.ErrorMessage());
    printf("/tSource = %s/n", (LPCSTR) bstrSource);
    printf("/tDescription = %s/n", (LPCSTR) bstrDescription);
}

VC使用ADO访问sql server数据库

软件:vs2010、sql server2005 代码如下: #include #include using namespace std; //1、添加对ADO的支持 #import "C...
  • woshiyuanlei
  • woshiyuanlei
  • 2015年05月31日 13:37
  • 1493

VC数据库编程 ADO示例

1. 生成应用程序框架并初始化OLE/COM库环境    创建一个标准的MFC AppWizard(exe)应用程序,然后在使用ADO数据库的InitInstance函数中初始化OLE/COM库...
  • u011068464
  • u011068464
  • 2013年10月03日 18:28
  • 1161

C++ ADO方式连接mysql数据库

对于软件开发其实说白了就是在不停地和数据打交道, 所以数据库的操作是必不可少的, 接下来介绍VC开发中利用ADO建立ODBC数据源来访问MySQL数据库.        从我接触的数据库编程方式来说,...
  • lbcab
  • lbcab
  • 2016年05月06日 10:02
  • 4058

VC++下使用ADO操作数据库的智能指针_ConnectionPtr、_RecordsetPtr、_CommandPtr的方法

(1)、引入ADO类 #import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename ("EOF...
  • hlbwp
  • hlbwp
  • 2014年03月16日 11:05
  • 1126

VC++下使用ADO操作数据库的智能指针_ConnectionPtr、_RecordsetPtr、_CommandPtr的方法

(1)、引入ADO类 1 2 3 #import "c:\program files\common files\system\ado\msado15.dll" ...
  • fengzhishang2019
  • fengzhishang2019
  • 2012年08月21日 11:43
  • 21768

VC++中使用MFC通过ADO连接数据库方法小结

查看文章     MFC用ADO连接数据库 2008-06-30 19:07 参考文章:http://www.vckbase.com/...
  • chaoyuan899
  • chaoyuan899
  • 2012年05月27日 17:30
  • 986

vc++中ado连接数据库的方法及详细介绍

VC用ADO访问数据库全攻略,介绍了VC用ADO来访问数据库的各个对象及各方法,很经典,也很实用,很值得一看。   正文 一、ADO概述 ADO是Microsoft为最新和最强大的数据访问范例...
  • xgx198831
  • xgx198831
  • 2011年09月23日 09:58
  • 5640

VC++下使用ADO操作数据库的智能指针_ConnectionPtr、_RecordsetPtr、_CommandPtr的方法

1、引入ADO类 1 2 3 #import "c:\program files\common files\system\ado\msado15.dll" \ no_names...
  • fulminate
  • fulminate
  • 2013年03月17日 10:55
  • 641

VC++ ADO调用存储过程方法

约定: 斜体字体表示可变部分   斜体 红色字体表示固定部分   红体   以下步骤的前提条件:COM ADO库已初始化,已经设置_ConnectionPtr连接对象。   步骤一: 创...
  • suxinpingtao51
  • suxinpingtao51
  • 2012年10月20日 23:06
  • 4634

VC++ MFC SQL ADO数据库访问技术使用的基本步骤及方法

1.首先,要用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序(DLL、EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dll...
  • etherlai
  • etherlai
  • 2013年08月08日 15:19
  • 1042
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Cancel 方法范例 (VC++/ADO)
举报原因:
原因补充:

(最多只允许输入30个字)