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.