我最近试图创建一个程序,可以读取ODBC数据库,然后通过使用C类将条目写入Excel文件,该程序完美地编译,但问题出现在执行中...
第一个错误:
调试Assert失败!
程序:C:\Windows\system32\mfc140ud.dll
文件:f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin1.inl
电话:+86 -24 - 2222222
第二个错误:
调试Assert失败!
程序:C:\Windows\system32\mfc140ud.dll
文件:f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dbcore.cpp
3312线
这两个错误指向mfc140ud.dll文件,它不是丢失的文件,所以这不是问题所在。
下面是引发异常的函数:
void parseDB(CRecordset &rs, const CString &SqlString, CString strOut) {
std::cout << "test2";
rs.Open(CRecordset::snapshot, SqlString, CRecordset::readOnly);
std::string entry;
std::fstream file;
std::cout << "test3";
while(!rs.IsEOF()) {
std::cout << "test4";
rs.GetFieldValue((short)0, strOut);
CT2CA pszConvertedAnsiString = strOut;
entry = pszConvertedAnsiString;
writeXLSX(entry.c_str(), file);
rs.MoveNext();
}
rs.Close();
}
“std::cout〈〈“test””是用来调试的,我的程序在“test 2”显示后立即生成这些错误,所以我推断错误来自“Open”行。
这是我初始化C的方式:
CString sDsn;
CDatabase db;
CRecordset rs(&db);
CString strOut;
CString SqlString;
然后,我在switch-case中使用CALL SQL函数:
switch (sequence) {
case 1:
SqlString = "CALL GETCUSNAME(AGENTS)";
break;
case 2:
SqlString = "CALL GETCUSNAME(CLIENT)";
break;
default:
AfxMessageBox(_T("Wrong entry!"));
}
我搜索了很多网站,我找不到答案,这就是为什么我在这里问一个问题,提前感谢。
2条答案
按热度按时间bwntbbo31#
第一个Assert来自
AfxGetResourceHandle
,它抱怨没有正确设置。这通常会发生,因为您没有在应用程序开始时调用
AfxWinInit
(如果您有一个控制台应用程序,并且没有使用MFC向导设置它,则很可能是这种情况),或者您正在编写从非MFC代码调用的MFC DLL,并且您没有在每个外部可见函数的开始处添加AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
。我相信第二个原因是MFC要求你用花括号 Package CALL查询,就像这样:
{CALL GETCUSNAME(AGENTS)}
。否则,调用将无法识别,代码执行将进入不应该采用的路径。bis0qfac2#
我有一个类似的错误,我发现这只发生在调试版本,因为我是建立一个插件的某些桌面软件,我呼吁我的MFC对话框内这个软件.然而,问题是,这个软件是使用释放MFC库(MFC140u.dll),而我的对话调试版本正在使用(MFC140ud.dll文件),我试着把(MFC140ud.dll)文件在我的项目文件和点vs和软件来加载它。螺母没有工作。我的解决方案是在包含MFC头文件之前,添加一个条件编译预处理器片段来取消DEBUG的定义。如果之前在我的预编译头文件中定义了DEBUG,则重新定义DEBUG。