Tabellen db- Komponenten, Verständnisfrage (sqlite?)

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
am2b
Beiträge: 3
Registriert: Di 25. Jul 2017, 09:46

Tabellen db- Komponenten, Verständnisfrage (sqlite?)

Beitrag von am2b »

Hi,

ich hab momentan eine riesige Datenmenge, die ich irgendwo hinschaufeln muss. Also dachte ich, dann schiebe ich das einfach mal in eine SQLite- DB und fertig.

Also habe ich eine Funktion

Code: Alles auswählen

procedure SL3CreateTable(const pcConn: TSQLite3Connection;  const pcsTabellenName: String; const pcFieldDefs: TFieldDefs);


gebastelt, der ich aus einer Query die Definitionen hinüberschicke, die diese dann auf die verfügbaren SQLite- Datentypen umrubelt und eine Create- Table- Anweisung auslöst.
Das funktioniert ohne Probleme, die Tabellenstruktur wird aufgebaut.

Als nächstes habe ich dann eine Funktion gebastelt, die eine Query A in eine Query B kopiert.

Code: Alles auswählen

procedure SL3InsertTable(const pcConn: TSQLite3Connection;  const pcsTabellenName: String; const pcQuery: TSQLQuery);
...
    lvQ:= TSQLQuery.Create(NIL);
    lvQ.SQL.Text:='SELECT * FROM '+pcsTabellenName;
 
    lvQ.Active:=True;
 
    while not pcQuery.EOF do begin
      lvQ.Insert;
      for lvnSpalte:=0 to pcQuery.Fields.Count - 1 do
        try
          lvQ.Fields[lvnSpalte].Value := pcQuery.Fields[lvnSpalte].Value;
        except
          ..
        end;
 
      lvQ.Post;
      pcQuery.Next;
    end;
    lvTrans.Commit;
    lvQ.Active:=False;
... 
 


Ich hab mal die unwesentlichen Aspekte (Zeilenzähler, Ausnahmebehandlung ...) weggelassen.
Das Problem: Er gibt vor zu tun, was ich ihm sage. Aber es kommen keine Daten an. Was mache ich falsch? Ich habe schon diverse "Untersuchungen" durchgeführt, mit ApplyUpdates, alle Schritte einzeln per Formular gestartet, ein DB- Grid mit Navigator verbunden usw.
Es gelingt mir zwar offenbar, die Daten erst einmal zu "erfassen", aber sie kommen nie in der Datei an, egal, ob Commit oder ApplyUpdates ... es variieren im Prinzip immer nur die Varianten ob Fehler, wenn ja dann welche usw.

Hat jemand mal ein Szenario, was wirklich zu tun ist, um einer Tabelle Daten einzuhauchen (ohne einen INSERT- Befehl zusammenbasteln zu müssen)?

am2

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Tabellen db- Komponenten, Verständnisfrage (sqlite?)

Beitrag von mse »

Es fehlt lvQ.applyupdates().
Edit:
nach den lvQ.post()'s und vor lvTrans.commit() notabene. ;-)

am2b
Beiträge: 3
Registriert: Di 25. Jul 2017, 09:46

Re: Tabellen db- Komponenten, Verständnisfrage (sqlite?)

Beitrag von am2b »

mse hat geschrieben:Es fehlt lvQ.applyupdates().
Edit:
nach den lvQ.post()'s und vor lvTrans.commit() notabene. ;-)


Vielen Dank, dann ist meine nächste Frage:
Wenn ich folgenden Fehler bekomme: Projekt ... hat Exception- Klasse "EDatabaseError" ausgelöst mit der Meldung: near "(": Syntax error

Wo könnte ich weiter suchen?
Die Eigenschaft "SQL" der TSQLQuery enthält

Code: Alles auswählen

SELECT * FROM T1 


alle anderen SQL- Eigenschaften (InsertSQL, RefreshSQL ...) sind leer.

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

Re: Tabellen db- Komponenten, Verständnisfrage (sqlite?)

Beitrag von Michl »

Wie die Fehlermeldung sagt: vermutlich sitzt irgendwo eine Klammer falsch.

Schau mal im Stacktrace nach, ob der Fehler wirklich von dem von dir geposteten SQL-Statement kommt?!

Code: Alles auswählen

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

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Tabellen db- Komponenten, Verständnisfrage (sqlite?)

Beitrag von af0815 »

Wenn das ganze am selben Server ist, so kann man ja mit

Code: Alles auswählen

INSERT INTO xxxx SELECT * FROM yyy
arbeiten.

Ist der Aufbau der Tabellen absolut gleich ? Ich würde nicht auf Value gehen, sondern mal das ganze mit .AsString prüfen. Ich halte von dem 'Value' verwenden gar nichts.

Bzw. auch prüfen ob der Typ der beiden Values gleich ist.

Die anderen SQL-Eigenschaften versucht die Komponente aus den SQL-Statement zu erraten. Bei ganz einfachen Sachen funktionierts meistens :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

am2b
Beiträge: 3
Registriert: Di 25. Jul 2017, 09:46

Re: Tabellen db- Komponenten, Verständnisfrage (sqlite?)

Beitrag von am2b »

Michl hat geschrieben:Wie die Fehlermeldung sagt: vermutlich sitzt irgendwo eine Klammer falsch.
Schau mal im Stacktrace nach, ob der Fehler wirklich von dem von dir geposteten SQL-Statement kommt?!


Das Problem ist ja, dass das einzige SQL- das ich geschrieben habe, gar keine Klammer enthält. Wie bekomme ich heraus, welches SQL er versucht? Welchen Stack- Trace meinst Du? Wie gehe ich damit um?

af0815 hat geschrieben:Wenn das ganze am selben Server ist, so kann man ja mit

Code: Alles auswählen

INSERT INTO xxxx SELECT * FROM yyy
arbeiten.

Ist der Aufbau der Tabellen absolut gleich ? Ich würde nicht auf Value gehen, sondern mal das ganze mit .AsString prüfen. Ich halte von dem 'Value' verwenden gar nichts.

Bzw. auch prüfen ob der Typ der beiden Values gleich ist.

Die anderen SQL-Eigenschaften versucht die Komponente aus den SQL-Statement zu erraten. Bei ganz einfachen Sachen funktionierts meistens :-)


Es geht ja darum, dass ich letztlich eine Funktion schreiben möchte, die eine beliebige SQL- Query in eine beliebige SQLite- Datenbank schreibt. Dazu muss natürlich erst die Struktur "kopiert" werden und in diesem Sinne ist sie gleich. Wenn es sein muss, dann mappe ich auch selbst die einzelnen Typen. Aber dazu muss ich erst mal herausfinden, was genau das Problem ist :?:
Kann man irgendwie ermitteln, welche SQL- Anweisungen er erraten hat?

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

Re: Tabellen db- Komponenten, Verständnisfrage (sqlite?)

Beitrag von Michl »

am2b hat geschrieben:Wie bekomme ich heraus, welches SQL er versucht? Welchen Stack- Trace meinst Du? Wie gehe ich damit um?
  • Projekt -> Projekteinstellungen -> Debuggen -> Haken bei "Debuggerinformation für GDB erzeugen" hinein und Debugging-Info-Typ auf "Dwarf2 (-gw2)" stellen
  • Projekt starten <F9>
  • bei Exception <Strg> + <Alt> + <S> drücken und den Aufrufstack anzeigen (evtl. auf Max 50 stellen)
  • im Callstack-Fenster mit <Strg> + <V> auf die Codestelle springen
Jetzt siehst du welche Methoden durchlaufen wurden. Willst du wissen, welche Werte bestimmte Variablen haben, setze einen Breakpoint an dieser Stelle und schaue nach. Wenn der Fehler nur sporadisch auftritt, gibt den Variablenwert an dieser Stelle in der Konsole aus.

Code: Alles auswählen

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

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Tabellen db- Komponenten, Verständnisfrage (sqlite?)

Beitrag von af0815 »

am2b hat geschrieben:Kann man irgendwie ermitteln, welche SQL- Anweisungen er erraten hat?

Ja, am einfachsten wenn man das DB-System fragt, nur SQL-Lite ist für sowas nicht besonders gut geeignet.

Beim MS-SQL verwende ichg das den SQL-Server Profiler. Ich verwende meist ZEOS, dort gibt es einen TZSQL-Monitor. Bei den SQL-db Kompos war mir das nicht direkt möglich. Ich habe da mal sowas gesucht und die mit SQL-DB mit debugging Infos gebaut. Dann konnte ich mir das mit dem SQL ansehen. BTW: Die SQL-DB gehört eigentlich zum FPC, nicht zu Lazarus.

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten