新手面临的问题:首次运行正常,二次出异常.我估计是对象没有回收.具体如何作?

holdon_fuyonglei 2007-08-27 11:22:57
我作了一个函数,由一个按纽来调用:
void CheckDb()
{
//建立连接
_ConnectionPtr m_pConnection;
// 初始化COM,创建ADO连接等操作
AfxOleInit();
m_pConnection.CreateInstance(__uuidof(Connection));
try
{
// 打开本地Access库Demo.mdb
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db.mdb","","",adModeUnknown);

}
catch(_com_error e)
{
AfxMessageBox("数据库连接失败,确认数据库Demo.mdb是否在当前路径下!");

}

//////////////////////////////////////////////////////////////////////////////////////////////////////////
//打开数据表
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));
try
{
m_pRecordset->Open("SELECT * FROM mobile where isSend=false", // 查询DemoTable表中所有字段
m_pConnection.GetInterfacePtr(), // 获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox("找不到指定的数据表");
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////
//读取数据表中数据
_variant_t var;
CString mobile,content;
try
{
if(!m_pRecordset->BOF)
m_pRecordset->MoveFirst();
else
{
AfxMessageBox("表内数据为空");
return;
}

// 读入库中各字段
while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("mobile");
if(var.vt != VT_NULL)
mobile = (LPCSTR)_bstr_t(var);
var = m_pRecordset->GetCollect("content");
if(var.vt != VT_NULL)
content = (LPCSTR)_bstr_t(var);
SendMsg(mobile,content);
///更新当前记录isSend为true
m_pRecordset->PutCollect("isSend", _variant_t(true));
m_pRecordset->Update();
AfxMessageBox( mobile + " --> "+content+"更新成功");
m_pRecordset->MoveNext();
}

}
catch(_com_error *e)
{

AfxMessageBox(e->ErrorMessage());
}

//关闭DB
if(m_pRecordset->State)
m_pRecordset->Close();
m_pRecordset=NULL;
if(m_pConnection->State)
m_pConnection->Close();
m_pConnection= NULL;

}

调用:void CTestDlg::OnBnClickedButton3()
{
CheckDb();
}

现在的问题是:运行时,我第一次点击这个按纽运行正常,第二次点击时就出现异常:
debug assertion failed!
program:f:\.......\oleinit.cpp
...
for information on how your program can cause an assertion .....
老兄们帮忙看看怎么回事啊.
...全文
126 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yfx2006 2007-08-28
  • 打赏
  • 举报
回复
m_pConnection->Open只作一次就行了,m_pRecordset每做一次数据库操作完成后,都要释放一次,再下次调用数据库时再进行一次m_pRecordset.CreateInstance(__uuidof(Recordset));
holdon_fuyonglei 2007-08-28
  • 打赏
  • 举报
回复
按你说的作,搞定了,太谢谢了.分少义深,请接!
liuxiuk 2007-08-28
  • 打赏
  • 举报
回复
app里面
-------
查看ClassView
holdon_fuyonglei 2007-08-28
  • 打赏
  • 举报
回复
InitInstance在哪里?就在原来的XX.cpp里面吗?
slio2008 2007-08-28
  • 打赏
  • 举报
回复
AfxOleInit()放到InitInstance()里
holdon_fuyonglei 2007-08-28
  • 打赏
  • 举报
回复
怎么办才可以调一次?因为在按钮事件中,点击一次,不就得执行一次AfxOleInit吗?
用什么条件才可作做到只执行一次?
菜牛 2007-08-28
  • 打赏
  • 举报
回复
AfxOleInit初始化的时候调用一次就行了。

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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