一、 导入ADO动态连接库
在工程的stdafx.h中加入以下语句:
#import "c:\program files\commonfiles\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
二、连接数据库
新建一个类,用来专门处理数据库的连接和各种操作
ADO库包含三个基本接口:_ConnectionPtr接口,_CommandPtr接口,_RecordsetPtr接口。这些都是智能指针,和普通的指针一样,也需要定义指针变量、创建其实例,然后就可以调用它的方法和属性。不同的是,改只能指针最后是自动进行内存释放的,调用Close方法就可以了。
1、_ConnectionPtr接口:该接口返回一个记录集或一个空指针,通常用它来创建一个数据库连接,或执行一条不返回任何结果的SQL语句,不推荐用它来返回一个记录集
2、_CommandPtr接口:返回一个记录集,提供一种简单的方法来执行返回记录集的存储过程和SQL语句。
3、_RecordsetPtr接口:是一个记录集对象,对记录集提供更多的控制功能,多用于得到查询操作的返回结果。
在类中新建上述上个接口的变量
_ConnectionPtr m_pConnection;
m_pConnection.CreateInstance(__unidof(Connection));
//m_pConnection.CreateInstance(“ADODB.Connection”); //第二种方法
_CommandPtr m_pCommand;
_RecordsetPtr m_pRecordset;
新建一个函数,专门用于数据库的连接
_bstr_t strSQL="Provider=Microsoft.Jet.OLEDB.4.0;DataSource=test.mdb";
try
{
m_pConnection.CreateInstance("ADODB.Connection");
m_pConnection->Open(strSQL,"","",adModeUnknown);
}
catch(_com_errore)
{
AfxMessageBox(e.ErrorMessage());
}
关闭连接
m_pConnection->Close();
m_pConnection=NULL;
三、 数据库的操作
1 查询:
一般用_RecordsetPtr才完成查询操作,并存储得到的结果
HRESULT Recordset15::Open (const _variant_t & Source,
const_variant_t & ActiveConnection,
enumCursorTypeEnum CursorType,
enumLockTypeEnum LockType,
long Options ) ;
参数Source:为_variant_t类型的引用,可以为有效的Command对象、SQL语句、表名、存储过程调用等。
参数ActiveConnection:为_variant_t类型的引用,为已经建立好的连接。
参数CursorType:用于设置在打开Recordset时提供者应使用的游标类型,它可取CursorTypeEnum 中的任一值,默认值为adOpenForwardOnly。
参数 LockType:用于设置在打开Recordset时提供者应使用的锁定类型,它可取枚举LockTypeEnum中的任一值,默认值为adLockReadOnly。
参数 Options:用于设置获取Source(即Open第一个参数)的方式,其类型long。
例如:m_pRecordset.CreateInstance(__uuidof(Recordset));
try
{
m_pRecordset->Open("select* from lesson",
m_pConnection.GetInterfacePtr(),//采用已经建好的连接
adOpenDynamic,adLockOptimistic,adCmdText);
_variant_t var;
while(!m_pRecordset->adoEOF) //遍历结果集中的内容
{
var=m_pRecordset->GetCollect("id");//根据表名来获得内容
if(var.vt != VT_NULL)
id =(LPCSTR)_bstr_t(var); //获得表项的内容
m_pRecordset->MoveNext();//指针向下移动
}
}
catch(_com_error e)
{
AfxMessageBox(e.ErrorMessage());
}
2 添加
三种方法:一、用m_pConnection的Open方法;二、用m_pRecordset的Addnew 方法。三、用m_pCommand执行
用m_pConnection的Open方法
_variant_t RecordsAffected;
try
{
CStringstr;
str.Format("insert…………");//插入的SQL语句
m_pConnection->Execute(_bstr_t(str),&RecordsAffected,adCmdText);
}
catch(_com_errore)
{
AfxMessageBox(e.ErrorMessage());
}
用m_pRecordset的Addnew 方法:
m_pRecordset.CreateInstance(__uuidof(Recordset));
try
{
m_pRecordset->Open("select * from tab",
m_pConnection.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,adCmdText);//获得表
m_pRecordset->AddNew(); //添加操作
m_pRecordset->PutCollect(字段名,新值); //添加表的元素
m_pRecordset->Update(); //执行更新,成功插入
}
catch(_com_errore)
{
AfxMessageBox(e.ErrorMessage());
}
用m_pCommand执行:
m_pCommand.CreateInstance("ADODB.Command");
m_pCommand->ActiveConnection = m_pConnection; //关键的一句,将建立的连接赋值给它
m_pCommand->CommandText=“”; //SQL语句
m_pCommand->Execute(NULL,NULL,adCmdText);
用m_pConnection的Open方法:
和添加的m_pConnection方法一样,只需要修改SQL语句
m_pRecordset方法:
m_pRecordset.CreateInstance(__uuidof(Recordset));
try
{
m_pRecordset->Open("select * from tab where ……",
m_pConnection.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,adCmdText);//获得要删除的内容
if(!m_pRecordset->adoEOF)
{
m_pRecordset->MoveFirst();//用来定位
m_pRecordset->Delete(adAffectCurrent);//根据位置删除
//注:这里根据自己的需要进行操作,如果有多个结果,则要循环获得下标进行删除
}
}
catch(_com_errore)
{
AfxMessageBox(e.ErrorMessage());
}
m_pCommand方法:只需要修改SQL语句即可
4 修改
m_pConnection方法:和添加的m_pConnection方法一样,只需要修改SQL语句
m_pRecordset方法:
m_pRecordset.CreateInstance(__uuidof(Recordset));
try
{
m_pRecordset->Open("select * from tab ……",
m_pConnection.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,adCmdText);//获得想要修改的内容
if(!m_pRecordset->adoEOF)
{
m_pRecordset->MoveFirst();//定位,位置自己确定
m_pRecordset->PutCollect(字段名,新值);
m_pRecordset->Update();
}
}
catch(_com_errore)
{
AfxMessageBox(e.ErrorMessage());
}
m_pCommand方法:只需要修改SQL语句即可
注:在此总结,方便自己加深理解,真正掌握,以免以后碰到同样的问题依旧从头开始,浪费时间。