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

ODBC export to Excel fails under Windows 7, Windows 8.x and Windows 10

本文关键字:Windows8 Windows10 失败 Windows7 Excel ODBC      更新时间:2023-10-16

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

英文翻译可能类似于"保留错误"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);