日期:2014-05-16 浏览次数:20582 次
基本上是对 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对象对数据的更新许可权,
这里要注意的是连接字串是可以用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可以取如下值之一:
_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命令