今天我在bbs的vc版上转悠,看到由个哥们出了这样的问题:
于是分析了一下.这个是我在bbs上发的帖子. 【程序编程相关:编程必备:VC常用知识重温】说他在编写mfc的数据库程序(odbc)的时候出现了错误,再插入新记录后调用update的时候出现了assert,由于再bbs上,我与他通过信息交流了一下,发现他在addnew与update之间调用了format.直觉告诉我问题出在这里. 【推荐阅读:MAPX在VC和C++builder的O】我们在使用odbc进行数据库的插入操作时,都是这么一个流程: 【扩展信息:(转载)浅析”流光种植者”的编程实现】
这个问题我仔细看了一下,问题出在mfc内部:下面所述仅适用于vc6带的mfc4.2
addnew()//给成员赋值update()而在mfc的源文件dbcore.cpp 1040行,有这样一行注释:// buffer address must not change - odbcs sqlbindcol depends upon this由于mfc在进行默认的数据源绑定时,使用cstring绑定字符串型的成员,而cstring使用的是动态的内存管理方式,因此这个缓冲区地址其实是可以改变的,因此,在dbcore.cpp的1041行开始便是这样几句:void* pvbind;
pvbind = value.getbuffer(0);value.releasebuffer();if (pvbind != pinfo->m_pvbindaddress){ trace1("error: cstring buffer (column %u) address has changed!\n", nfield); assert(false);}因此,如果你在调用addnew与update之间把cstring的缓冲区移动了,对不起,你必须收到一个assert.(nickshen好像就是这里的问题吧)
这样问题就很清楚了,就是在你调用addnew与update之间不能移动缓冲区.... 下一页