Abfragen ob Spalte existiert

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.

Abfragen ob Spalte existiert

Beitragvon Aphadias » 18. Dez 2017, 11:24 Abfragen ob Spalte existiert

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?
Aphadias
 
Beiträge: 108
Registriert: 28. Okt 2015, 18:28

Beitragvon Michl » 18. Dez 2017, 12:19 Re: Abfragen ob Spalte existiert

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; 
Michl
 
Beiträge: 2221
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon Aphadias » 18. Dez 2017, 18:21 Re: Abfragen ob Spalte existiert

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:
Aphadias
 
Beiträge: 108
Registriert: 28. Okt 2015, 18:28

• Themenende •

Zurück zu Datenbanken



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried