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)}。否则无法识别调用,并且代码执行会进入不应采用的路径。