最近在做一个工具这个工具用来查看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:[email protected],还有,不足之处请多多指教。