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

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

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

Beitragvon am2b » 25. Jul 2017, 09:36 Tabellen db- Komponenten, Verständnisfrage (sqlite?)

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
am2b
 
Beiträge: 3
Registriert: 25. Jul 2017, 08:46

Beitragvon mse » 25. Jul 2017, 09:48 Re: Tabellen db- Komponenten, Verständnisfrage (sqlite?)

Es fehlt lvQ.applyupdates().
Edit:
nach den lvQ.post()'s und vor lvTrans.commit() notabene. ;-)
mse
 
Beiträge: 1792
Registriert: 16. Okt 2008, 09:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.2,fixes_3_0) | 
CPU-Target: x86,x64,ARM
Nach oben

Beitragvon am2b » 26. Jul 2017, 20:25 Re: Tabellen db- Komponenten, Verständnisfrage (sqlite?)

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.
am2b
 
Beiträge: 3
Registriert: 25. Jul 2017, 08:46

Beitragvon Michl » 26. Jul 2017, 21:05 Re: Tabellen db- Komponenten, Verständnisfrage (sqlite?)

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; 
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 af0815 » 27. Jul 2017, 10:49 Re: Tabellen db- Komponenten, Verständnisfrage (sqlite?)

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).
af0815
 
Beiträge: 3315
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: Win7/Linux (L stable FPC stable) per fpcup | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon am2b » 27. Jul 2017, 15:30 Re: Tabellen db- Komponenten, Verständnisfrage (sqlite?)

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?
am2b
 
Beiträge: 3
Registriert: 25. Jul 2017, 08:46

Beitragvon Michl » 27. Jul 2017, 19:13 Re: Tabellen db- Komponenten, Verständnisfrage (sqlite?)

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; 
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 af0815 » 27. Jul 2017, 20:12 Re: Tabellen db- Komponenten, Verständnisfrage (sqlite?)

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).
af0815
 
Beiträge: 3315
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: Win7/Linux (L stable FPC stable) per fpcup | 
CPU-Target: 32Bit (64Bit)
Nach oben

• Themenende •

Zurück zu Datenbanken



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried