Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   FreePascal DB neu einlesen? (https://www.delphipraxis.net/182218-db-neu-einlesen.html)

AlexII 9. Okt 2014 20:08

Datenbank: SQLite • Version: 3 • Zugriff über: Lazarus, SQLite3Connection

DB neu einlesen?
 
Ich habe in meiner DB eine neue Spalte hinzugefügt und frage diese nun mit meiner Anwendung ab, die diese gibt mir eine Fehlermeldung aus:

Code:
EDatabaseError
no such column: tbmain.number
Diese Spalte ist aber in der DB definitiv vorhanden und gefüllt. Erstellt ist diese auch richtig.

Ich vermute, dass mein Lazarus irgendwie noch an irgendwelche alte DB zugreift, aber kann das sein? Habe nur eine DB im Verzeichnis.

Danke falls mir jemand weiter helfen kann.

AlexII 9. Okt 2014 20:57

AW: DB neu einlesen?
 
Hier der ganze Code:

Delphi-Quellcode:
// Aufgaben laden
procedure TForm1.LoadJobslistByStart(aFlag: Integer; aListView: TListView);
var
  MyItem: TListItem;
  n: Integer;
begin
  try

    aListView.Items.BeginUpdate;
    aListView.Clear;

    SQLQuery1.Close;
    SQLQuery1.SQL.Text := 'SELECT tbmain.id_tbmain, '
    + 'tbmain.number, ' // <------- hier die Problemstelle
    + 'tbmain.title, '
    + 'tbmain.start, '
    + 'tbmain.ende, '
    + 'tbcategory.category, '
    + 'tbprocessowner.processowner, '
    + 'tbpriority.priority, '
    + 'tbstatus.status, '
    + 'tbplace.place '
    + 'FROM tbmain '
    + 'LEFT JOIN tbcategory ON tbmain.fk_category_id=tbcategory.id_tbcategory '
    + 'LEFT JOIN tbprocessowner ON tbmain.fk_processowner_id=tbprocessowner.id_tbprocessowner '
    + 'LEFT JOIN tbpriority ON tbmain.fk_priority_id=tbpriority.id_tbpriority '
    + 'LEFT JOIN tbstatus ON tbmain.fk_status_id=tbstatus.id_tbstatus '
    + 'LEFT JOIN tbplace ON tbmain.fk_place_id=tbplace.id_tbplace WHERE flag = '+ IntToStr(aFlag) +'';
    SQLQuery1.Open;

    while not SQLQuery1.Eof do
    begin
      MyItem := aListView.Items.Add;
      MyItem.Data := Pointer(SQLQuery1.FieldByName('id_tbmain').AsInteger);
      MyItem.Caption := IntToStr(SQLQuery1.FieldByName('number').AsInteger);
      MyItem.SubItems.Add(SQLQuery1.FieldByName('title').AsString);
      MyItem.SubItems.Add(SQLQuery1.FieldByName('priority').AsString);
      MyItem.SubItems.Add(DateToStr(SQLQuery1.FieldByName('start').AsDateTime));

      // Prüfen, ob Datenfeld belegt
      if not SQLQuery1.FieldByName('ende').IsNull then
        MyItem.SubItems.Add(DateToStr(SQLQuery1.FieldByName('ende').AsDateTime))
      else MyItem.SubItems.Add('');

      MyItem.SubItems.Add(SQLQuery1.FieldByName('place').AsString);
      MyItem.SubItems.Add(SQLQuery1.FieldByName('category').AsString);
      MyItem.SubItems.Add(SQLQuery1.FieldByName('processowner').AsString);
      MyItem.SubItems.Add(SQLQuery1.FieldByName('status').AsString);

      SQLQuery1.Next;
    end;

    aListView.Items.EndUpdate;

  except
    on E: Exception do MessageDlg('Die Aufgaben konnten nicht gelesen werden!'
    + #13 + #13 + E.ClassName + #13 + E.Message, mtError, [mbOk], 0);
  end;
end;

Sir Rufo 9. Okt 2014 21:30

AW: DB neu einlesen?
 
  1. Warum zeigst du uns nicht die Stelle wo du die Spalte erstellst? Bzw. die Definition der Tabelle?
  2. Warum musst du den Sql-Text immer wieder zuweisen? Benutzt du die Query-Komponente auch noch für andere Abfragen? Warum? Musst du sparen? Denn dadurch verplemperst du nur unnötige Zeit. Vor der ersten Abfrage wird die Anweisung vorbereitet, die zweite Abfrage läuft dann schneller ab. Nur so muss immer wieder diese Vorbereitung durchlaufen werden.

p80286 9. Okt 2014 22:32

AW: DB neu einlesen?
 
Zitat:

Zitat von AlexII (Beitrag 1275476)
Diese Spalte ist aber in der DB definitiv vorhanden und gefüllt. Erstellt ist diese auch richtig.

Ich vermute, dass mein Lazarus irgendwie noch an irgendwelche alte DB zugreift, aber kann das sein? Habe nur eine DB im Verzeichnis.

Solltest Du damit Recht haben, so muß die Connection überprüft werden.

trotzdem würde ich mit
Code:
select * from tbmain
mal überprüfen welche Spalten nun wirklich vorhanden sind - denn die Definition ist ja vollkommen korrekt (?).

Gruß
K-H

mikhal 10. Okt 2014 10:15

AW: DB neu einlesen?
 
Ist NUMBER kein reserviertes Token in SQLite?

Grüße
Mikhal

Poelser 10. Okt 2014 14:51

AW: DB neu einlesen?
 
Laut https://www.sqlite.org/lang_keywords.html gehört NUMBER nicht zu den reservierten Begriffen.

AlexII 10. Okt 2014 15:04

AW: DB neu einlesen?
 
Das Problem hat sich gelöst, es lag am falschem Verzeichnis. Hat mir aber gut getan, habe noch nie an einem Tag so viel über DBken und Lazarus gelernt. :thumb:

Danke für eine Tipps.

AlexII 10. Okt 2014 15:05

AW: DB neu einlesen?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1275484)
  1. Warum musst du den Sql-Text immer wieder zuweisen? Benutzt du die Query-Komponente auch noch für andere Abfragen? Warum? Musst du sparen? Denn dadurch verplemperst du nur unnötige Zeit. Vor der ersten Abfrage wird die Anweisung vorbereitet, die zweite Abfrage läuft dann schneller ab. Nur so muss immer wieder diese Vorbereitung durchlaufen werden.

Das verstehe ich nicht ganz... :gruebel:

DeddyH 10. Okt 2014 15:42

AW: DB neu einlesen?
 
Schreib doch das SQL über den Objektinspektor (genauer: den Property-Editor) fest in die Query und benutze für die variablen Werte Parameter. Du musst dann zur Laufzeit nur noch die Parameter befüllen, das geht um Einiges schneller.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz