日期:2014-05-16  浏览次数:20582 次

读书笔记——数据库的ADO开发总结

基本上是对 ADO+开发指南.pdf 的摘抄和总结,以及个人心得。

文章末尾有《ADO+开发指南.pdf》的资源下载,附带个人批注。

------------------------------------------------

ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术。(话说已经不是新的了?)

ADO数据库开发的基本流程:
(1)初始化COM库,引入ADO库定义文件
(2)用Connection对象连接数据库
(3)利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理。
(4)使用完毕后关闭连接释放对象。


1 初始化

AfxOleInit();

2 引入ADO类型库(路径是具体情况而定)

#import "c:\program files\common files\system\ado\msado15.dll"

no_namespace rename("EOF","adoEOF")

3 创建Connection对象并连接数据库

_ConnectionPtr m_pConnection;

HRESULT hr;

try
{
    hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
    if(SUCCEEDED(hr))
    {
        hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb","","",adModeUnknown);///连接数据库
    }
}
catch(_com_error e)///捕捉异常
{
    CString errormessage;
    errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
    AfxMessageBox(errormessage);///显示错误信息
}

在这段代码中我们是通过Connection对象的Open方法来进行连接数据库的,下面是该方法的原型

HRESULT Connection15::Open ( _bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options );
ConnectionString为连接字串,UserID是用户名, Password是登陆密码,Options是连接选项,用于指定Connection对象对数据的更新许可权,
Options可以是如下几个常量:
adModeUnknown:缺省。当前的许可权未设置
adModeRead:只读
adModeWrite:只写
adModeReadWrite:可以读写
adModeShareDenyRead:阻止其它Connection对象以读权限打开连接
adModeShareDenyWrite:阻止其它Connection对象以写权限打开连接
adModeShareExclusive:阻止其它Connection对象以读写权限打开连接
adModeShareDenyNone:阻止其它Connection对象以任何权限打开连接

这里要注意的是连接字串是可以用udl文件来生成。这个文中没有说,而是列举了许多连接串的例子,很是误导人。

Connection对象中两个有用的属性ConnectionTimeOut与State。

//设置连接的超时时间在Open之前调用
m_pConnection->ConnectionTimeout = 5;///设置超时时间为5秒
m_pConnection->Open("Data Source=adotest;","","",adModeUnknown);
//指明当前Connection对象的状态,0表示关闭,1表示已经打开
if(m_pConnection->State)
m_pConnection->Close(); ///如果已经打开了连接则关闭它
4 执行SQL命令并取得结果记录集

定义一个指向Recordset对象的指针,并为其创建Recordset对象的实例:

_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance("ADODB.Recordset");

SQL命令的执行可以采用多种形式

(1)利用Connection对象的Execute方法

原型如下

_RecordsetPtr Connection15::Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options )
其中返回值是一个指向记录集的指针,CommandText是命令字串,通常是SQL命令。参数RecordsAffected是操作完成后所影响的行数, 参数Options表示CommandText中内容的类型,Options可以取如下值之一:
adCmdText:表明CommandText是文本命令
adCmdTable:表明CommandText是一个表名
adCmdProc:表明CommandText是一个存储过程
adCmdUnknown:未知

_variant_t RecordsAffected;
m_pConnection->Execute("CREATE TABLE users(ID INTEGER,username TEXT,old INTEGER,birthday DATETIME)",&RecordsAffected,adCmdText);
m_pConnection->Execute("INSERT INTO users(ID,username,old,birthday) VALUES (1, 'Washington',25,'1970/1/1')",&RecordsAffected,adCmdText);
m_pConnection->Execute("UPDATE users SET old = old+1",&RecordsAffected,adCmdText);
_variant_t RecordsAffected;
m_pRecordset = m_pConnection->Execute("SELECT COUNT(*) FROM users",&RecordsAffected,adCmdText);
_variant_t vIndex = (long)0;
_variant_t vCount = m_pRecordset->GetCollect(vIndex);
m_pRecordset->Close();///关闭记录集
CString message;
message.Format("共有%d条记录",vCount.lVal);
AfxMessageBox(message);///显示当前记录条数
(2)利用Command对象来执行SQL命令