VC++中ADO的操作:
1、先在stdAfx.h中添加支持库
// 加入ADO支持库
#import "c:/program files/common files/system/ado/msado15.dll" /
no_namespace /
rename ("EOF", "adoEOF")
2、连接数据库
*App.h上
// 定义ADO连接变量指针
_ConnectionPtr m_pConnection;
在*App.CPP InitInstance()中加入
// 初始化COM,创建ADO连接等操作
AfxOleInit();
m_pConnection.CreateInstance(__uuidof(Connection));
// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
// 因为它有时会经常出现一些想不到的错误。jingzhou xu
try
{
// 打开本地Access库Demo.mdb
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=文件名.mdb","","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox("数据库连接失败,确认数据库Demo.mdb是否在当前路径下!");
return FALSE;
}
pDoc->OpenDateBase();// 调用操作数据库的函数
3、在需要的地方对数据库进行操作
// 定义ADO连接、命令、记录集变量指针
_ConnectionPtr m_pConnection;
_CommandPtr m_pCommand;
_RecordsetPtr m_pRecordset;
// 使用ADO创建数据库记录集
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
// 因为它有时会经常出现一些想不到的错误。jingzhou xu
try
{//得到数据库纪录指针,使指针指向表
m_pRecordset->Open("SELECT * FROM 表名", // 查询DemoTable表中所有字段
theApp.m_pConnection.GetInterfacePtr(), // 获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
//读数据库的操作
_variant_t var;
CString strName,strAge;
// 清空列表框
m_AccessList.ResetContent();
strName=strAge="";
// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
// 因为它有时会经常出现一些想不到的错误。jingzhou xu
try
{
// 先将指针移向第一条记录,然后就可以相对第一条记录来随意移动记录指针
if(!m_pRecordset->BOF)
m_pRecordset->MoveFirst();
else
{
AfxMessageBox("表内数据为空");
return;
}
// 读入库中各字段并加入列表框中
while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("Name");//查找字段名为Naem的列
if(var.vt != VT_NULL)
strName = (LPCSTR)_bstr_t/*字符串*/(var);//以字符串形式复值给 //strName
var = m_pRecordset->GetCollect("Age");//查找字段名为Age的列
if(var.vt != VT_NULL)
strAge = (LPCSTR)_bstr_t(var);
m_AccessList.AddString( strName + " --> "+strAge );
m_pRecordset->MoveNext();//将记录指针指向下一行
}
// 默认列表指向第一项,同时移动记录指针并显示
m_AccessList.SetCurSel(0);
OnSelchangeListaccess();
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
//删除数据库记录
if(m_AccessList.GetCount() == 0)
return;
else if(m_AccessList.GetCurSel() < 0 || m_AccessList.GetCurSel() > m_AccessList.GetCount())
m_AccessList.SetCurSel(0);
try
{
// 删除当前行记录
m_pRecordset->Delete(adAffectCurrent);
m_pRecordset->Update();
// 删除列表中当前值
int nCurSel = m_AccessList.GetCurSel();
m_AccessList.DeleteString(nCurSel);
if(nCurSel == 0 && (m_AccessList.GetCount() != 0))
m_AccessList.SetCurSel(nCurSel);
else if(m_AccessList.GetCount() != 0)
m_AccessList.SetCurSel(nCurSel-1);
// 移动记录指针到新的位置
OnSelchangeListaccess();
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
//写数据库的操作
UpdateData();//更新客户信息
if(m_Name == "" || m_Age == "")
{
AfxMessageBox("姓名和年龄信息不能为空!");
return;
}
// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
// 因为它有时会经常出现一些想不到的错误。
try
{
// 写入各字段值
m_pRecordset->AddNew();//开辟新记录
m_pRecordset->PutCollect("Name", _variant_t(m_Name));//修改字段信息
m_pRecordset->PutCollect("Age", atol(m_Age));//修改字段信息
m_pRecordset->Update();//更新内容
AfxMessageBox("插入成功!");
// 更新显示其库内容
int nCurSel = m_AccessList.GetCurSel();
OnReadAccess();
m_AccessList.SetCurSel(nCurSel);
// 移动记录指针到新的位置
OnSelchangeListaccess();
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
// 关闭记录集
m_pRecordset->Close();
m_pRecordset = NULL;
//修改字段信息
m_pRecordset->PutCollect("Name", _variant_t(m_Name));//修改字段信息
m_pRecordset->PutCollect("Age", atol(m_Age));//修改字段信息
4、断开数据库连接
// 关闭ADO连接状态
if(m_pConnection->State)
m_pConnection->Close();
m_pConnection= NULL;