一、ADO数据模型
1.ADO全称:
ActiveX Data Objects
2.ADO是面向对象的。是对当前微软所支持的数据库进行操作的最有效和最简单直接的方法,它是一种功能强大的数据访问编程模式,是对OLE DB的封装
二、ADO编程步骤:
1.在stdAfx.h文件中,导入使用的dll文件
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF") //导入ADO动态链接库
PS:1.上面的导入语句必须是同一行;
2.rename("EOF","adoEOF")指在导入dll的同时,将ADO以EOF结尾的修改为adoEOF,以避免与系统头文件定义的EOF重合;rename此属性用于类型库中的一个名称和系统头文件中的宏定义重合时。
2.初始化OLE(Object Linking and Embedding,对象连接与嵌入)/COM(组建对象模型)的库
//初始化
if(!AfxOleInit())
{
AfxMessageBox("OLE初始化错!");
return FALSE;
}
PS:OLE是建立在COM之上的技术,层次比COM要高。AfxOleInit()调用的是OleInitialize(),而OleInitialize()除了调用CoInitializeEx()来初始化COM库外,还进行一些其它的操作,这些操作对OLE应用来说是必须的,这些OLE应用包括:
(1)Clipboard;
(2)Drag and drop;
(3)Object linking and embedding(现在的OLE,已不再仅仅是Object linking and embedding的概念);
(4)In-place activation;
与AfxOleInit()对应的是,AfxOleTerm()。 CoInitialize和CoUninitialize必须成对使用,后者不必。
AfxOleInit()和AfxOleTerm()其实也是需要成对的,但是,在你的程序中,AfxOleTerm()可以不出现,这是因为,MFC已经帮你做好了
3.创建一个数据连接
_ConnectionPtr m_pConn;
m_pConn.CreateInstance("ADODB.Connection")
PS:通常使用_ConnectionPtr 来创建一个数据连接或执行一条不返回任何结果的SQL语句
adCmdText : CommandText是文本命令
adCmdTable : CommandText是一个表名
adCmdProc : CommandText是一个存储过程
adCmdUnknown : 未知
eg:
pConn->Execute("CREATE TABLE
users (ID INTEGER, username TEXT, old INTEGER, birthday DATETIME)",
&RecordsAffected , adCmdText);
4.打开数据库连接: Open (connectionstring , userID , password , options)
m_pConn->Open( "Provider=Microsoft.Jet.OLEDB.4.0; Data Source= C:\\test.mdb", “”,“", adModeUnknown);
connectionstring : 一个包含有关连接的信息的字符串值。
userID : 一个字符串值,建立连接时要使用的用户名称。
password : 一个字符串值,建立连接时要使用的密码。
options : 可选值,用于指定对数据的更新许可权
adModeUnknown:表示为默认权限值,包括常规的读写及修改等
Ps:当连接打开时,可以对数据源(即要操作的数据库)执行命令
==>数据库连接方法总结
==>完整样例代码:
//初始化
if(!AfxOleInit())
{
AfxMessageBox("OLE初始化出错!");
return FALSE;
}
_ConnectionPtr pConn;
if (FAILED(pConn.CreateInstance("ADODB.Connection")))
{
AfxMessageBox("Create Instance failed!");
return FALSE;
}
else
{
pConn ->Open( "Provider=Microsoft.Jet.OLEDB.4.0; Data Source= C:\\test.mdb", “”,“", adModeUnknown);
}
//执行SQL命令:CREATE TABLE创建表格users,users包含四个字段:整形ID,字符串username,整形old,日期型birthday
pConn->Execute("CREATE
TABLE
users
(ID INTEGER, username TEXT, old INTEGER, birthday DATETIME)",
&RecordsAffected
, adCmdText);
三、_CommandPtr接口和_RecordsetPtr(对象记录指针)
1._CommandPtr接口
1.1_CommandPtr接口与_ConnectionPtr的联系
_CommandPtr接口返回一个记录集。
它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。
在使用_CommandPtr接口时,你可 以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。
如果你只执行一次或几次数据访问操作,前者是比较好 的选择。
但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用 _CommandPtr接口执行存储过程和SQL语句。
1.2 _CommandPtr的使用步骤:
1.2.1 第一步
•定义一个 对象命令指针
_CommandPtr m_pCommand;
•
•创建一个实例
m_pCommand.CreateInstance(
"ADODB.Command“
);
1.2.2 第二步
•激活连接
m_pCommand->ActiveConnection
= pConn;
1.2.3第三步:
•输入命令字符串
m_pCommand->CommandText =
"SELECT * FROM users
•
1.2.4第四步:
•执行命令
_RecordsetPtr m_pRecordset = m_pCommand->Execute(
&vNULL,&vNULL,adCmdText
);
2._RecordsetPtr(对象记录指针)
2.1将执行结果存入记录集指针中
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance("ADODB.Command“);
m_pRecordset = pConn->Execute(“Select * from users ", &RecordsAffected, adCmdText);
2.2添加记录
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance("ADODB.Command“);
m_pRecordset->AddNew();
m_pRecordset->PutCollect(_variant_t("姓名"), _variant_t(m_strName));
m_pRecordset->PutCollect(_variant_t(“工作单位 "), _variant_t(m_strComName));
m_pRecordset->PutCollect(_variant_t(“单位地址 "), _variant_t(m_strComAddr));
//更新数据库-将新纪录存入数据库
m_pRecordset->Update();
}
2.3记录字段赋值
m_pRentRecordset->PutCollect(“ID”,_variant_t((long)21));
m_pRentRecordset->PutCollect(long(0),_variant_t((long)21));
•Index可以是字符串表示字段名,也可以是整型,表示字段对应的序号。
•pvar表示要写入的变量值。
3.关闭记录集及数据库
3.1关闭记录集
m_pRecordset-> close();
3.2关闭数据库连接
m_pConnection->close();
4.使用事务
4.1BeginTrans
初始化一个事务;其后必须有CommitTrans和/或RollbackTrans相呼应
4.2CommitTrans
提交一个事务,以完成对数据源的永久改变(要求使用之前必须调用了BeginTrans方法)
4.3RollbackTrans
取消一个事务,恢复对数据源做的临时性改变(要求使用之前必须调用了BeginTrans方法)
4.4代码实现
m_pConnection->BeginTrans();
for(i =1; i<=5; i++)
{
str.Format(“%d”, i);
m_pRecordset->AddNew();
m_pRecordset->PutCollect(“姓名”,
_variant_t(“小明”)));
m_pRecordset->Update();
}
if (State == true)//--某种情况满足时,修改数据库数据
{
m_pConnection->CommitTrans();
}
else//--否则,取消数据修改
{
m_pConnection->RollbackTrans();
}