MFC中用ADO连接数据库

一、ADO简介 
        ADO(ActiveX   Data   Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE   DB之上的高层数据库访问技术,请不必为此担心,即使你对OLE   DB,COM不了解也能轻松对付ADO,因为它非常简单易用,甚至比你以往所接触的ODBC   API、DAO、RDO都要容易使用,并不失灵活性。本文将详细地介绍在VC下如何使用ADO来进行数据库应用程序开发,并给出示例代码。 

用ADO前必须在工程的stdafx.h头文件里用直接引入符号#import引入ADO库文件,以使编译器能正确编译。
   ADO库是一组COM动态库,这意味应用程序在调用ADO前,必须初始化OLE/COM库环境。在MFC应用程序里,一个比较好的方法是在应用程序主类的InitInstance成员函数里初始化OLE/COM库环境。
   然后ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口
   下面是编程步骤:
   1、在StdAfx.h加入:

#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")

   2、初始化OLE/COM库,这个在应用程序类的InitInstance函数里面添加即可

if (!AfxOleInit())
    {
        AfxMessageBox("OLE init Error");
        return FALSE;
    }

我在网上看到还需要添加如下代码初始化com库

CoInitialize(NULL);//CoInitializeEx(NULL);

但是我并没有添加,却连接数据库成功,可能是和上面的初始化有相同的功能,或者AfxOleInit初始化时候调用了CoInitializeEx,不过如果在多线程下貌似需要在每个线程调用CoInitializeEx,等我后面用到了,在更新文章
   3、我只介绍我用到的接口,上面是初始化系统环境,下面声明一个接口

_ConnectionPtr pConn;

   4、打开链接

    const _bstr_t strSRC= "Driver={SQL Server};PROVIDER=SQLOLEDB;Data Source=SVCTAG-D76XZ2X;Database=bridge;Uid=test;Pwd=test;";
    if (FAILED(pConn.CreateInstance("ADODB.Connection")))
    {
        AfxMessageBox("Create Instance failed!");
        exit(0);
    }
    try{
        pConn->Open(strSRC,"","",-1);
    }
    catch (_com_error &e)
    {
        AfxMessageBox(e.Description());
        exit(0);
    }

    5、到此与数据库的连接顺利建立,下面就是执行sql语句,获取结果了

int CBridgeSql::execSql(CString sql)
{
    COleVariant vtOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
    try
    {
        pConn->Execute(_bstr_t(sql),&vtOptional,adCmdText);
    }catch(_com_error &e){
        TRACE(sql);
        AfxMessageBox(e.Description());
        return -1;
    }
    return 0;
}

int CBridgeSql::execSql(CString sql,_RecordsetPtr &pRst)
{
    COleVariant vtOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
    try
    {
        pRst=pConn->Execute(_bstr_t(sql),&vtOptional,adCmdText);
    }catch(_com_error &e){
        TRACE(sql);
        AfxMessageBox(e.Description());
        return -1;
    }
    return 0;
}

调用代码如下

_RecordsetPtr pRst(__uuidof(Recordset));
sql_cmd.Format("select * from bridge");
execSql(sql_cmd,pRst);
while(!pRst->adoEOF)
{
     pRst->GetCollect("bridge_id").intVal;
     CString temp;
     temp.Format((_bstr_t)pRst->GetCollect("name"));
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值