C++ 在Windows 7、Windows 8.x和Windows 10下,ODBC导出到Excel失败

C++ 在Windows 7、Windows 8.x和Windows 10下,ODBC导出到Excel失败,c++,excel,mfc,odbc,C++,Excel,Mfc,Odbc,我刚刚从头创建了一些代码(在底部),显示了一个简单的Excel导出。调用database.OpenEx时,代码失败,出现异常 所示的例外情况是: Reservierter Fehler (-5016); es gibt keine Meldung für diesen Fehler. Ungültiges Attribut für die Verbindungszeichenfolge. CREATE_DB Ungültiges Attribut für die Verbindungszeich

我刚刚从头创建了一些代码(在底部),显示了一个简单的Excel导出。调用
database.OpenEx
时,代码失败,出现异常

所示的例外情况是:

Reservierter Fehler (-5016); es gibt keine Meldung für diesen Fehler.
Ungültiges Attribut für die Verbindungszeichenfolge. CREATE_DB
Ungültiges Attribut für die Verbindungszeichenfolge. CREATE_DB
Ungültiges Attribut für die Verbindungszeichenfolge. CREATE_DB
Ungültiges Attribut für die Verbindungszeichenfolge. CREATE_DB
Allgemeine Warnung Registrierungsschlüssel 'Temporary (volatile) Jet DSN for process 0x844 Thread 0x1850 DBC 0xab824c Excel' kann nicht geöffnet werden.
Ungültiges Attribut für die Verbindu
英文翻译可能类似于“保留错误”和“无效连接字符串属性”

我们可以在Windows7、Windows8.1和Windows10上重新编程。我们建议Windows安全更新有问题,但我们不确定。类似的代码工作了多年

有人能看到连接字符串中的故障吗

有人能纠正这个问题吗

编辑:Windows 7接缝也将受到影响

以下安全修补程序导致此问题:

Windows 7   KB4041681
Windows 8.1 KB40416393
Windows 10  KB4040724
            KB4041676
这里是代码(代码只是一个快速拷贝)。我唯一的改变是使它与unicode兼容

CDatabase database;
CString sDriver = _T("MICROSOFT EXCEL DRIVER (*.XLS)"); // exactly the same name as in the ODBC-Manager
CString sExcelFile = _T("demo.xls");                // Filename and path for the file to be created
CString sSql;

TRY
{
  // Build the creation string for access without DSN
  sSql.Format(_T("DRIVER={%s};DSN='';READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s"),
            sDriver.GetString(), sExcelFile.GetString(), sExcelFile.GetString());

  // Create the database (i.e. Excel sheet)
  if (database.OpenEx(sSql,CDatabase::noOdbcDialog))
  {
    // Create table structure
    sSql = _T("CREATE TABLE demo (Name TEXT,Age NUMBER)");
    database.ExecuteSQL(sSql);

    // Insert data
    sSql = _T("INSERT INTO demo (Name,Age) VALUES ('Bruno Brutalinsky',45)");
    database.ExecuteSQL(sSql);

    sSql = _T("INSERT INTO demo (Name,Age) VALUES ('Fritz Pappenheimer',30)");
    database.ExecuteSQL(sSql);

    sSql = _T("INSERT INTO demo (Name,Age) VALUES ('Hella Wahnsinn',28)");
    database.ExecuteSQL(sSql);
  }

  // Close database
  database.Close();
}
CATCH_ALL(e)
{
    e->ReportError();
    e->Delete();
}
END_CATCH_ALL;

这个问题实际上是由于安全更新中的一个bug引起的。目前,除了卸载安全补丁或使用其他导出格式,我看不到其他解决方案

受影响的补丁包括:

Windows 7 SP1和Windows Server 2008 R2 SP

KB4041681--2017-10基于x86系统的Windows 7安全月度质量汇总 KB4041678--针对基于x64系统的Windows嵌入式标准7的2017-10仅安全质量更新

Windows 8.1和Windows Server 2012 R2

KB4041693—针对基于x86系统的Windows 8.1的2017-10安全月度质量汇总 KB4041687--针对基于x86系统的Windows 8.1的2017-10纯安全质量更新

Windows 10和Windows Server 2016(1607版)

KB4041691--Windows 10 1607版和Windows Server 2016的2017-10累积更新

Windows 10和Windows Server 2016(1703版)

KB4041676--2017-10 Windows 10 1703版的累积更新

其他社区(Tectnet、Answers、Social MSDN)中有多个线程讨论同一问题,除了卸载修补程序外,没有任何解决方法


编辑(2017-11-21):对于Windows 10,该漏洞已通过KB4048955修复

自2017年10月12日Windows更新以来,我遇到了完全相同的问题

下面的信息在Win7上解决了问题,但在Win10上没有解决问题。 在Win10上,生成“未处理的异常”的是
::SQLConfigDataSource(hwndpresent、fRequest、sDriver、sAttributes)

Win7的解决方案:

我还有其他参数:
FIL=excel2000,DriverID=790 DRIVER={Microsoft Excel DRIVER(*.xls)}

这似乎可以通过以下方法解决:
FIL=excel12.0,DriverID=1046 DRIVER={Microsoft Excel驱动程序(*.xls,*.xlsx,*.xlsm,*.xlsb)}

如果您有一个与这些参数兼容的Excel版本,这将起作用。您也可以尝试Excel 2000和Excel 12.0之间的版本

对于只有Excel 2000的PC,因此新参数一开始不起作用:为了解决此问题,我从Microsoft下载安装了
AccessDatabaseEngine_X64.exe
;这启用了Microsoft Excel驱动程序(*.xls、*.xlsx、*.xlsm、*.xlsb)的使用

参数示例:

m_sDsn ="DRIVER={Microsoft Excel Driver (*.xls)};DSN='ODBC_NameXls';FIRSTROWHASNAMES=1;READONLY=TRUE;CREATE_DB="Excelfilename.xls";DBQ=Excelfilename.xls;FIL=Excel 2000;DriverID=790";

m_sDsn ="DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DSN='ODBC_NameXls';FIRSTROWHASNAMES=1;READONLY=TRUE;CREATE_DB="Excelfilename.xls";DBQ=Excelfilename.xls;FIL=Excel 12.0,DriverID=1046";

m_Database->OpenEx(m_sDsn, CDatabase::openReadOnly | CDatabase::noOdbcDialog);

尝试替换为
database.OpenEx(0,CDATA Base::forceOdbcDialog)
手动分配文件
“c:\\path\\dome.xls”
,当我按“确定”时,我会收到一个带有意外错误的消息框。也不例外,但是Excel文件不能打开进行写入。是的,这很奇怪。代码适用于Access驱动程序,但不适用于Excel。我在Win 10上安装了KB4040724和KB4041676,但您的代码示例适用于我!使用VS2017,我刚刚使用向导创建了一个具有MFC支持的控制台应用程序,并复制粘贴了您的代码。您的excel驱动程序的版本是什么?我的是10.00.15063.00。Windows 10(版本1709)KB4043961--卸载修复了我的此问题卸载为修复安全风险而发布的安全包不是一个真正的好解决方案;)谢谢在Windows7上,除了KB4041681和KB4041678之外,我们还必须卸载更新KB4040685才能使其正常工作。