ADO连接详解
1. 准备工作
首先要引入msado15.dll以便编译器能够识别,引入方法是:
#import "C:\program files\commonfiles\system\ado\msado15.dll"no_namespace rename("EOF", "adoEOF")
注意,末尾没有分号。
引入的位置是stdafx.h
由于ADO是一个COM组件,所以在调用他们之前要初始化COM环境。初始化OLE,在方法**App::InitInstance()中进行(必须在DoModal()之前),
MFC中初始化方法是调用AfxOleInit()函数
非MFC环境使用
::CoInitialize(NULL);
然后在退出的时候加
::CoUninitialize();
当然也可以在你调用前初始化。 初始化后,系统会生成两个文件:msado15.tlh和ado15.tli,这些都是COM组件所需的。
引入后,便可以使用ADO库中的接口,分别是:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口,三个接口分别介绍如下:
_ConnectionPtr接口:返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。如果使用 _ConnectionPtr接口返回一个记录集不是一个好的方法。对于要返回记录的操作通常用_RecordserPtr来实现。而用 _ConnectionPtr操作时要想得到记录条数得遍历所有记录,而用_RecordserPtr时不需要。
_CommandPtr接口:返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,你可以利用全局 _ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果你只执行一次或几次数据访问操作,后者是比较好的选择。但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr接口执行存储过程和SQL语句。
_RecordsetPtr接口:是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给 _RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程和SQL语句。
2. 创建ADO连接
首先创建_PconnectionPtr对象m_pConnection采用如下方法:
m_pConnection.CreateInstance(__uuidof(Connection));此处括号里也可以这样,两者都能通过// ("ADODB.Connection");
调用Open函数打开连接
m_pConnection->Open((_bstr_t)strSQL,"","",adModeUnknown);
其函数原型为:
HRESULTConnection15::Open ( _bstr_tConnectionString,_bstr_tUserID, _bstr_t Password, long Options );
其中参数如下:
ConnectionString,针对不同的数据库,字段不同;
UserID,即用户名;
Password,密码;
optinons,参数分别如下所示:
ConnectionString参数:
Acess2003:strSQL=”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=**.mdb”
Acess2007:strSQL=”Provider=Microsoft.ACE.OLEDB.12.0;Data Source=**.accdb”
Acess2010:strSQL=”Provider=Microsoft.ACE.OLEDB.14.0;Data Source=**.accdb”
Options参数:
Constant | Value | Description |
adModeUnknown | 0 | Permissions have not been set or cannot be determined. |
adModeRead | 1 | Read-only. |
adModeWrite | 2 | Write-only. |
adModeReadWrite | 3 | Read/write. |
adModeShareDenyRead | 4 | Prevents others from opening a connection with read permissions. |
adModeShareDenyWrite | 8 | Prevents others from opening a connection with write permissions. |
adModeShareExclusive | 12 | Prevents others from opening a connection. |
adModeShareDenyNone | 16 | Allows others to open a connection with anypermissions. |
adModeRecursive | 0x400000 | Used withadModeShareDenyNone,adModeShareDenyWrite, oradModeShareDenyRead to set permissions on all sub-records of the current Record. |
0为默认,表示许可权未设置
3. 判断连接状态
Connection对象除Open()方法外还有许多方法,我们先介绍Connection对象中两个有用的属性ConnectionTimeOut与State。ConnectionTimeOut用来设置连接的超时时间,需要在Open之前调用,例如:
m_pConnection->ConnectionTimeout = 5;///设置超时时间为5秒
m_pConnection->Open("Data Source=adotest;","","",adModeUnknown);
State属性指明当前Connection对象的状态,0表示关闭,1表示已经打开,我们可以通过读取这个属性来作相应的处理,例如:
if(m_pConnection->State)
m_pConnection->Close(); ///如果已经打开了连接则关闭它