我正在尝试更新旧的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;
SQLConfigDataSource
的参数格式错误。请参阅:
和:
每对以一个空字节结尾,并且整个列表为以空字节终止。 (也就是说,两个空字节标志着列表。)
我从事这项工作已有十多年了,并称之为:
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
。此外,注释还指出关键字和值不应包含?
。