Entwickler-Ecke

Datenbanken - DBFeld-Existenz prüfen


Nico80 - Do 06.11.08 12:55
Titel: DBFeld-Existenz prüfen
Hallo,

ich beschreibe mal kurz mein Problem.

Ich habe im Verlauf meiner Entwicklung verschiedene Datenbank-Versionen. D.h. es kommen immer neue Felder hinzu.
Für Daten in die Datenbnak zuschreiben benutze ich die FIBPlus-Dataset-Komponente.
Abstraktes Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
Dataset.SelectSQL := 'Select * from TABLE';
DataSet.UpdateSQL := 'Insert INTO TABLE test1, test2 VALUES (test1, test2);
....
Dataset.FieldValues['
test1'] := test1;
Dataset.FieldValues['
test2'] := test2;


Jetzt enthält meine Datenbank aber nur Feld "test1". Kann ich irgendwie die Komponente dazubringen nur "test1" zu füllen und nicht "test2".
Logisch ist wenn Feld "test2" in der Datenbank vorhanden ist auch wieder das Feld in der Datenbank zu schreiben.

Hoffe ich habe mein Problem verständlich erklärt und danke bereits jetzt für Tipps.


Xentar - Do 06.11.08 13:26

Soweit ich weiß, kann man schon irgendwie abfragen, welche Tabellen es alles gibt - halte ich aber für sehr aufwändig, da du dies dann vor jeder Abfrage prüfen müsstest. Somit hättest du jede Abfrage doppelt und dreifach.. mal mit der einen Tabelle, mal mit der anderen, dann wieder mit beiden, usw.

Ich selber handhabe das so: Ich hab in jeder Datenbank eine Tabelle DB_VERSION, wo eine Versionsnummer drinsteht. Meine Programme, die darauf zugreifen, prüfen nach dem Verbinden, ob es sich um die aktuellste Version handelt, und führen bei Bedarf einige Update-Scripte aus.
Damit kann ich recht sicher sein, dass die Datenbank immer auf dem Stand ist, wie ich sie erwarte.


zuma - Do 06.11.08 13:41

versuchs mal mit

Delphi-Quelltext
1:
2:
if not (dataset.findfield('test2') = nil) then
 Dataset.FieldValues['test2'] := test2;


Nico80 - Do 06.11.08 14:30

user profile iconzuma hat folgendes geschrieben Zum zitierten Posting springen:
versuchs mal mit

Delphi-Quelltext
1:
2:
if not (dataset.findfield('test2') = nil) then
 Dataset.FieldValues['test2'] := test2;


Es gibt auch "Dataset.FieldExist". Das klappt auch wunderbar.
Aber sobald das SQL-Statement abgefeuert wird, gibt es eine Fehelrmeldung das die Spalte nicht existiert.
Es müsste eigenltich noch eine Methode geben, die das SQL-Statement bearbeitet.


hansa - Do 06.11.08 15:05

user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
...soweit ich weiß, kann man schon irgendwie abfragen, welche Tabellen es alles gibt - halte ich aber für sehr aufwändig..


Die Tabellen ?


Delphi-Quelltext
1:
2:
3:
  DbDS.Close;
  DbDS.SelectSQL.Text := 'select RDB$RELATION_NAME from rdb$relations order by RDB$RELATION_NAME';
  DbDS.Open;


Felder geht ähnlich. Aber ehrlich gesagt, so was hat man schnell mal kurz mit IBExpert nachgeguckt. 8) Ich brauche den RDB$ Kram lediglich, um leere Tabellen auf einen Schlag rauszufinden. Oben ist das Delphi-Beispiel. Auch da wäre es einfacher das select-Statement in IBExpert ablaufen zu lassen, anstatt selber Programm dafür zu schreiben.