觉得以后暂时不会再在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