AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi "Unerwarteter Fehler vom externen Datenbanktreiber (1)" beim Öffnen einer XLS-Datei
Thema durchsuchen
Ansicht
Themen-Optionen

"Unerwarteter Fehler vom externen Datenbanktreiber (1)" beim Öffnen einer XLS-Datei

Ein Thema von mjustin · begonnen am 6. Nov 2017 · letzter Beitrag vom 15. Nov 2017
Antwort Antwort
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
984 Beiträge
 
Delphi 6 Professional
 
#1

AW: "Unerwarteter Fehler vom externen Datenbanktreiber (1)" beim Öffnen einer XLS-Dat

  Alt 6. Nov 2017, 10:20
Hmm..

Hab da mal was aus einem Testtool herausgenommen:

Delphi-Quellcode:

uses
  ADODB;

const
  c_JetOleDB = 'Microsoft.Jet.OLEDB.4.0';
  c_ACEOleDB = 'Microsoft.ACE.OLEDB';


procedure GetADOProviderNames(AProviderList : TStrings);
begin
  AProviderList.Clear;
  GetProviderNames(AProviderList);
end;

function GetSQLServerProvider: string;
var
  tmpProviderList : TStringList;
  i : integer;
begin
  Result := '';
  tmpProviderList := TStringList.Create;
  try
    GetADOProviderNames(tmpProviderList);
    tmpProviderList.Sort;

    if tmpProviderList.IndexOf(c_JetOleDB) > -1 then
      Result := c_JetOleDB;

    for i := 0 to tmpProviderList.Count -1 do begin
      if Pos(c_ACEOleDB, tmpProviderList[i]) = 1 then
        Result := tmpProviderList[i];
    end;

  finally
    tmpProviderList.Free;
  end;
end;


procedure OpenExcelFile(ADOConnectionExcel : TADOConnection; AExcelFile : string; AWithHeader : boolean);
var
  tmpProvider : string;
  tmpProperties : string;
  tmpExcel : string;
  tmpHeader : string;
  tmpPWString : string;
  tmpExt : string;
begin
  ADOConnectionExcel.Close;

  tmpExt := LowerCase(ExtractFileExt(AExcelFile));
  tmpExcel := '';
  if tmpExt = '.xls'  then tmpExcel := 'Excel 8.0';
  if tmpExt = '.xlsxthen tmpExcel := 'Excel 12.0 Xml';
  if tmpExt = '.xlsmthen tmpExcel := 'Excel 12.0 Macro';
  if tmpExt = '.xlsbthen tmpExcel := 'Excel 12.0';

  if tmpExcel = 'then begin
    ShowMessage('Invalid FileExt!');
    exit;
  end;

  if AWithHeader then
    tmpHeader := 'HDR=YES'
  else
    tmpHeader := 'HDR=NO';

  tmpProperties := 'Extended Properties="' + tmpExcel + ';' + tmpHeader + ';IMEX=1";';

  // Kein Passwort setzen (Ja, auch bei ACE ist die Property mit 'Jet OLEDB:')
  tmpPWString := 'Jet OLEDB:Database Password="";';

  tmpProvider := GetSQLServerProvider;
  ADOConnectionExcel.ConnectionString := 'Provider='+tmpProvider+';' + tmpProperties + tmpPWString + 'Data Source=' + AExcelFile;
  ADOConnectionExcel.Open;
end;
Hiermit wird anhand der Extension und der installierten ACE-Version der Connection-String dynamisch zusammen gesetzt.

Es wird immer die höchste ACE-Version verwendet, auch wenn mehrere installiert wurden, selbst, wenn aufgrund der Office-Version noch JET verwendet werden könnte.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#2

AW: "Unerwarteter Fehler vom externen Datenbanktreiber (1)" beim Öffnen einer XLS-Dat

  Alt 6. Nov 2017, 10:34
Hab da mal was aus einem Testtool herausgenommen:
Herzlichen Dank dafür! In der Registry fand ich auch die Nummer der installierten Version für ACE, damit bin ich mit etwas Glück auch einen Schritt in Richtung Workaround.
Michael Justin
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#3

AW: "Unerwarteter Fehler vom externen Datenbanktreiber (1)" beim Öffnen einer XLS-Dat

  Alt 6. Nov 2017, 10:47
Hiermit wird anhand der Extension und der installierten ACE-Version der Connection-String dynamisch zusammen gesetzt.
Das funktioniert hier schon mal soweit, der Connectionstring ist nun

Code:
Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Sandbox\***.xls; Extended Properties="Excel 8.0; HDR=YES; IMEX=0"

Nun erscheint beim Start eine neue Fehlermeldung:

Code:
"Installierbares ISAM nicht gefunden"
Umgebung ist Windows 7 64 Bit, Excel 2010 32 Bit, mit OLEDB ACE 32 Bit.
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.688 Beiträge
 
Delphi 12 Athens
 
#4

AW: "Unerwarteter Fehler vom externen Datenbanktreiber (1)" beim Öffnen einer XLS-Dat

  Alt 6. Nov 2017, 11:33
Das Problem scheint auch anderweitig bekannt zu sein: Excel Import u. Export - Unerwarteter Fehler vom externen Datenbanktreiber
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#5

AW: "Unerwarteter Fehler vom externen Datenbanktreiber (1)" beim Öffnen einer XLS-Dat

  Alt 6. Nov 2017, 12:09
Wunderbar, vielen Dank! Die Lösung funktioniert wie dort für Windows 7 beschrieben (Deinstallation zweier Updates).

Wir müssen nun schauen ob wir das Problem nur durch Sperren der beiden Updates vermeiden können, oder ob es bessere Lösungen gibt die mit Delphi 2009 funktionieren. Da die XLS Dateien von externen Partnern kommen, ist eine Umstellung auf XLSX oder andere Formate aktuell nicht abzusehen.
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.688 Beiträge
 
Delphi 12 Athens
 
#6

AW: "Unerwarteter Fehler vom externen Datenbanktreiber (1)" beim Öffnen einer XLS-Dat

  Alt 6. Nov 2017, 12:14
Vielleicht bringt dir dieser Thread noch was: ADO after KB4041681
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#7

AW: "Unerwarteter Fehler vom externen Datenbanktreiber (1)" beim Öffnen einer XLS-Dat

  Alt 6. Nov 2017, 12:25
Vielleicht bringt dir dieser Thread noch was: ADO after KB4041681
Danke! Darin wird auch auf https://social.msdn.microsoft.com/Fo...=sqldataaccess verlinkt, darin wiederum wird der Fehler "Could not find installable ISAM." berichtet, der bei alten Excel Dateien un Verwendung von ACE OLEDB auftritt. Daher könnte es auch den von mir festgestellten ISAM Fehler erklären.

Auch ist ein offizielles Statement enthalten:
Zitat:
** Official Update **

We have created a statement on this issue in the following link:

https://blogs.msdn.microsoft.com/dat...urity-updates/

As a further update, the Office product team has agreed to look into this to work towards a solution. That said, please still note that the JET provider has been deprecated for 15 years, and we still recommend switching to the ACE provider or the SSIS Excel connector.

Thank you all again for providing the workaround you have found and shared with the rest of the community.

I will be deleting my earlier comments to help avoid confusion.

~Chrone with Microsoft SQL Support~

(Not a forum moderator)
Im verlinkten Artikel wird darauf aufmerksam gemacht, dass Jet seit dem Jahr 2000 "deprecated" ist:

When looking into this issue, the largest thing to note is: The JET provider has been deprecated as of 2002. The last changes were made to this in 2000.

Empfohlen wird: "Use Microsoft.ACE.OLEDB.12.0 or Microsoft.ACE.OLEDB.16.0"

Update: die aktuelle Version ACE OLEDB (2016) zeigt nicht den "ISAM" Fehler, den man bei der 2010er Version erhielt. Für die Jet->ACE Umstellung müssen die Feldkomponenten aktualisiert werden (WideString wird zu WideMemo), aber das ist für eine kleine Anwendung überschaubarer Aufwand.
Michael Justin

Geändert von mjustin ( 6. Nov 2017 um 15:44 Uhr)
  Mit Zitat antworten Zitat
kompi

Registriert seit: 27. Apr 2012
Ort: Duisburg
58 Beiträge
 
Delphi 12 Athens
 
#8

AW: "Unerwarteter Fehler vom externen Datenbanktreiber (1)" beim Öffnen einer XLS-Dat

  Alt 15. Nov 2017, 11:36
Angeblich hat Microsoft dieses Problem mit dem heutigen Update (KB 4048954), zumindest für Windows 10, behoben.

Gruß Kompi
Detlef Schmitz
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#9

AW: "Unerwarteter Fehler vom externen Datenbanktreiber (1)" beim Öffnen einer XLS-Dat

  Alt 15. Nov 2017, 13:24
Angeblich hat Microsoft dieses Problem mit dem heutigen Update (KB 4048954), zumindest für Windows 10, behoben.

Gruß Kompi
Ja, der Blog Eintrag unter https://blogs.msdn.microsoft.com/dat...urity-updates/ wurde aktualisiert und die unterstützten Versionen aufgelistet, darunter auch Windows 7.

In der VMWare Umgebung nutzen wir nun den empfohlenen neueren ACE OLEDB Treiber für den Excel-Zugriff und es funktioniert problemlos, lediglich manche Felder mussten von WideStringField auf WideMemoField umgestellt werden.

Danke für den Hinweis!
Michael Justin
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#10

AW: "Unerwarteter Fehler vom externen Datenbanktreiber (1)" beim Öffnen einer XLS-Dat

  Alt 6. Nov 2017, 12:22
Da die XLS Dateien von externen Partnern kommen, ist eine Umstellung auf XLSX oder andere Formate aktuell nicht abzusehen.
Wie gesagt, man könnte die Datei vor dem Import konvertieren. Z.B. via Com Server mittels Excel selbst oder mit Bibliotheken, die natürlich ohne ADO die Daten auslesen.
Gruß, Jo
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz