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

我从头开始创build了一些代码(在底部),显示了一个简单的Excel导出。 当调用database.OpenEx时,代码失败,并发生exception。

显示的例外是:

 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 

英文翻译就像“保留错误”和“无效连接string”!

我们可以在Windows 7,Windows 8.1和Windows 10上重新制作。我们build议Windows安全更新存在问题,但是我们不确定。 类似的代码工作多年。

任何人都可以看到连接string中的失败?

任何人都可以重现这个问题吗?

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

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

 Windows 7 KB4041681 Windows 8.1 KB40416393 Windows 10 KB4040724 KB4041676 

这里的代码(代码只是来自Codeproject的快速拷贝)。 我唯一的改变是使它与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 (ie 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; 

这个问题实际上是由于安全更新中的一个错误而出现的。 目前,除了卸载安全补丁程序或使用其他导出格式外,没有其他解决scheme。

受影响的补丁是:

Windows 7 SP1和Windows Server 2008 R2 SP

KB4041681 – 2017-10适用于基于x86的系统的Windows 7安全月度质量汇总KB4041678 – 2017-10针对基于x64的系统的Windows Embedded Standard 7的安全性质量更新

Windows 8.1和Windows Server 2012 R2

KB4041693 – 2017-10适用于基于x86的系统的Windows 8.1安全月度质量汇总KB4041687 – 2017-10用于基于x86的系统的Windows 8.1安全质量更新

Windows 10和Windows Server 2016(版本1607)

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

Windows 10和Windows Server 2016(版本1703)

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

其他社区有多个线程(Tectnet,Answers,Social MSDN)讨论相同的问题,没有任何解决方法,除了卸载补丁。

编辑(2017-11-21):对于Windows 10,该错误已修复KB4048955!

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

下面的信息解决了Win7上的问题,但Win10上没有解决问题。 在Win10上,它是::SQLConfigDataSource(hwndParent, fRequest, sDriver, sAttributes) ,它们会生成“未处理的exception”

解决scheme为Win7:

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

这似乎是解决使用: FIL=Excel 12.0,DriverID=1046 DRIVER={Microsoft Excel Driver (*.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);