c++ADO编程-connection对象

Connection对象的属性有如下几个:

1.ConnectionString属性:是连接字符串,通过传递包含一系列由分号分隔的“argument=value”语句的详细连接字符串,可指定用于建立连接数据源的信息。连接串格式根据数据源的不同有所不同。

2.Open方法:建立到数据源的物理连接。

Open函数详细定义:

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

参数意义:

ConnectionString :可选,类型为字符串,包含连接信息,如果设置了ConnectionString属性,该参数可以不设置

UserID:可选,字符串,包含建立连接时所使用用户名,如果没有用户名,可以不设置

Password:可选,字符串,包含建立时所使用的密码。如果没有密码,可以不设置

Option:可选,决定该方法是在连接建立之后(异步)还是连接建立之前(同步)返回,

其值定义如下

enum __declspec(uuid("00000541-0000-0010-8000-00aa006d2ea4"))
ConnectOptionEnum
{
    adConnectUnspecified = -1,  //已同步方式连接数据库
    adAsyncConnect = 16         //以异步方式连接数据库
};

Option,还有一种解释:

enum __declspec(uuid("00000521-0000-0010-8000-00aa006d2ea4"))
ConnectModeEnum
{
    adModeUnknown = 0,          //缺省。当前的许可权未设置
    adModeRead = 1,             //只读
    adModeWrite = 2,            //只写
    adModeReadWrite = 3,        //读写方式打开
    adModeShareDenyRead = 4,    //阻止其它Connection对象以读权限打开连接
    adModeShareDenyWrite = 8,   //阻止其它Connection对象以写权限打开连接
    adModeShareExclusive = 12,  //阻止其它Connection对象以读写权限打开连接
    adModeShareDenyNone = 16,   //阻止其它Connection对象以任何权限打开连接
    adModeRecursive = 4194304   //
};

3.ConnectionTimeout属性:该属性指示在终止尝试和产生错误前建立连接期间所等待的时间。该属性值为长整型数,单位s,默认值为15。如果设为0,则ADO无限等待直到打开。需要在Open之前调用。

m_pConnection->ConnectionTimeout = 5;///设置超时时间为5秒

4.State属性:指明当前Connection对象的状态,0表示关闭,1表示已经打开,我们可以通过读取这个属性来作相应的处理,例如:

if(m_pConnection->State)
m_pConnection->Close(); ///如果已经打开了连接则关闭它
状态值有如下定义

enum __declspec(uuid("00000532-0000-0010-8000-00aa006d2ea4"))
ObjectStateEnum
{
    adStateClosed = 0,      //关闭状态
    adStateOpen = 1,        //打开状态
    adStateConnecting = 2,  //连接状态
    adStateExecuting = 4,   //执行状态
    adStateFetching = 8     
};

5.Execute方法:函数原型

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

其中CommandText是命令字串,通常是SQL命令。参数RecordsAffected是操作完成后所影响的行数, 参数Options表示CommandText中内容的类型,Options 其值定义如下

enum __declspec(uuid("0000052e-0000-0010-8000-00aa006d2ea4"))
CommandTypeEnum
{
    adCmdUnspecified = -1,
    adCmdUnknown = 8,       //表明CommandText内容未知
    adCmdText = 1,          //表明CommandText是文本命令,即SQL语句
    adCmdTable = 2,         //表明CommandText是一个表名
    adCmdStoredProc = 4,    //表明CommandText是一个存储过程
    adCmdFile = 256,        //
    adCmdTableDirect = 512
};

返回值:
Execute()函数执行完后返回一个指向记录集的指针

6.Close方法:用来关闭到数据源的连接,访问数据库完成后,关闭连接,释放有关联的系统资源。关闭对象并不代表将它从内存中删掉,可以更改它的属性设置然后再次打开它。

数据库建立连接实例:

#include "stdafx.h"
#include "DataBase.h"

#import "C:\Program Files\Common Files\system\ado\msado15.dll" \
no_namespace rename("EOF", "adoEOF") rename("BOF", "adoBOF")

int main()
{
    ::CoInitialize(NULL);
    _ConnectionPtr  m_pConnection;
    _RecordsetPtr   m_pRecordSet;
    try
    {
        m_pConnection.CreateInstance(__uuidof(Connection));
        m_pRecordSet.CreateInstance(__uuidof(Recordset));
        assert(NULL != m_pConnection);
        assert(NULL != m_pRecordSet);
        if (NULL == m_pRecordSet
            || NULL == m_pConnection)
        {
            cout << "创建实例失败" << endl;
            return -1;
        }

        m_pConnection->CommandTimeout = 5;
        m_pConnection->ConnectionString = "Provider=SQLOLEDB.1;Password=123456;Persist Security Info=True;User ID=sa;Initial Catalog=sample_db;Data Source=127.0.0.1";
        m_pConnection->Open("","", "", adConnectUnspecified);
        assert(m_pConnection->GetState() == adStateOpen);
        if (m_pConnection->GetState() != adStateOpen)
        {
            cout << "连接失败" << endl;
        }

        _variant_t var;
        m_pRecordSet = m_pConnection->Execute("Select * from AccountsInfo", &var, adCmdText);
        cout << (int)var << endl;
        cout << m_pRecordSet->GetFields() << endl;
        string szLogonID = (_bstr_t)m_pRecordSet->GetCollect("LogonID");
        string szNickName = (_bstr_t)m_pRecordSet->Fields->GetItem("NickName")->Value;
        cout << szLogonID  << endl;
        cout << szNickName << endl;

    }
    catch (_com_error& e)
    {
        cout << e.Description() << endl;
    }

    ::CoUninitialize();
    return 0;
}

注意:
1.Recordset对象和Command对象使用Open方法的第二个参数要用到_ConnectionPtr.GetInterfacePtr()函数返回值

2.执行Execute方法。m_pConnectionPtr->Execute(_bstr_t(sql),&RecordsAffected,adCmdText);其中RecordsAffected为_variant_t对象。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值