MFC ODBC SQLConfigDataSource()未处理的异常

时间:2019-09-27 16:43:40

标签: c++ sql ms-access mfc odbc

我正在尝试更新旧的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;

3 个答案:

答案 0 :(得分:1)

无需回滚可再发行组件,您可以尝试以下方法:

    BOOL ret= SQLConfigDataSource(
                                  NULL,
                                  ODBC_ADD_DSN,
                                  _T("Microsoft Access Driver (*.mdb);"),
                                  _T("DSN=MS Access Database;"
                                     "Description=MS Access Database")
                                  );

我发现,如果您使用分号而不是\ 0,则可以正常工作。另外,无论文档说什么,都不需要将属性字符串加倍终止。

答案 1 :(得分:0)

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。另外,注释还指出关键字和值不应包含?

答案 2 :(得分:0)

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