Einzelnen Beitrag anzeigen

HolgerX

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

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