转载自〈Compubin的空间〉Debug Assertion Failed! dbcore.cpp line:2979问题解决(VC++用ODBC访问SQLServer)

来源:互联网 发布:进销存加收银软件排行 编辑:程序博客网 时间:2024/06/05 23:55


觉得以后暂时不会再在VC++中使用数据库访问技术(ODBC和ADO),所以想分别作两个程序,来总结一下。没想到,竟
出了很多问题。这个问题差不多折磨了我一上午的时间,哎,我容易嘛,我!我郁闷啊,我!
不过现在问题终于解决了。哈哈 Very Well.
首先,要感谢CSDN上tanwei1002的回答,真是一语惊醒梦中人啊 !
他的回答精炼之致,如下:
那就是m_nFields m_nFieldsBound不相等 你调试看看他们的值

问题分析:
    我在VC中用ODBC访问SQL Server数据库,除了用单文档建立一个应用程序框架,添加了ODBC数据源,其他的什
都没有添加。
    在建好应用程序初始框架之后,我习惯性的先浏览一下这个应用程序的Class View,我发现比原来的单文档模式多
来一个CXXXSet类,里面声明了 具体的数据库表中的各列 的对象,比如m_name。然而,这些列对象却引起了我
的疑
问,我数了数,我总共在数据库表中建立了20列,而这里只加载了19列,缺少一项telephone的列对象m_telephone。
大惑不解!(其实缺少这一项,加上很容易,在.h和.cpp文件里加上exchange和声明即可)

    然后直接运行之,出现了如下的错误提示:
    Debug Assertion Failed! 
    File:dbcore.cpp 
    line:2979
    …………

问题解决:
    dbcore.cpp是VC自带的MFC SRC文件(位于C:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC下),代码不可
能出错。就看看着2979行,是什么情况导致的错误。
    定位到2979行,代码如下:ASSERT((int)m_nFields == m_nFieldsBound);
    ASSERT断言函数用于在代码中捕捉我们的一些假设,具有更好的异常处理特性。如果假设的参数返回值为真,不
做处理;返回值为假,中断程序执行,做出提示。
    ASSERT函数介绍具体参考:http://baike.baidu.com/view/653925.htm

    开始我并没有认识ASSERT((int)m_nFields == m_nFieldsBound)到底怎么回事,直到看到tanwei1002兄的回答,并
结合自己刚才的疑问,才如梦初醒。
    我先在dbcore.cpp的2979行加入断点,然后运行到此处后,分别查看m_nFields和m_nFieldsBound的值,结果正
如疑惑中的那样,m_nFields=19,而m_nFieldsBound=20。问题就变得很清晰,很简单了。于是我在CXXSet头文
件和.CPP文件里加入Telephone的数据交换定义和变量声明,问题迎刃而解!
void COilManageSet::DoFieldExchange(CFieldExchange* pFX)
{RFX_Text(pFX, _T("[Telephone]"), m_Telephone);}
CString m_Telephone;

总结:

关于Debug Assertion Failed! 错误,还有很多其他的问题,比如野指针导致的内存错误之类的,我这只是一例。和其

他的基本没有什么联系,因为错误所在的文件是不同的,解决办法也各有差异。如果不能解决你的问题,深表遗憾!

另附tanwei1002兄的回答地址,以表感谢!

http://topic.csdn.net/u/20100427/17/c7c1af48-ba32-46b6-9216-bc7e394edeb2.html

原创粉丝点击