现在的位置: 首页 > 综合 > 正文

VC++ ADO访问数据库笔记

2013年03月12日 ⁄ 综合 ⁄ 共 3941字 ⁄ 字号 评论关闭

最近在做一个工具这个工具用来查看SQL SERVER, ACCESS,ORACLE及UDL文件连接的数据库内容的,程序中用到了ADO,工具基本功能已实现,下面把一些用ADO的心得写下来,供ADO初学者参考。


一、引入ADO库文件

使用ADO前需要在工程的stdafx.h文件或写ADO代码的类的头文件中用#import引入ADO库文件。例如,建一个对话框工程,取名Lx4,在CLx4Dlg.h文件里引入ADO库文件,也就是加上下面两句。

#import "c:/program files/common files/system/ado/msado15.dll" no_namespace rename ("EOF", "adoEOF")

#pragma warning(disable: 4786)

二、初始化OLE/COM库环境

可以在InitInstance ()或OnInitDialog()函数里,添加如下代码

::CoInitialize(NULL);

三、操作数据库

1、接口介绍

在对数据库操作之前,先来认识一下ADO库的三个接口。ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。_ConnectionPtr接口用来连接数据库,_RecordsetPtr接口用来获得记录集,、_CommandPtr接口暂不讨论,因为我的程序中没用到那个接口(嘿嘿,这个理由充分吗)。

声明两个变量,可以声明为类的成员变量或函数的局部变量,我是声明为成员函数的:

_ConnectionPtr      m_pConnection;

_RecordsetPtr   m_pRecordset;

2、连接数据库

 注意_ConnectionPtr _RecordsetPtr 接口在用之前必须初始化一下,很简单的,初始化可以放在构造函数里,下面来看初始化_ConnectionPtr 接口:

m_pConnection.CreateInstance("ADODB.Connection");

也可以用

m_pConnection.CreateInstance(__uuidof(Connection));

二者选一。

下面列出了连接三种数据库的语句

CString strConn;

连接SQL SERVER

strConn.Format("driver={SQL Server}; Server=%s; DATABASE=%s; UID=%s; PWD=%s", strServer, dbName, user, psw);

strServer是服务器名,如果访问本地数据库,可是设strServer = “172.0.0.1”或”.”;这是我试过的,都可以。

dbName是数据库名称,user, psw是用户名和密码。

连接ORACLE

strConn.Format("Provider=MSDAORA.1;Data Source=%s;", "%s", "%s", adModeUnknown, dbName, user, psw);

dbName, user, psw分别是数据库名,用户名,密码。

连接ACCESS(这里连接的是ACCESS2000及以上版本,此语句连接ACCESS97是不行的)

strConn.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist Security Info=False;Jet OLEDB:Database Password=%s", dbName, psw);

dbName是数据库路径名,如“F://DB//hermes.mdb”,psw是密码。

 

设置了连接语句,下面要和数据库进行连接了,对于上面三种数据库都是要执行下面这个连接的,下面语句是打一开连接的语句。

connPtr->Open((_bstr_t)strConn, "", "", adModeUnknown);

adModeUnknown:缺省。当前的许可权未设置
adModeRead:只读
adModeWrite:只写
adModeReadWrite:可以读写
adModeShareDenyRead:阻止其它Connection对象以读权限打开连接
adModeShareDenyWrite:阻止其它Connection对象以写权限打开连接
adModeShareExclusive:阻止其它Connection对象以读写权限打开连接
adModeShareDenyNone:阻止其它Connection对象以任何权限打开连接

连接UDL

CString strConnect = "File Name=" + udlDir;         
// 注意:Name="等号两边不能有空格

connPtr->Open((_bstr_t)strConnect, (_bstr_t)user, (_bstr_t)psw, adModeUnknown);    

字符串udlDir是udl文件路径,user和pssw是udl连接数据库的用户名和密码。

3、操作结果集

得到记录集:

m_pRecordset.CreateInstance("ADODB.Recordset");

m_pRecordset->Open(_bstr_t(l_strSQLConn),

              _variant_t((IDispatch*)m_pConnection, true),

              adOpenStatic, adLockOptimistic, adCmdText);

l_strSQLConn是select语句

遍历结果集:

while( !m_pRecordset->adoEOF)

{

       ……// 在这里添加操作结果集的代码如:

       strTemp = (LPCSTR)(_bstr_t)m_pRecordsetTable->GetCollect(_variant_t((long)i));// 得到某个字段的记录。

       m_pRecordset->MoveNext();

}

对数据库的操作一般使用异常机制。也就是try{…}catch(){..}

注意打开两个数据表时的问题:

一个_RecordsetPtr的对象用完后如果忘记关闭,再打开另一个表时就会出错。所以如果要打开两个表的话,先打开一个表,用完后关闭记录集,并置NULL,再m_pRecordset.CreateInstance("ADODB.Recordset");这样就可以打开另一个表了。

四、关闭记录集和连接

关闭记录集:

m_pRecordsetTable->Close();

m_pRecordsetTable = NULL;

关闭连接:

m_pConnection->Close();

m_pConnection = NULL;

释放环境  

::CoUninitialize();

 

附加:

我写了三个函数,分别得到指定表的字段数,指定字段的字段名及字段大小

// 得到字段数

int CLx4Dlg::GetFieldsCount(_RecordsetPtr RcdPtr)  

{  

       int nCount=0;

       if(NULL != RcdPtr)

       {  

              nCount = RcdPtr->GetFields()->Count;  

       }

       return nCount;  

}

// 得到字段名

BOOL CLx4Dlg::GetFieldsName(_RecordsetPtr RcdPtr, int nField, CString & strFieldName)  

{  

       if(NULL == RcdPtr || nField >= RcdPtr->GetFields()->Count)return FALSE;

       _variant_t vt((long)nField);

       strFieldName.Format(_T("%s"), (char*)(RcdPtr->GetFields()->Item[vt]->Name));

       return true;

}

 

// 得到字段大小

int CLx4Dlg::GetFieldsSize(_RecordsetPtr RcdPtr, int nField)  

{  

       if(NULL == RcdPtr || nField >= RcdPtr->GetFields()->Count)return FALSE;

       _variant_t vt((long)nField);

       int nSize = RcdPtr->GetFields()->Item[vt]->DefinedSize;          // 返回已声明的字段大小

       //int nSize = RcdPtr->GetFields()->Item[vt]->ActualSize;   // 返回给定字段中数据的实际大小

       return nSize;

}

 

SQL 语句:

得到SQL SERVER的所有用户类型的表

select name from sysobjects where xtype='U'

得到ORACLE的所有用户表

select tname from tab where tabtype='TABLE'

得到ACCESS的所有用户建的表

SELECT Name FROM MSysObjects WHERE Flags=0 AND Type=1

 

网上讲ADO的教程很多,光看教程不去亲手做做是掌握不了的,我觉得代码最能说明问题,需要代码可以发EMAIL给我,我的Email:hz_yong@hotmail.com,还有,不足之处请多多指教。
 

抱歉!评论已关闭.