ADO 数据库操作,程序崩溃,为什么? 使用_RecordsetPtr进行查询,正常情况下可以正确运行并取得数据,但如果sql语句写错了(比如写错了表名),Open时,程序立即崩溃。 try { catch(_com_error *e) { }也没起作用,请高手指点。急,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 当然不能起作用了,除非你自己写个sql语句检查,不然别想catch到 语法可以检查,表名错了一点办法也没有那个SQL不归程序处理是提交给数据库处理的,程序得到的是数据库返回的数据 死哦,如果真的是这样,我的应用就无法用ado来实现了,因为我的这个应用的SQL语句是由以后的使用者来写的,并不能保证是完全正确,如果一个SQL语句错误就是程序崩溃,那也说不过去啊。有没有其他好法子(比如其他数据库连接模式)。小弟一直用java,刚接触vc++ 谢谢! 语法可以检查,表名错了一点办法也没有那个SQL不归程序处理是提交给数据库处理的,程序得到的是数据库返回的数据 语句错了,程序也不会崩溃啊?你的代码show一下 数据库处理不了,应该是返回错误码啊,什么会使程序弄崩呢。在java可以捕获到这个异常,然后做错误处理就是可以了。vc 真是郁闷呢,该不会是用ODBC连接就可以吧? 用 catch (_com_error&)别用 catch (_com_error*)试试 在catch块里面,处理出错信息之后要return try{.....}catch (_com_error&e){.....}catch(...)....{}写错表名应该不会崩溃的,可能你程序由于表名错误牵涉其他模块造成的 把catch的范围加大,肯定能捕获的 问题搞定了,是我有个地方写错了,最终的答案是:sql语句写错,程序不会崩溃,try catch是可以捕获到错误。谢谢大家的讨论。以下是我正确的代码: // 初始化COM,创建ADO连接等操作 if(!AfxOleInit())//这就是初始化COM库 { CString errormessage; errormessage.Format("创建ADO连接等操作失败!"); AfxMessageBox(errormessage); return FALSE; } _ConnectionPtr m_pConnection; _RecordsetPtr m_pRecordset; try //建立数据库连接 orcloracle11g { m_pConnection.CreateInstance(__uuidof(Connection)); m_pConnection->Open("Provider=OraOLEDB.Oracle.1;Password=fst;Persist Security Info=True;User ID=fst;Data Source=orcloracle11g;","","",adConnectUnspecified); } catch(_com_error e) { CString errormessage; errormessage.Format("数据库连接失败!\r\n错误信息:%s", e.ErrorMessage()); AfxMessageBox(errormessage); return FALSE; } try { m_pRecordset.CreateInstance(__uuidof(Recordset)); _bstr_t sql="select t1.c1,t2.c2 from fst.t1,fst.t2 where t1.c1=t2.c1"; m_pRecordset->Open(sql,(IDispatch*)m_pConnection,adOpenStatic,adLockBatchOptimistic,adCmdText); if(!m_pRecordset->BOF)//判断表内数据是否为空 m_pRecordset->MoveFirst(); else{ AfxMessageBox("BookType表内数据为空"); return FALSE; } while(!m_pRecordset->adoEOF){ _variant_t c1 = m_pRecordset->GetCollect("c1"); CString item; if(c1.vt != VT_NULL) { item.Format("c1:%s", (LPCSTR)_bstr_t(c1)); AfxMessageBox(item); } m_pRecordset->MoveNext(); } } catch(_com_error e) { CString errormessage; errormessage.Format("查询错误:%s", e.ErrorMessage()); AfxMessageBox(errormessage); return FALSE; } m_pRecordset->Close(); m_pConnection->Close(); 怎么让另一个开启的进程打印 VC2005 中的 CMschart1,纵坐标设置 !!!! VC++如何使窗体中控件自动随窗体变化大小 一个不好的现象 求助:如何使用面向对象来设计界面 我想问问关于settimer 关于函数重载的问题 关于原始套间字的问题 chtmlview如何禁止其中的script执行? 如何在程序中模拟键盘按键? vc 批量处理文件方法? 请问如何响应复选框被选中这个事件
那个SQL不归程序处理
是提交给数据库处理的,程序得到的是数据库返回的数据
那个SQL不归程序处理
是提交给数据库处理的,程序得到的是数据库返回的数据
你的代码show一下
别用 catch (_com_error*)
试试
{
.....
}
catch (_com_error&e)
{
.....
}
catch(...)
....
{
}写错表名应该不会崩溃的,可能你程序由于表名错误牵涉其他模块造成的
把catch的范围加大,肯定能捕获的
if(!AfxOleInit())//这就是初始化COM库
{
CString errormessage;
errormessage.Format("创建ADO连接等操作失败!");
AfxMessageBox(errormessage);
return FALSE;
} _ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset; try //建立数据库连接 orcloracle11g
{
m_pConnection.CreateInstance(__uuidof(Connection));
m_pConnection->Open("Provider=OraOLEDB.Oracle.1;Password=fst;Persist Security Info=True;User ID=fst;Data Source=orcloracle11g;","","",adConnectUnspecified);
}
catch(_com_error e)
{
CString errormessage;
errormessage.Format("数据库连接失败!\r\n错误信息:%s", e.ErrorMessage());
AfxMessageBox(errormessage);
return FALSE;
} try
{
m_pRecordset.CreateInstance(__uuidof(Recordset));
_bstr_t sql="select t1.c1,t2.c2 from fst.t1,fst.t2 where t1.c1=t2.c1";
m_pRecordset->Open(sql,(IDispatch*)m_pConnection,adOpenStatic,adLockBatchOptimistic,adCmdText); if(!m_pRecordset->BOF)//判断表内数据是否为空
m_pRecordset->MoveFirst();
else{
AfxMessageBox("BookType表内数据为空");
return FALSE;
}
while(!m_pRecordset->adoEOF){
_variant_t c1 = m_pRecordset->GetCollect("c1"); CString item;
if(c1.vt != VT_NULL)
{
item.Format("c1:%s", (LPCSTR)_bstr_t(c1));
AfxMessageBox(item);
}
m_pRecordset->MoveNext();
}
}
catch(_com_error e)
{
CString errormessage;
errormessage.Format("查询错误:%s", e.ErrorMessage());
AfxMessageBox(errormessage);
return FALSE;
} m_pRecordset->Close();
m_pConnection->Close();