我用的是ado和datagrid连接access数据库,想要实现查询数据库的功能并在list control中显示查询结果,同时可以进行修改和删除。(点后两个命令按钮时有问题)
出错部分代码如下:
void CEX_Database08Dlg::OnQueryButton()  //这个函数没有问题
{
// TODO: Add your control notification handler code here
_ConnectionPtr m_pConnection;
m_pConnection.CreateInstance("ADODB.Connection");
m_pConnection->ConnectionTimeout=10;
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=学生档案.mdb","","",adModeUnknown);

_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open("SELECT * FROM 学习成绩",_variant_t((IDispatch *)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText); CString s;
CQuery_dlg dlg;
_variant_t vnum,vname,vchinese,vmaths,venglish;
bool search=false; m_pRecordset->MoveFirst(); if (dlg.DoModal()==IDOK)
{
while(!m_pRecordset->adoEOF)
{
vname=m_pRecordset->GetCollect("姓名");
s=(LPCTSTR)_bstr_t(vname);
if (s==dlg.m_Name)
{
current_pos=m_pRecordset->GetAbsolutePosition(); vnum=m_pRecordset->GetCollect("学号");
s=(LPCTSTR)_bstr_t(vnum);
m_Record_List.InsertItem(0,s); vname=m_pRecordset->GetCollect("姓名");
s=(LPCTSTR)_bstr_t(vname);
m_Record_List.SetItemText(0,1,s); vchinese=m_pRecordset->GetCollect("语文");
s=(LPCTSTR)_bstr_t(vchinese);
m_Record_List.SetItemText(0,2,s); vmaths=m_pRecordset->GetCollect("数学");
s=(LPCTSTR)_bstr_t(vmaths);
m_Record_List.SetItemText(0,3,s); venglish=m_pRecordset->GetCollect("英语");
s=(LPCTSTR)_bstr_t(venglish);
m_Record_List.SetItemText(0,4,s);

search=true;
break;
}
m_pRecordset->MoveNext();
}
if (!search)
{
MessageBox("没找到满足条件记录");
}
}
}void CEX_Database08Dlg::OnEditButton() //这个就有问题了 
{
// TODO: Add your control notification handler code here
_ConnectionPtr m_pConnection;
m_pConnection.CreateInstance("ADODB.Connection");
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=学生档案.mdb","","",adModeUnknown);

_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open("SELECT * FROM 学习成绩",_variant_t((IDispatch *)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);

CString s;
CEdit_dlg dlg;
_variant_t vnum,vname,vchinese,vmaths,venglish;

m_pRecordset->MoveFirst();
m_pRecordset->Move(current_pos-1); vnum=m_pRecordset->GetCollect("学号");
dlg.m_Num=(LPCTSTR)_bstr_t(vnum);
vname=m_pRecordset->GetCollect("姓名");
dlg.m_Name=(LPCTSTR)_bstr_t(vname);
vchinese=m_pRecordset->GetCollect("语文");
dlg.m_Chinese=(LPCTSTR)_bstr_t(vchinese);
vmaths=m_pRecordset->GetCollect("数学");
dlg.m_Maths=(LPCTSTR)_bstr_t(vmaths);
venglish=m_pRecordset->GetCollect("英语");
dlg.m_English=(LPCTSTR)_bstr_t(venglish);

UpdateData(false); if (dlg.DoModal()==IDOK)
{
m_pRecordset->PutCollect("学号",_variant_t(dlg.m_Num));
m_pRecordset->PutCollect("姓名",_variant_t(dlg.m_Name));
m_pRecordset->PutCollect("语文",_variant_t(dlg.m_Chinese));
m_pRecordset->PutCollect("数学",_variant_t(dlg.m_Maths));
m_pRecordset->PutCollect("英语",_variant_t(dlg.m_English));
m_pRecordset->Update();
}

vnum=m_pRecordset->GetCollect("学号");
s=(LPCTSTR)_bstr_t(vnum);
m_Record_List.InsertItem(0,s);
vname=m_pRecordset->GetCollect("姓名");
s=(LPCTSTR)_bstr_t(vname);
m_Record_List.SetItemText(0,1,s);
vchinese=m_pRecordset->GetCollect("语文");
s=(LPCTSTR)_bstr_t(vchinese);
m_Record_List.SetItemText(0,2,s);
vmaths=m_pRecordset->GetCollect("数学");
s=(LPCTSTR)_bstr_t(vmaths);
m_Record_List.SetItemText(0,3,s);
venglish=m_pRecordset->GetCollect("英语");
s=(LPCTSTR)_bstr_t(venglish);
m_Record_List.SetItemText(0,4,s);}

解决方案 »

  1.   

    CEdit_dlg dlg;
    _variant_t vnum,vname,vchinese,vmaths,venglish;

    m_pRecordset->MoveFirst();
    m_pRecordset->Move(current_pos-1); vnum=m_pRecordset->GetCollect("学号");
    dlg.m_Num=(LPCTSTR)_bstr_t(vnum);
    vname=m_pRecordset->GetCollect("姓名");
    dlg.m_Name=(LPCTSTR)_bstr_t(vname);
    vchinese=m_pRecordset->GetCollect("语文");
    dlg.m_Chinese=(LPCTSTR)_bstr_t(vchinese);
    vmaths=m_pRecordset->GetCollect("数学");
    dlg.m_Maths=(LPCTSTR)_bstr_t(vmaths);
    venglish=m_pRecordset->GetCollect("英语");
    dlg.m_English=(LPCTSTR)_bstr_t(venglish);

    UpdateData(false);
    此处的updatedata(false)你想干什么?
      

  2.   

    m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=学生档案.mdb","","",adModeUnknown);
    两个函数都有这个,干嘛要重复打开呢?
      

  3.   

    加入调试看看是在哪句出错,通常可能是m_pRecordset->Update();这种语句出错
      

  4.   

    http://www.somade.com/是个很专业的技术社区,去那里找找吧,或许有你要的答案~