ODBC导出到Excel在Windows7、Windows8.x和Windows10下失败



我刚刚从头开始创建了一些代码(在底部),显示了一个简单的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

英文翻译可能类似于"保留错误"one_answers"无效连接字符串属性"!

我们可以在Windows 7、Windows 8.1和Windows 10上重新编程。我们建议Windows安全更新存在问题,但我们不确定。类似的代码多年来一直有效。

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

有人能纠正这个问题吗?

编辑: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 (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;

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

受影响的补丁包括:

Windows 7 SP1和Windows Server 2008 R2 SP

KB4041681-2017-10基于x86系统的Windows 7安全月度质量汇总KB4041678-2017-10基于x64系统的Windows嵌入式标准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修复了错误

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

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

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);

最新更新