Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#5

AW: Datenbank-Metainformationen abfragen schlägt fehl

  Alt 16. Mär 2016, 13:12
Also diesen Teil würde ich erstmal ändern:
Delphi-Quellcode:
      try
        LTable.Open(LTableName); // <--- hier knallts dann!

        LTable.FieldDefs.Update;
        if LTable.FieldDefs.Updated then
          LTable.SaveToFile('C:\Temp\' + LTableName + '.xml', TFDStorageFormat.sfXML);
      finally
        LTable.Free;
      end;
in etwa so:
Delphi-Quellcode:
try
  try
    LTable.Open(LTableName);
    LTable.FieldDefs.Update;
    if LTable.FieldDefs.Updated then
      LTable.SaveToFile('C:\Temp\' + LTableName + '.xml', TFDStorageFormat.sfXML);
  except
    // Die Fehlermeldungen sinnvollerweise irgendwie mitloggen, um dann ggfls. gezielter suchen zu können.
    on e : Exception do ShowMessage(LTableName + #13 + e.Message);
  end;
finally
  LTable.Free;
end;
Und dann schauen wir erstmal, bei welcher Tabelle es kracht.

Meine Erfahrung ist, dass das Auslesen von Tabellendefinitionen nicht immer und unbegrenzt bei allen Datenbank funktioniert. Insbesondere bei Systemtabellen kann es schonmal krachen.

Die meisten Datenbanken haben Views, mit denen man an die Tabellendefinitionen ... kommen kann. Beim SQL-Server ist es das Information Schema.
Sofern Dein Programm nicht mit beliebigen Datenbanken zurechtkommen muss, sondern nur mit SQL-Server würd' ich,
wenn alle Stricke reißen, dort suchen.

Sinngemäß in etwa so:
Delphi-Quellcode:
qry.SQL := Format('SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = %s
',[QuotedStr(LTableName)]);
Welche Tabelleninformationen zur Verfügung stehen, erfährt man hier unter Columns.

Das Information-Schema gehört zum Ansi-Standard (https://en.wikipedia.org/wiki/Information_schema) und steht bei ein paar Datenbanken zur Verfügung.

Ist jetzt nur hingedaddelt und nicht getestet.

Wie Baumina schon anmerkt, würde ich Con mit an Exporttable übergeben und dann LTable zuweisen.

Für jede Tabelle eine eigene Verbindung erstellen, aufmachen, Infos holen, Verbindung wegwerfen, halte ich nicht für wirklich sinnvoll.
  Mit Zitat antworten Zitat