ADO编程总结
(二)
Connection,Recordset,Command对象都可以对数据库进行访问,并对数据库进行操作,以下是实验例程,由以下例程可见,读取数据库都要用到Recordset对象,而Recordset和command虽然都可以不需要connection对象而独自对数据库访问(例程在此为给出,可查我在《Visual c++6.0开发指南》上所夹的打印资料),但最方便的方法还是先用connection对象建立对数据库的连接,然后以此conection对象作为Recordset和command的open参数,打开数据库。
使用ConnectionPtr接口访数据库,并添加数据
1、创建_ConnetionPtr对象并实例化
2、调用Open方法访数据库
3、调用Execute方法,执行SQL命令
4、例程如下:
//1 建立连接
_ConnectionPtr pCon;
HRESULT hr;
try
{
hr=pCon.CreateInstance(_uuidof(Connection));
if (FAILED(hr))
{
AfxMeageBox(\"Create Connection Instance Failed!\");
return;
}
pCon->ConnectionString=\"File Name=mydata.udl\";
pCon->ConnectionTimeout=20;
hr=pCon->Open(\"\",\"\",\"\",adConnectUnspecified);
if (FAILED(hr))
{
AfxMeageBox(\"Open Connection Failed!\");
return;
}
//2 利用Connection对象,为数据库添加数据CString strSQL=\"insert into DVDData values(1006,\'新闻联播\',\'2010-2-12\',3)\";COleVariant vtOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);pRecordset=pCon->Execute(_bstr_t(strSQL),&vtOptional,-1);pCon.Release(); } catch(_com_error e) {bstr_t bstrSource(e.Source());_bstr_t bstrDescription(e.Description());
} return;
使用RecordsetPtr接口访问数据库
1、创建_RecordsetPtr对象并实例化
2、调用Open方法访问数据库,数据源来自已建立连接的Connetcion对象
3、调用GetCollect方法获取数据库中的数据
4、例程如下:
_ConnectionPtr pCon;
_RecordsetPtr pRecordset;
HRESULT hr;
try
{
hr=pCon.CreateInstance(_uuidof(Connection));
if (FAILED(hr))
{
AfxMeageBox(\"Create Connection Instance Failed!\");
return;
}
pCon->ConnectionString=\"File Name=mydata.udl\";
pCon->ConnectionTimeout=20;
hr=pCon->Open(\"\",\"\",\"\",adConnectUnspecified);
if (FAILED(hr))
{
AfxMeageBox(\"Open Connection Failed!\");
return;
}
//2 利用Recordset对象,读取数据库数据
hr=pRecordset.CreateInstance(_uuidof(Recordset));
if (FAILED(hr))
{
AfxMeageBox(\"Create Recordset Instance Failed!\");
return;
}
CString strSQL=\"select * from DVDData\";
hr=pRecordset->Open(_variant_t(strSQL),pCon.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,adCmdText);if (FAILED(hr))
{
AfxMeageBox(\"Open Recordset Failed!\");
return;
}
_variant_t var; CString strValue; while(!pRecordset->rsEOF) {c=m_datalist.GetItemCount();var=pRecordset->GetCollect(\"编号\");if (var.vt!=VT_NULL)strValue=(LPCSTR)_bstr_t(var);m_datalist.InsertItem(c,strValue);var=pRecordset->GetCollect(\"名称\"); if (var.vt!=VT_NULL)strValue=(LPCSTR)_bstr_t(var); m_datalist.SetItemText(c,1,strValue);
var=pRecordset->GetCollect(\"日期\");
if (var.vt!=VT_NULL)
strValue=(LPCSTR)_bstr_t(var);
m_datalist.SetItemText(c,2,strValue);
var=pRecordset->GetCollect(\"数目\");
if (var.vt!=VT_NULL)
strValue=(LPCSTR)_bstr_t(var);
m_datalist.SetItemText(c,3,strValue);
pRecordset->MoveNext();
}
}
catch(_com_error e)
{
bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
AfxMeageBox(bstrSource+bstrDescription);
return;
}
pRecordset->Close();
pRecordset=NULL;
pCon.Release();
5、为数据库添加数据
pRecordset->AddNew();
CString strNum;
strNum.Format(\"%d\",m_number);
pRecordset->PutCollect(\"编号\",_variant_t(strNum));
pRecordset->PutCollect(\"名称\",_variant_t(m_name)); pRecordset->PutCollect(\"日期\",_variant_t(m_date)); pRecordset->PutCollect(\"数目\",_variant_t(m_count)); pRecordset->Update();
使用Command对象打开数据库
1、定义_CommandPtr、_RecordsetPtr对象实例化_CommandPtr对象
2、使用Execute方法执行SQL命令,返回结果保存在Recordset对象中。
3、使用RecordsetPtr的GetCollect方法获取数据
4、例程如下:
_CommandPtr pCommand;
_RecordsetPtr pRecordset;
_ConnectionPtr pCon;
HRESULT hr;
try
{
hr=pCon.CreateInstance(_uuidof(Connection));
if (FAILED(hr))
{
AfxMeageBox(\"Create Connection Instance Failed!\");return;
}
pCon->ConnectionString=\"File Name=mydata.udl\";
pCon->ConnectionTimeout=20;
hr=pCon->Open(\"\",\"\",\"\",adConnectUnspecified);
if (FAILED(hr))
{
AfxMeageBox(\"Open Connection Failed!\");
return;
}
pCommand.CreateInstance(_uuidof(Command));
pCommand->ActiveConnection=pCon;
pCommand->CommandText=\"select * from DVDData\";
pCommand->Parameters->Refresh();
pRecordset=pCommand->Execute(NULL,NULL,adCmdText);
int c;
_variant_t var;
CString strValue;
while(!pRecordset->rsEOF)
{
c=m_datalist.GetItemCount();
var=pRecordset->GetCollect(\"编号\");
}if (var.vt!=VT_NULL)strValue=(LPCSTR)_bstr_t(var); m_datalist.InsertItem(c,strValue); var=pRecordset->GetCollect(\"名称\"); if (var.vt!=VT_NULL)strValue=(LPCSTR)_bstr_t(var); m_datalist.SetItemText(c,1,strValue); var=pRecordset->GetCollect(\"日期\"); if (var.vt!=VT_NULL)strValue=(LPCSTR)_bstr_t(var); m_datalist.SetItemText(c,2,strValue); var=pRecordset->GetCollect(\"数目\"); if (var.vt!=VT_NULL)strValue=(LPCSTR)_bstr_t(var); m_datalist.SetItemText(c,3,strValue);pRecordset->MoveNext();} } catch(_com_error e) {bstr_t bstrSource(e.Source());_bstr_t bstrDescription(e.Description());AfxMeageBox(bstrSource+bstrDescription);return; } pRecordset->Close(); pRecordset=NULL; pCon.Release();