一、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、我只介绍我用到的接口,上面是初始化系统环境,下面声明一个接口
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")); } |