MFC ODBC数据库更新异常问题

人生_若只如初见 2015-01-22 03:04:16
本人新手,现在在做一个毕业设计,要从一个CEDIT控件里读出内容后分行存入ORACLE数据库,看起来也不难,但一直跳错,错误是HEAP CORRUPTION DETECTED,但我就是用VS2013建了模板然后在模板上添加了一些代码,应该是不存在内存越界的,数据库字段空间分配也足够,求大神指点,以下是自己加的代码。
  UpdateData(TRUE);
// 检查是否可添加
if (!m_pSet->IsOpen() | !m_pSet->CanAppend())
{
return;
}
m_pSet->SetFieldNull(NULL);//清空所有字段
m_pSet->AddNew(); //设置记录为添加模式

// 设置记录新值 这儿本应该弹出新的对话框来设置新的记录 但这里直接添加给定的记录
m_pSet->column1 = columnc1;
m_pSet->column2 = columnc2;
m_pSet->column3 = columnc3;
m_pSet->column4 = columnc4;
m_pSet->column5 = columnc5;
m_pSet->column6 = columnc6;
m_pSet->column7 = columnc7;
m_pSet->Update();
m_pSet->Requery();
//提交更新
UpdateData(FALSE);
GetDlgItem(IDC_EDIT1)->SetWindowTextW(_T(""));

columnc1~7是从Cedit控件里读出的内容,其余代码基本都是自动生成的。
...全文
367 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 11 楼 ckc 的回复:
这种错比较难找的。 要先定位错误发生的地方。 比如打开程序不操作就退出看有没有错 如果有错那就不关后继操作的事情,是其它代码出错了。 如果这样没错再试下对数据库进行操作,想办法隔离你的代码 每次只执行一部分,看执行到哪一部分之后出错
好像也不对,把数据库字段类型改成VACHER2后空格就没了,不过还是跳越界错误...
  • 打赏
  • 举报
回复
引用 11 楼 ckc 的回复:
这种错比较难找的。 要先定位错误发生的地方。 比如打开程序不操作就退出看有没有错 如果有错那就不关后继操作的事情,是其它代码出错了。 如果这样没错再试下对数据库进行操作,想办法隔离你的代码 每次只执行一部分,看执行到哪一部分之后出错
根据排查,问题好像是这样的,不调用Update()更新就全部正常,而调用之后就会跳出之前的错误,不过记录还是能添加成功,但是明明添加的只有一个字符,比方说是1这样,但添加的1后面会加上很多空格直到我设置的字段长度上限,比如是“1 ”这样,我怀疑是多出来的空格导致内存越界,不过不知道为什么会自动添加那么多空格啊,求大神指教。
ckc 2015-01-24
  • 打赏
  • 举报
回复
这种错比较难找的。 要先定位错误发生的地方。 比如打开程序不操作就退出看有没有错 如果有错那就不关后继操作的事情,是其它代码出错了。 如果这样没错再试下对数据库进行操作,想办法隔离你的代码 每次只执行一部分,看执行到哪一部分之后出错
zgl7903 2015-01-23
  • 打赏
  • 举报
回复
引用 8 楼 llx0919 的回复:
catch不到啊,忘了说,每次更新都是成功的,错误是在关闭程序的时候跳出的。 HEAP CORRUPTION DETECTED: after Normal block (#5837) at 0x002944F0. CRT detected that the application wrote to memory after end of heap buffer.
有越界操作
  • 打赏
  • 举报
回复
指针越界么?找不出来啊,新手...
  • 打赏
  • 举报
回复
catch不到啊,忘了说,每次更新都是成功的,错误是在关闭程序的时候跳出的。 HEAP CORRUPTION DETECTED: after Normal block (#5837) at 0x002944F0. CRT detected that the application wrote to memory after end of heap buffer.
oyljerry 2015-01-22
  • 打赏
  • 举报
回复
try catch可以捕获很多数据库异常,但是如果是一些其他错误就可能捕获不到或者程序直接crash
  • 打赏
  • 举报
回复
嗯,回去试试。谢了。
  • 打赏
  • 举报
回复
之前可能catch错了,回去再试试。
  • 打赏
  • 举报
回复
之前试过了,没反应,跳错和原来一样。
zyq5945 2015-01-22
  • 打赏
  • 举报
回复
m_pSet->SetFieldNull(NULL);//清空所有字段 m_pSet->AddNew(); //设置记录为添加模式 这两句是不是顺序错了。 加异常捕获看是什么错误
try
{
//你的DB代码
}
catch(CException* pEx)
{
pEx->ReportError();
pEx->Delete();
}
ArthurKingYs 2015-01-22
  • 打赏
  • 举报
回复
楼上的意思是你用try catch捕捉 看看是什么错误
zgl7903 2015-01-22
  • 打赏
  • 举报
回复
ODBC 可以用 CDBException 捕捉异常 可以给记录赋值合法常量, 以排除其它因素

4,018

社区成员

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

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