第一次用vc+ado做的学生管理系统,编译没错,但查询时得不到结果(弹出系统提示:runtime error!).调试很久还是没有解决.请教!

wayne92 2005-08-28 09:00:05
查询数据库中符合条件的内容,并在列表框中显示.
void CMyDlg::OnSearchButton()
{
_ConnectionPtr m_pConnection;

m_pConnection.CreateInstance("ADODB.Connection");
m_pConnection->ConnectionTimeout=10;
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\03.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;
m_pRecordset->MoveFirst();
bool search = false;
char cEdit[20];
cEdit[0] = '\0';
_variant_t v,v1,v2,v3;
m_Data.GetWindowText(cEdit,20);

if(cEdit[0]!='\0'){

while(!m_pRecordset->adoEOF){
v=m_pRecordset->GetCollect("姓名");
s=(LPCTSTR)_bstr_t(v);


if(s == cEdit ){ //可以这样写吗?编译没有问题.但我觉得在c中这样写是在比较两个地址(我想实现的是比较两个字符串). 在vc中if(s == cEdit )和if( strcmp(s,cEdit) == 0 )是一样的吗?
v1=m_pRecordset->GetCollect("院系");
s=(LPCTSTR)_bstr_t(v1);
m_Record_List.InsertItem(0,s); //我觉得是这几句有问题.当查询的内容不在数据库中时,弹出对话框"没有找到满足条件记录".当查询的内容在数据库时,系统弹出提示:"runtime error".

v2=m_pRecordset->GetCollect("专业代码");
s=(LPCTSTR)_bstr_t(v2);
m_Record_List.SetItemText(0,1,s);

v3=m_pRecordset->GetCollect("专业");
s=(LPCTSTR)_bstr_t(v3);
m_Record_List.SetItemText(0,2,s);

search=true;
break;
}

m_pRecordset->MoveNext();
}
}

if (!search)
MessageBox("没有找到满足条件记录");
}

这是我的第一个用vc+ado做的程序,所以很多都不会,希望大家指教.
如果我写的不太明白,我可以把代码寄到您的信箱.谢谢了.
...全文
255 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
dlij 2005-08-31
  • 打赏
  • 举报
回复
用断点调试定位
jjiaming 2005-08-31
  • 打赏
  • 举报
回复
支持 sakaer的看法
如果没有记录,s的值为空,当然会没有显示的
菜牛 2005-08-30
  • 打赏
  • 举报
回复
CString 与 char* 怎么不可以用 == 比较?
是我看错了,以为s也是char*类型的。你说得很对,CString可以和char*比较。
jrlgz 2005-08-30
  • 打赏
  • 举报
回复
楼上的话很中肯。我已经把楼主的代码修改过了,请楼主去收一下。
sakaer 2005-08-30
  • 打赏
  • 举报
回复
我觉得这里可能也会出问题:
s=(LPCTSTR)_bstr_t(v);
你并没有判断v是否为空的情况,如果数据库里的相应记录为NULL的话,那么这条语句可能会导致程序崩溃,会显示runtime错误的。
还有,对查询结果判断一下是否有记录也是应该的。
jrlgz 2005-08-30
  • 打赏
  • 举报
回复
楼主把源代码、数据库和想实现的效果发给我,我来帮你搞定它。Greyman_king@yahoo.com.cn
jrlgz 2005-08-30
  • 打赏
  • 举报
回复
我看过你的代码了。数据库的查询是没有问题的。你可以试着TRACE一下。问题出在那个CListCtrl上。由于你没有InsertItem而直接用了SetItemText,所以这个函数是无效的(没有Item怎么SetText?),当然不会有任何显示。
jrlgz 2005-08-29
  • 打赏
  • 举报
回复
用上面的SELECT语句可以返回一个符合条件的RecordSet。如果其中有记录,则要先用MoveFirst把游标移至头上再操作。如果没有记录,就什么也不要做,更不要用什么GetCollect,否则肯定出错。
另外,你有没有试用直接用_bstr_t填充列表框?说不定可以的:)
jrlgz 2005-08-29
  • 打赏
  • 举报
回复
比如,SELECT * FROM 信息管理系统 WHERE 姓名='某某某'
或者直接在返回的RecordSet中使用Find方法。
菜牛 2005-08-29
  • 打赏
  • 举报
回复
//可以这样写吗?编译没有问题.但我觉得在c中这样写是在比较两个地址(我想实现的是比较两个字符串)

你说得很对,不能这样写。

我奇怪的是,为什么不把查询条件写到SELECT语句中?
wayne92 2005-08-29
  • 打赏
  • 举报
回复
我写search=true;

MessageBox("找到满足条件记录");是想证明程序执行了
v4=m_pRecordset->GetCollect("学号");
s=(LPCTSTR)_bstr_t(v4);
m_Record_List.SetItemText(0,3,s);

那为什么在listctrl中没有显示呢?


jjiaming 2005-08-29
  • 打赏
  • 举报
回复
search=true;

MessageBox("找到满足条件记录");

if (!search)
MessageBox("没有找到满足条件记录");
这几句是什么意思啊,这不弹出找到满足条件记录"的对话框才怪呢
TRACE 一下,看看s的值
wayne92 2005-08-29
  • 打赏
  • 举报
回复
我又改了一下,不查询,只是在列表中显示数据:
_ConnectionPtr m_pConnection;

m_pConnection.CreateInstance("ADODB.Connection");
m_pConnection->ConnectionTimeout=10;
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\03.mdb","","",adModeUnknown);

_RecordsetPtr m_pRecordset;

m_pRecordset.CreateInstance("ADODB.Recordset");
try{
m_pRecordset->Open("SELECT * FROM 信息管理系统",_variant_t((IDispatch *)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
}
catch(_com_error *e){
AfxMessageBox(e->ErrorMessage());
}

CString s;
m_pRecordset->MoveFirst();

bool search = false;
_variant_t v4;

v4=m_pRecordset->GetCollect("学号");
s=(LPCTSTR)_bstr_t(v4);
m_Record_List.SetItemText(0,3,s);

search=true;

MessageBox("找到满足条件记录");

if (!search)
MessageBox("没有找到满足条件记录");
结果是弹出"找到满足条件记录"的对话框,可是在列表中并没有显示数据,而在数据库中是有相应数据的.
加了s.TrimRight();后是一样的.

在ado下,怎么把数据显示在列表中呢????
wayne92 2005-08-29
  • 打赏
  • 举报
回复
to: Mackz(在相互) ,请问应该怎样把查询条件写到SELECT语句中?
可以举个例子吗?我刚学,不太熟悉
skyfine 2005-08-29
  • 打赏
  • 举报
回复
把条件加到SQL

_bstr_t sSQL;
CString sTemp;
sTemp = "计算机"

sSQL = "select * from A where 院名 = '";
sSQL = sSQL + sTemp;
sSQL = sSQL + "'";
等于
select * from A where 院名='计算机';
当然你也可以先用CString::Format()来格式化再转化成_bstr_t
skyfine 2005-08-29
  • 打赏
  • 举报
回复
//可以这样写吗?编译没有问题.但我觉得在c中这样写是在比较两个地址(我想实现的是比较两个字符串)

你说得很对,不能这样写。

我奇怪的是,为什么不把查询条件写到SELECT语句中?

//=============
CString 与 char* 怎么不可以用 == 比较?
skyfine 2005-08-29
  • 打赏
  • 举报
回复
v1=m_pRecordset->GetCollect("院系");
s=(LPCTSTR)_bstr_t(v1);

=======
s= (char*)(_bstr_t)m_pRecordset->GetCollect("院系");//你的没错
s.TrimRigh();//加这一句
m_Record_List.InsertItem(0,s);

这样做看是否OK,其它类推。

所有的数据库处理应该加上try{/*数据库操作*/}catch( _com_error &e ){/*异常处理*/}

oyljerry 2005-08-29
  • 打赏
  • 举报
回复
直接用sql语句来查询结果,效率也好些
wayne92 2005-08-28
  • 打赏
  • 举报
回复
改成这样了,可是还是不行.输入的内容在数据库时,点击查询按钮后没有反应.
if(cEdit[0]!='\0'){

while(!m_pRecordset->adoEOF){
v=m_pRecordset->GetCollect("姓名");
_bstr_t bstr=v.bstrVal;
LPTSTR lpstr=bstr;

if( strcmp( lpstr,cEdit) == 0 ){
v2=m_pRecordset->GetCollect("专业代码");
_bstr_t bstr2=v2.bstrVal;
LPTSTR lpstr2=bstr2;
m_Record_List.SetItemText(0,1,lpstr2);

search=true;
break;
}


m_pRecordset->MoveNext();
}
}
天啊,头都大了.明天再看看吧
为什么输入的数据满足条件时会有错误.错的地方只有5,6行的代码,怎么会改不对呢?
哪位高人有时间,指点一下.或者我把代码寄到你的邮箱.
jrlgz 2005-08-28
  • 打赏
  • 举报
回复
通过CString来转换吧。
不过我试过直接用LPTSTR转。
_bstr_t bstr1=v.bstrVal;
LPTSTR lpstr1=bstr1;
这样写没有什么问题。
加载更多回复(4)

4,012

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧