Recordset的AddNew()失败,请高人指点!

catxl313 2006-07-09 10:34:54
::CoInitialize(NULL);
HRESULT hr;
try{
hr=m_pConnection.CreateInstance("ADODB.Connection");
if(SUCCEEDED(hr)){
CString connStr="Provider=Microsoft.Jet.OLEDB.4.0;Source=MyDatabase.mdb";
hr=m_pConnection->Open(
(_bstr_t)connStr,(_bstr_t)"",(_bstr_t)"",adModeUnknown);
}
}
catch(_com_error e)
{
//............
}
//.............
CString strSql="select * from MyTable";
BSTR bstrSql=strSql.AllocSysString();
m_pRecordset->Open(bstrSql,_variant_t((IDispatch*)m_pConnection,true),
adOpenDynamic, adLockOptimistic, adCmdText);
AfxMessageBox("程序运行时将弹出此对话框");
m_pRecordset->AddNew();//运行时错误!
//.........
::CoUninitialize(NULL);

问题在哪?该如何解决?谢谢!
...全文
1016 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
catxl313 2006-07-12
  • 打赏
  • 举报
回复
hr=m_pConnection->Open((_bstr_t)connStr,(_bstr_t)"",(_bstr_t)"",adModeUnknown);

若将这句的 adModeUnknown 改为 adModeReadWrite 则会出现连接失败的结果,请问这个问题该如何解决?
catxl313 2006-07-12
  • 打赏
  • 举报
回复
而且多数情况下,这样做也不会符合软件的要求…………
catxl313 2006-07-11
  • 打赏
  • 举报
回复
to:peachman(侃子),eterblue(云流)
谢谢你们的提示,但试过之后都没有解决问题,但出现了一个有趣的现象:

try{
if(m_pRecordset!=NULL && !m_pRecordset->adoEOF){
//m_pRecordset->MoveNext();
m_pRecordset->AddNew();
}
if(m_pRecordset!=NULL)AfxMessageBox("NOT NULL");
if(!m_pRecordset->adoEOF)AfxMessageBox("NOT adoEOF");
}catch(_com_error e)
{
CString errMsg;
errMsg.Format("连接数据库失败:%s",e.ErrorMessage());
AfxMessageBox(errMsg);
}
以上程序运行时居然是这样的:
AfxMessageBox("NOT NULL");-〉AfxMessageBox("NOT adoEOF");-〉出现上文所描述的运行时错误!
不知道这是编译器产生代码时出现的问题,还是由于错误的出现并非来自代码本身,而是来自系统的运行库,比如dll?
catxl313 2006-07-11
  • 打赏
  • 举报
回复
正如eterblue(云流)朋友所说,我将recordset变量改为局部变量,当时问题并未解决,之后我索性将connection也该为局部变量,并将COM的初始化及退出均做局部处理,问题终于解决了,感谢eterblue(云流)的提示。

难道我真的必须每次访问数据库都作单独地处理吗?这样一定会加大系统开销吧?…………

再次感谢eterblue(云流)的帮助!
黑子白子 2006-07-11
  • 打赏
  • 举报
回复
代码行会窜位的话,应该是内存溢出了。凭这点代码难以判断了。
看你的m_pRecordset似乎是个类的成员变量,你别用m_pRecordset,临时再声明一个局部的pRs试试。
然后你先别AddNew(),先读一下记录集的内容,看能不能读出来。
catxl313 2006-07-11
  • 打赏
  • 举报
回复
to eterblue(云流):
已经关闭了,我能确信。
黑子白子 2006-07-11
  • 打赏
  • 举报
回复
内存有溢出。
是否m_pRecordset没初始化或以前曾经打开过但是没有关闭。

数据库连接的打开方式m_pConnection->Open((_bstr_t)connStr,(_bstr_t)"",(_bstr_t)"",adModeUnknown);
最好不要用adModeUnknown,查下帮助改成确定值。
黑子白子 2006-07-10
  • 打赏
  • 举报
回复
Open后也需要对记录集进行有效性判断后再处理,不为NULL,非EOF的判断是必要的。
黑子白子 2006-07-10
  • 打赏
  • 举报
回复
AddNew()最好用静态的adOpenStatic方式打开,不要用动态的adOpenDynamic。
饭走后 2006-07-10
  • 打赏
  • 举报
回复
这个问题我刚才也遇到过,在AddNew()之前先调用一个MoveNext();问题就解决了
好像是指针不能在起始插入
handsomerun 2006-07-09
  • 打赏
  • 举报
回复
用try catch捕获一下看是什么错误吧
确实很奇怪哦

另外,检查一下,那个recordset是否已经真的打开咯
catxl313 2006-07-09
  • 打赏
  • 举报
回复
try{
m_pRecordset->AddNew();
}catch(_com_error e)
{
CString errMsg;
errMsg.Format("AddNew失败:%s",e.ErrorMessage());
AfxMessageBox(errMsg);
}
这样写,原来的运行时错误依然存在。

主程序是这样的:
对话框在初始化时初始化一个m_pConnection,然后又用上面的方法建了一个Recordset,并通过相关控件显示该Recordset的内容,之后用m_pRecordset->close()关闭.至此,程序运行都是正常的。像多数例程一样,有个按钮来完成数据添加功能,于是,像上面那样根据原来的m_pConnection(该Connection在对话框Destory时才Close)重新open()了一个数据集,但调用m_pRecordset->AddNew();时便出现了上面的运行时错误。
Stefine 2006-07-09
  • 打赏
  • 举报
回复

//.............
CString strSql="select * from MyTable";
BSTR bstrSql=strSql.AllocSysString();
m_pRecordset->Open(bstrSql,_variant_t((IDispatch*)m_pConnection,true),
adOpenDynamic, adLockOptimistic, adCmdText);
AfxMessageBox("程序运行时将弹出此对话框");
m_pRecordset->AddNew();//运行时错误!
//.........
先在这地方加try catch 抓抓异常吧


AddNew()好像不会抛出异常吧,只返回HRESULT值,对于运行时错误,这个值也得不到

这样理解是错误D
这里出现异常的话,会抛出一个_com_error异常,而不管你是否AddNew返回的是什么类型的值

先看看能不能抓到异常再说吧

如果Recordset不为NULL的话,确实也有点怪
catxl313 2006-07-09
  • 打赏
  • 举报
回复
运行环境是VC6,Win_XP+SP2,Access2003.

多谢各位!
catxl313 2006-07-09
  • 打赏
  • 举报
回复
to:handsomerun(毛毛)
AddNew()好像不会抛出异常吧,只返回HRESULT值,对于运行时错误,这个值也得不到。
另外,我在之前用同样的方法获取Recordset,并通过控件显示了相关数据,因此,Recordset应该是有内容的。

系统日志里给出的错误记录如下:
Application Error
错误应用程序 DBExample.exe,版本 1.0.0.1,错误模块 msvcrtd.dll,版本 6.0.8168.0,错误地址 0x00017c5f。

4,011

社区成员

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

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