我用的是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);}
出错部分代码如下:
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);}
_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)你想干什么?
两个函数都有这个,干嘛要重复打开呢?