Einzelnen Beitrag anzeigen

rawi

Registriert seit: 16. Mär 2010
Ort: im Westen Deutschlands
38 Beiträge
 
Delphi 2010 Professional
 
#1

SQL-Server auflisten dauert lange

  Alt 28. Jun 2020, 14:43
Datenbank: SQL-Server • Version: ab 2012 • Zugriff über: -
Hallo Delphi-Gemeinde,

ich möchte mich heute mit einem (hoffentlich) kleinen Problem an euch wenden. Leider habe ich bisher keine Lösung oder Erklärung für mein Problem gefunden.

Ich habe folgende Routine in mein Programm eingebaut.

Delphi-Quellcode:
procedure TfrmMain.ListAvailableSQLServers(Names: TStringList);
  {- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
  function PtCreateADOObject(const ClassID: TGUID): IUnknown;
  var
    Status: HResult;
    FPUControlWord: Word;
  begin
    asm
      FNSTCW FPUControlWord
    end;
    Status := CoCreateInstance(
                CLASS_Recordset,
                nil,
                CLSCTX_INPROC_SERVER or
                CLSCTX_LOCAL_SERVER,
                IUnknown,
                Result);
    asm
      FNCLEX
      FLDCW FPUControlWord
    end;
    OleCheck(Status);
  end;
  {- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
var
  RSCon: ADORecordsetConstruction;
  Rowset: IRowset;
  SourcesRowset: ISourcesRowset;
  SourcesRecordset: _Recordset;
  SourcesName, SourcesType: TField;
begin
  SourcesRecordset := PtCreateADOObject(CLASS_Recordset) as _Recordset;
  RSCon := SourcesRecordset as ADORecordsetConstruction;
  SourcesRowset := CreateComObject(ProgIDToClassID('SQLOLEDB Enumerator')) as ISourcesRowset;
  OleCheck(SourcesRowset.GetSourcesRowset(nil, IRowset, 0, nil, IUnknown(Rowset)));
  RSCon.Rowset := RowSet;
  with TADODataSet.Create(nil) do
  try
    Recordset := SourcesRecordset;
    SourcesName := FieldByName('SOURCES_NAME');
    SourcesType := FieldByName('SOURCES_TYPE');
    Names.BeginUpdate;
    Names.Clear;
    try
      while not EOF do
      begin
        if (SourcesType.AsInteger = DBSOURCETYPE_DATASOURCE) and (SourcesName.AsString <> '') then
          Names.Add(SourcesName.AsString);
          Next;
      end;
    finally
      Names.EndUpdate;
    end;
  finally
    Free;
  end;
end;
Hat bisher auch super auf mehreren Rechnern funktioniert. Vor einiger Zeit startete das Programm auf einem Rechner sehr langsam. Auf allen anderen Rechnern startete das Programm wie gewohnt. Bisher jedenfalls. Mittlerweile ist der Programmstart auf allen Rechnern langsam.

Der Grund für den langsamen Start ist wohl die folgende Programmzeile.

OleCheck(SourcesRowset.GetSourcesRowset(nil, IRowset, 0, nil, IUnknown(Rowset)));

Die Ausführung dieses Befehls dauert 45 sekunden. Vorher wurde das kpl. Programm in ca. 5-10 sekunden gestartet.

An den einzelnen Rechnern wurde eigentlich nichts verändert. Normale Win 10 Pro Rechner, mit unterschiedlichen Virenprogrammen (MS und Norton) und unterschiedlichen Office-Paketen (2010 bis Office 365). Lediglich die Windowsupdates wurden installiert.

Nun meine Frage, hat jemand eine Idee wo das Problem liegen könnte?

Vorab schon mal vielen Dank.
Gruß Rainer
  Mit Zitat antworten Zitat