MFC ODBC SQLConfigDataSource() 未处理的异常

Posted

技术标签:

【中文标题】MFC ODBC SQLConfigDataSource() 未处理的异常【英文标题】:MFC ODBC SQLConfigDataSource() Unhandled Exception 【发布时间】:2019-09-27 16:43:40 【问题描述】:

我正在尝试更新旧的 c++ MFC 程序,而当我尝试创建 DSN 时,SQLConfigDataSource 会导致未处理的异常。错误消息说:

0x00007FFC97D89129 (KernelBase.dll) 处的未处理异常: 0x0000087A(参数:0xFFFFFFFF887A0001、0x0000000000000053)

代码运行正常,功能正常,但我似乎无法摆脱这个错误。

int mlen;
char* szDesc = new char[256];
sprintf_s(szDesc, 256, "DSN=%s?DBQ=%s?FIL=MicrosoftAccess?",
    IV_DATABASE_NAME, // DSN name
    sDBPath); // full file name for accdb file

mlen = strlen(szDesc);
for (int i = 0; i < mlen; i++) 
    if (szDesc[i] == '?')
        szDesc[i] = '\0';


SQLConfigDataSource(NULL, ODBC_ADD_DSN,
    "Microsoft Access Driver (*.mdb, *.accdb)",
    (LPCSTR)szDesc);

delete szDesc;

【问题讨论】:

【参考方案1】:

SQLConfigDataSource 的参数格式不正确。见:

SQLConfigDataSource Function

还有:

ConfigDSN Function

每一对都以一个空字节结束,整个列表是 以空字节终止。 (即两个空字节标记结束 列表。)

我已经让这个工作了十多年了,称之为:

if( ! bOk )//failed to open the default database for lack of DSN

    TRACE("Could not find DSN\n");

    BOOL ret= SQLConfigDataSource(
        NULL,
        ODBC_ADD_DSN,
        (LPSTR) "Microsoft Access Driver (*.mdb)\0",
        (LPSTR) "DSN=MS Access Database\0"
        "Description=MS Access Database\0"
        );
    if( ! ret )
    
        AfxMessageBox( _T("The 'Data Source Name' failed to install\nPlease call My Company\n800-555-5555") );
        return FALSE;
    

请注意,前两个额外的空值是多余的,但它们没有害处。但最后一行遵循两个 null,列表结尾,规则。

"Description=MS Access Database\0"

您应该检查SQLConfigDataSource 的返回值。您可以按照诊断中的说明致电SQLInstallerError。此外,cmets 声明关键字和值不应包含?

【讨论】:

【参考方案2】:

安装 Microsoft Access 数据库引擎 2016 Redistributable 时发生错误。我安装了 2010 Redistributable,它运行完美,没有任何问题。

【讨论】:

以上是关于MFC ODBC SQLConfigDataSource() 未处理的异常的主要内容,如果未能解决你的问题,请参考以下文章

更新数据库 MFC C++ ODBC CRecordset

MFC操作数据库有关的类

我在哪里可以获得有关 ODBC 和 Access 数据库的高质量信息?

C++ODBC MFC编程数据源的显示中,绑定了数据表,却只能显示第一列的数据。怎么才能让它全部显示出来。

MFC怎么连接数据库

MFC 课程总结