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

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

英文翻译将类似于“保留错误”和“无效连接字符串属性”!

我们可以在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 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修复了该错误!

上一篇:python – 在SQLAlchemy中,我可以从现有的ODBC连接创建引擎吗?


下一篇:tableau下载和安装ODBC驱动 连接MySQL方法及过程详解