Stefan M. Huber
2008-03-17 12:13:26 UTC
Grüße!
Ich bin auf der Suche nach einem generischen Ansatz, wie wir gewisse
Daten für unser Programm in der Datenbank bei Kunden austauschen können.
Wir wollen keine SQL-Scripts ausliefern, da die Daten manchmal
vorverarbeitet werden müssen, je nach Kunde. Daher habe ich einmal an
Textfiles gedacht, wo die auszutauschenden Daten beschrieben sind.
Dazu habe ich eine Klassenhierarchie unterhalb der selbst gebastelten
TDBUpdater gebaut, die sich für bestimmte Dateinamen selbst ausführen.
Der Austauschmechanismus funktioniert schon ganz gut. Damit wir das ganze
aber möglichst einfach auch verwalten können, und wir in der Syntax selbst
keine Fehler machen, wollte ich einen Editor für die Dateien schreiben.
Da die Daten alle unterschiedliche Struktur haben, dachte ich an folgendes:
Ich ziehe mir ein TDataSet hoch. Jede Klasse kann in ihrem Konstruktor die
Feldbeschreibungen an dieses Dataset anhängen (AddFieldDef), die sie
unterstützt. Zum Editieren der neuen Daten müsste ich dann nur ein
Formular erstellen, in dem ein DBGrid via DataSource an dieses DataSet
greift.
Habe ich irgendeine Chance, das ganze ohne einer Connection zu verwenden?
Also als reines TDataSet (von mir aus TADODataSet), das in einem DBGrid
editiert werden kann. Danach hätte ich das ganze einfach per SaveToFile
gespeichert (das ändert natürlich das Abarbeiten auch, ist aber jetzt mal
wurscht). Oder gibt's dafür bessere Ansätze?
Folgender Beispielcode ist das, wo ich momentan stehe. Funktioniert
natürlich nicht ("Fehlende Connection oder ConnectionString").
Voraussetzung: Globale Variable ds und ein DBGrid und eine DataSource am
Formular:
if Assigned(ds) then FreeAndNil(ds);
ds := TADODataSet.Create(nil);
ds.CursorLocation := clUseClient;
ds.CommandType := cmdFile; // auch andere probiert
with ds.FieldDefs do
begin
with AddFieldDef do
begin
Name := 'Spalte 1';
DataType := ftString;
Required := true;
end;
end;
DataSource.DataSet := ds;
DBGrid.DataSource := DataSource;
DataSource.enabled := true;
// DBGrid ist leer.
// ds.Open; // Eigenschaft CommandText fehlt
ds.SaveToFile('C:\temp\ado.txt', pfXML);
// Operation bei geschlossener Datenmenge nicht durchführbar
// ds.Close;
Stefan
Ich bin auf der Suche nach einem generischen Ansatz, wie wir gewisse
Daten für unser Programm in der Datenbank bei Kunden austauschen können.
Wir wollen keine SQL-Scripts ausliefern, da die Daten manchmal
vorverarbeitet werden müssen, je nach Kunde. Daher habe ich einmal an
Textfiles gedacht, wo die auszutauschenden Daten beschrieben sind.
Dazu habe ich eine Klassenhierarchie unterhalb der selbst gebastelten
TDBUpdater gebaut, die sich für bestimmte Dateinamen selbst ausführen.
Der Austauschmechanismus funktioniert schon ganz gut. Damit wir das ganze
aber möglichst einfach auch verwalten können, und wir in der Syntax selbst
keine Fehler machen, wollte ich einen Editor für die Dateien schreiben.
Da die Daten alle unterschiedliche Struktur haben, dachte ich an folgendes:
Ich ziehe mir ein TDataSet hoch. Jede Klasse kann in ihrem Konstruktor die
Feldbeschreibungen an dieses Dataset anhängen (AddFieldDef), die sie
unterstützt. Zum Editieren der neuen Daten müsste ich dann nur ein
Formular erstellen, in dem ein DBGrid via DataSource an dieses DataSet
greift.
Habe ich irgendeine Chance, das ganze ohne einer Connection zu verwenden?
Also als reines TDataSet (von mir aus TADODataSet), das in einem DBGrid
editiert werden kann. Danach hätte ich das ganze einfach per SaveToFile
gespeichert (das ändert natürlich das Abarbeiten auch, ist aber jetzt mal
wurscht). Oder gibt's dafür bessere Ansätze?
Folgender Beispielcode ist das, wo ich momentan stehe. Funktioniert
natürlich nicht ("Fehlende Connection oder ConnectionString").
Voraussetzung: Globale Variable ds und ein DBGrid und eine DataSource am
Formular:
if Assigned(ds) then FreeAndNil(ds);
ds := TADODataSet.Create(nil);
ds.CursorLocation := clUseClient;
ds.CommandType := cmdFile; // auch andere probiert
with ds.FieldDefs do
begin
with AddFieldDef do
begin
Name := 'Spalte 1';
DataType := ftString;
Required := true;
end;
end;
DataSource.DataSet := ds;
DBGrid.DataSource := DataSource;
DataSource.enabled := true;
// DBGrid ist leer.
// ds.Open; // Eigenschaft CommandText fehlt
ds.SaveToFile('C:\temp\ado.txt', pfXML);
// Operation bei geschlossener Datenmenge nicht durchführbar
// ds.Close;
Stefan