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控件里读出的内容,其余代码基本都是自动生成的。
...全文
359 13 打赏 收藏 转发到动态 举报
写回复
用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 捕捉异常 可以给记录赋值合法常量, 以排除其它因素
第12章 Visual C++ 2010 MFC文件与 第12章 注册表操作 479 12.1 文本操作串行化 479 12.1.1 文档类Serialize()函数 479 12.1.2 CArchive对文件进行读写 482 12.1.3 文档操作串行化代码分析 485 12.2 CFile类 492 12.2.1 打开文件操作 493 12.2.2 读写文件操作 494 12.2.3 定位文件操作 496 12.2.4 关闭文件操作 497 12.2.5 异常操作 497 12.2.6 文件管理操作 498 12.3 .ini文件读写操作 500 12.4 注册表读写操作 502 12.4.1 注册表简介 502 12.4.2 注册表API 504 12.4.3 访问并修改注册表 507 12.5 小结 509 第13章 Visual C++ 2010 MFC数据库 第13章 开发 510 13.1 数据库基本知识 510 13.2 SQL语言的基础知识 511 13.3 ODBC访问数据库 512 13.3.1 注册ODBC数据库 512 13.3.2 创建一个MFCODBC 13.3.2 程序 514 13.3.3 程序结构分析 515 13.3.4 在视图上显示数据库查询 13.3.4 结果 520 13.3.5 对查询结果排序及设置查询 13.3.5 条件 524 13.3.6 动态设置查询条件并更新 13.3.6 查询结果 527 13.4 ODBC更新数据库 532 13.5 ODBC访问SQL Server 540 13.6 ADO数据库访问 543 13.6.1 ADO数据库访问概述 543 13.6.2 在Visual C++中使用ADO 13.6.2 编程 546 13.7 ADO访问SQL Server数据库 556 13.8 小结 556 第14章 Visual C++2010 MFC多线程 第14章 程序设计 557 14.1 进程和多线程的概念 557 14.2 线程的创建 558 14.2.1 创建工作者线程 558 14.2.2 创建用户界面线程 559 14.3 线程的终止 560 14.4 设置线程的优先级 562 14.5 暂停及重新启动线程 563 14.6 线程间的通信 571 14.7 线程的同步 572 14.7.1 临界区 572 14.7.2 互斥量 573 14.7.3 事件 573 14.7.4 信号量 574 14.8 小结 579

4,012

社区成员

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

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