Abfragen ob Spalte existiert

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Abfragen ob Spalte existiert

Beitrag von Aphadias »

moin

eigentlich wollte ich nur kurz einen Updater schreiben, aber mir fehlt Hintergrundwissen. Also zum Thema... ich habe eine vorhandene Datenbank die jetzt ein paar neue Spalten bekommen soll und es darf aber nicht der alte Datensatz verloren gehen.

Der Updater soll auch vorher erst mal prüfen ob eine der neuen Spalten schon vorhanden ist.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  abfrage:boolean;
begin
  if daten.FileName = '' then
  begin
    ShowMessage('Erst eine Datenbank auswählen!');
  end
  else
  begin
    con.LibraryLocation:=ExtractFilePath(ParamStr(0)) + 'sqlite3.dll';
    con.Database:=daten.FileName;
    con.Connected:=true;
 
    query.SQL.Clear;
    query.Params.Clear;
    query.SQL.Text:='select * from mat';
    query.Open;
 
    if assigned(query.Fields.FindField('insgesamt')) then
    begin
      ShowMessage('ist da');
    end
    else
    begin
      ShowMessage('ist nicht da');
    end;
 
    query.Close;
  end;
end;


Problem egal wie ich mein IF schreibe mit verschiensten Befehlen, es ist dann entweder kein BOOL oder der arbeitet die Schleife nicht ordentlich ab. Aktuell habe ich es wie oben beschrieben.
Hat jemand mal ein Tipp wie ich aus dem FindField ein Bool mache?

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Abfragen ob Spalte existiert

Beitrag von Michl »

Ungetestet und wenn ich die Frage richtig verstanden habe:

Wenn es nur darum geht eine Funktion zu schreiben?!:

Code: Alles auswählen

function TForm1.IsFieldAvailable(const AFieldName: String): Boolean;
begin
  con.LibraryLocation:=ExtractFilePath(ParamStr(0)) + 'sqlite3.dll';
  con.Database:=daten.FileName;
  con.Connected:=true;
 
  query.SQL.Clear;
  query.Params.Clear;
  query.SQL.Text:='select * from mat';
  query.Open;
  Result := Assigned(Query.FindField(AFieldName));
  query.Close;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  if daten.FileName = '' then
  begin
    ShowMessage('Erst eine Datenbank auswählen!');
  end
  else
  begin
    if IsFieldAvailable('insgesamt') then
    begin
      ShowMessage('ist da');
    end
    else
    begin
      ShowMessage('ist nicht da');
    end;
  end;
end;

Wobei man nach Spalteninformationen normalerweise per PRAGMA sucht (enthält dann diese Fields https://www.safaribooksonline.com/library/view/using-sqlite/9781449394592/re205.html). Eine Funktion könnte dann ungefähr so aussehen:

Code: Alles auswählen

function TForm1.IsFieldAvailable(const AFieldName: String): Boolean;
begin
  Result := False;
 
  con.LibraryLocation:=ExtractFilePath(ParamStr(0)) + 'sqlite3.dll';
  con.Database:=daten.FileName;
  con.Connected:=true;
 
  query.SQL.Clear;
  query.Params.Clear;
  query.SQL.Text:='PRAGMA table_info(mat);';
  query.Open;
  query.First;
  while not query.EOF do
  begin
    if query.Fields[1].AsString = AFieldName then Exit(True);
    queryt.Next;
  end;
  query.Close;
end;   

PS: Die Connection-Verbindung würde ich in jedem Fall aus der Funktion auslagern. Auch wäre eine Kapselung des Funktions-Codes in einen Try-Except-Block sicherlich sinnvoll.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Re: Abfragen ob Spalte existiert

Beitrag von Aphadias »

Ich merke gerade das meine Lösungen auch schon funktioniert hatten. Aber wie du schon sagtest sollte ich Try Except Block einfügen weil das hatte zu den Fehler geführt den ich nicht bemerkt habe.

Aber danke für deine Hilfe das mit der function ist besser :wink:

Antworten