Zitat von
Jan:
Soll ich nun die Datenbank einmal öffnen, alle Daten auslesen und in den Speicher lesen, vielleicht mit Ausnahme der BLOB Felder, und dann im Speicher arbeiten?
Auf keinen Fall - dann wäre es ja keine
DB...
Zitat von
Jan:
Oder sollte ich besser die Verbindung zur Datenbank durchweg bestehen lassen und alle Datenbank Anfragen des GUIs über
SQL statements an die Datenbank geben? Also zum Beispiel einen Filter nach Schauspielern über ein SELECT statement an die Datenbank geben und damit dann die Ausgabe füllen?
schon eher. Du kannst aber auch das Filtern den Komponenten überlassen - je nach dem welche Du verwendest und ob die das können.
Zitat von
Jan:
Die nächste Frage:
Ich will dem Benutzer die Möglichkeit geben den Inhalt der tables weitgehend selber bestimmen zu können. D.h. ich will, dass er beliebige Datenfelder vorgeben kann und den Datentyp manuell festlegen kann.
Das Erstellen der tables ist ja nicht das Problem, sondern wie ich das ganze dann in meinem Programm handhabe.
Ich hatte eigentlich vorgehabt das ganze über Filmlisten - und Movieobjekte zu implementieren, allerdings wüsste ich garnicht wie ich ein Movieobjekt jetzt implementieren sollte, wenn ich nicht von vornherein weiss, wie die Daten aussehen, die das Objekt beherbergen soll. Dazu fällt mir eigentlich nur ein array ein.
Aber wie finde ich denn im Programm heraus wie der Benutzer den table erstellt hat, damit ich auch mit den Daten aus der Datenbank umgehen kann?
Nö, kein Array. Bilde vielleicht jeden Datentyp über eine Klasse nach (TDBInteger, TDBFloat, TDBText usw) und erstelle dann die Objekte indem Du aus der
DB die Tabellenfelder und ihre -typen ausliest. Die TDB...-Klassen enthalten einen Feldnamen, eine Variable für den Wert und vielleicht noch eine Feldtypbezeichnung. Daraus baust Du dir dann deine Movie-Klasse zusammen. In der könntest Du eine TObjectList haben, die die Felder enthält. Etwa so (nur dahingekritzelt, nicht geprüft):
Delphi-Quellcode:
TDBField = class
private
FName: string;
public
property Name: string read FName write FName;
end;
TDBIntegerField = class(TDBField)
private
FValue: Integer;
property
Value: Integer read FValue write FValue;
end;
{ usw, weitere TDB...Field-Klassen }
TFieldList = class
private
Fields: TObjectList;
public
constructor Create;
destructor Destroy; override;
procedure AddField(const aField: TDBField);
function GetField(const aFieldName: string): TDBField;
end;
TMovie = class
private
FieldList: TFieldList;
// weitere Felder und Funktionen
end;
Und dann baust Du dir einen TMovieProvider der einen TMovie zurück gibt und die Feldliste dann schon füllt.