Visual Studio C++:调试断言失败
Visual Studio C++ : Debug Assertion Failed
我最近尝试创建一个程序,该程序可以读取 ODBC 数据库,然后使用 CRecordset class 将条目写入 Excel 文件,程序完美编译,但问题来了处决...
第一个错误:
Debug Assertion Failed!
Program: C:\Windows\system32\mfc140ud.dll
File: f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin1.inl
Line: 24
第二个错误:
Debug Assertion Failed!
Program: C:\Windows\system32\mfc140ud.dll
File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dbcore.cpp
Line: 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””是为了调试,我的程序在“test2”显示后立即产生这些错误,所以我推断错误来自“Open”行。
这是我初始化 CRecordset 的方式:
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!"));
}
我在很多网站上搜索都找不到答案,这就是我在这里提问的原因,在此先感谢。
第一个断言来自AfxGetResourceHandle
抱怨它没有正确设置。
这通常会发生,因为您没有在应用程序启动时调用 AfxWinInit
(如果您有一个控制台应用程序并且没有使用 MFC 向导设置它,这很可能是这种情况),或者您正在编写从非 MFC 代码调用的 MFC DLL,并且您没有在每个外部可见函数的开头添加 AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
。
我认为第二个是因为 MFC 要求您将 CALL 查询用花括号括起来,如下所示:{CALL GETCUSNAME(AGENTS)}
。否则无法识别调用,并且代码执行会进入不应采用的路径。
我最近尝试创建一个程序,该程序可以读取 ODBC 数据库,然后使用 CRecordset class 将条目写入 Excel 文件,程序完美编译,但问题来了处决...
第一个错误:
Debug Assertion Failed!
Program: C:\Windows\system32\mfc140ud.dll
File: f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin1.inl
Line: 24
第二个错误:
Debug Assertion Failed!
Program: C:\Windows\system32\mfc140ud.dll
File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dbcore.cpp
Line: 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””是为了调试,我的程序在“test2”显示后立即产生这些错误,所以我推断错误来自“Open”行。
这是我初始化 CRecordset 的方式:
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!"));
}
我在很多网站上搜索都找不到答案,这就是我在这里提问的原因,在此先感谢。
第一个断言来自AfxGetResourceHandle
抱怨它没有正确设置。
这通常会发生,因为您没有在应用程序启动时调用 AfxWinInit
(如果您有一个控制台应用程序并且没有使用 MFC 向导设置它,这很可能是这种情况),或者您正在编写从非 MFC 代码调用的 MFC DLL,并且您没有在每个外部可见函数的开头添加 AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
。
我认为第二个是因为 MFC 要求您将 CALL 查询用花括号括起来,如下所示:{CALL GETCUSNAME(AGENTS)}
。否则无法识别调用,并且代码执行会进入不应采用的路径。