Alternative zu Parameterabfragen mit SQLite

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

MaddinR
***
Beiträge: 61
Registriert: So, 06.03.2011 11:15

Alternative zu Parameterabfragen mit SQLite

Beitrag von MaddinR »

Hallo Leute

Eine neue Herausforderung ..... 8)

Ich habe gerade die Daten einer "internen" DB in eine externe SQLite-Datenbank verlegt. Und ziemlich schnell ist mir aufgefallen, dass die übliche Parameterabfrage anscheinend nicht mehr funktioniert... also der Teil, bei dem in der Where-Klausel der mit Doppelpunkt eingeleitete Parameter steht. Anscheinend kann SQLite das nicht in dieser Form. Das Web war bedauerlicherweise ziemlich unergiebig zu diesem Thema... *hmmm*

Nun übelege ich gerade Alternativen. Statt direkt eine Abfrage zu starten, könnte auch ein Formular das gewünschte Ergebnis anzeigen. Also ein Grid-Control mit verbundener Query und darüber als Eingabe-Felder die notwendigen Parameter. Aber wie kann ich denn das SQL-Statement, welches ja beim Generieren des Formulars gesetzt wird, dynamisch austauschen... ?... ist das überhaupt erlaubt? Gibts vielleicht noch bessere Ideen? Also schickes Layout brauch ich eigentlich nicht... schlichtes Ergebnis im Vollbild-Modus reicht mir.... aber was noch viel wichtiger ist: Die Weitergabe eines parameter-gesteuerten Abfrageergebnisses an Serienbriefe... genau die Daten für Serienbriefe sind eigentlich das grösste Problem... und genau das klappt nicht....

Hat jemand Ideen?

vg, Maddin
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Alternative zu Parameterabfragen mit SQLite

Beitrag von DPunch »

Aloha
MaddinR hat geschrieben:lso der Teil, bei dem in der Where-Klausel der mit Doppelpunkt eingeleitete Parameter steht. Anscheinend kann SQLite das nicht in dieser Form.
Das kann (vermutlich) kein DBMS, das Parsen dieser Paramter übernimmt Base als FrontEnd, und zwar nur Base.

Du könntest als erstes testen, ob Du das Häkchen bei "SQL-Kommando direkt ausführen" benötigst, damit Deine Abfrage funktioniert. Funktioniert die Abfrage auch ohne das Häkchen, kannst Du weiter mit der gewohnten Parameterabfrage arbeiten.
Ohne das Häkchen müssen allerdings z.B. JOINS durch entsprechende WHERE-Klauseln ersetzen.
MaddinR
***
Beiträge: 61
Registriert: So, 06.03.2011 11:15

Re: Alternative zu Parameterabfragen mit SQLite

Beitrag von MaddinR »

Hi
DPunch hat geschrieben:Du könntest als erstes testen, ob Du das Häkchen bei "SQL-Kommando direkt ausführen" benötigst, damit Deine Abfrage funktioniert. Funktioniert die Abfrage auch ohne das Häkchen, kannst Du weiter mit der gewohnten Parameterabfrage arbeiten.
Direkt oder nicht direkt hatte keine Auswirkung. Aber da Du diese Funktion nicht vollständig verneint hast, habe ich mich noch mal drangesetzt und probiert und im Web gesucht. Als erstes habe ich im Web gefunden, dass bei SQLite der Parameter-Alias ein ? und nicht (z.B.) :Jahr ist. Damit klappte es dann sofort. Unpraktisch beim ? war, wenn ich eine Where-Klausel mit mehreren Bedingungen bezogen auf ein Jahr (Parameter) als Filter für die Tabellen-Felder BegDat und EndDat hatte, dass bei ? zwei Eingaben erforderlich waren, einmal für BegDat und einmal für EndDat... so hat's der Parser eben interpretiert. Also, wenn die Abfrage so aussah: WHERE BegDat <= ? AND EndDat >= ? musste das Jahr zweimal eingegeben werden. Aber an dem Punkt konnte ich mir nicht mehr vorstellen, dass das nicht anders zu lösen wäre.

Die Lösung, damit dann mit der folgenden Klausel WHERE BegDat <= :Jahr AND "EndDat" >= :Jahr nur einmal der Jahr-Parameter abgefragt wurde, war der Schalter:
Rechtsklick auf DB-Tabelle, Datenbank -> Erweiterte Eigsenschaften -> Besondere Einstellungen -> Benannte Parameter durch "?" ersetzen.

Naja... wer weiß, wer das hier irgendwann mal liest und damit vielleicht auch sein Problem löst... 8)

Danke Dir!
vg, Maddin
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Alternative zu Parameterabfragen mit SQLite

Beitrag von DPunch »

Aloha

Gut zu wissen, dass Du das Problem lösen konntest.

Aber noch aus reiner Neugier:
MaddinR hat geschrieben:Direkt oder nicht direkt hatte keine Auswirkung.
Da bei nicht gesetztem Häkchen das Parsen direkt von Base übernommen wird, wundert mich das etwas.
Ich konnte bis jedem bei jedem DBMS Parameterabfragen mit der ":Parameter"-Syntax absetzen, solange ich das SQL-Kommando nicht "direkt ausführen" lasse.
Kannst Du das eventuell nochmal an einer ganz simplen Abfragen überprüfen? Meinem bisherigen Kenntnisstand nach wäre das eine Besonderheit von SQLite.
MaddinR hat geschrieben:dass bei ? zwei Eingaben erforderlich waren, einmal für BegDat und einmal für EndDat(...)Also, wenn die Abfrage so aussah: WHERE BegDat <= ? AND EndDat >= ?
Hast Du das Mal mit entsprechenden Zahlen hinter den Fragezeichen ausprobiert?
Meines Wissens nach erstellst Du so ja auch komplett unterschiedliche Parameter, eine Klausel ala WHERE BegDat <= ?1 AND EndDat >= ?1 sollte nur eine Eingabe erfordern.
MaddinR
***
Beiträge: 61
Registriert: So, 06.03.2011 11:15

Re: Alternative zu Parameterabfragen mit SQLite

Beitrag von MaddinR »

Hallo
DPunch hat geschrieben:Hast Du das Mal mit entsprechenden Zahlen hinter den Fragezeichen ausprobiert?
Ich habe jetzt extra noch mal das folgende probiert... weiss der liebe Gott, für was das gut ist und wem es helfen mag....

SQL-Command direkt ausführen.
SELECT * FROM MyTable WHERE BegDat <= :Dat AND EndDat >= :Dat
SELECT * FROM MyTable WHERE BegDat <= :Dat1 AND EndDat >= :Dat2
SELECT * FROM MyTable WHERE BegDat <= ? AND EndDat >= ?

Bei allen Fehlermeldung:
Die Dateninhalte konnten nicht geladen werden
Unbound parameters in query

SELECT * FROM MyTable WHERE BegDat <= ?1 AND EndDat >= ?1
Feldmeldung:
Die Dateninhalte konnten nicht geladen werden
parameter marker count incorrect


SQL-Command nicht direkt ausführen
SELECT * FROM MyTable WHERE BegDat <= :Dat AND EndDat >= :Dat
ist erfolgreich, verlangt 1 Eingabe

SELECT * FROM MyTable WHERE BegDat <= :Dat1 AND EndDat >= :Dat2
ist erfolgreich, verlangt 2 Eingaben

SELECT * FROM MyTable WHERE BegDat <= ? AND EndDat >= ?
ist erfolgreich, verlangt 2 Eingaben

SELECT * FROM MyTable WHERE BegDat <= ?1 AND EndDat >= ?1
Fehlermeldung:
Syntaxerror in SQL-Expresson


Fazit: Direkt ausführen gelingt nie. Mein Problem lies sich allein mit dem einen Schalter "Benannte Parameter durch '?' ersetzen" lösen. Allerdings muss man bei SQLite wissen, dass SQLite eigentlich kein typisches als Backend eingesetzbares DBMS ist. SQLite ist eigentlich konzipiert, um als Source-Code in eine entwickelte Anwendung embedded zu werden. Genau dann, wenn diese Applikation eben DB-Funktionalität benötigt und sich nicht zu einer echten DBMS-Instanz verbinden will oder keine echte DBMS-Instanz verfügbar ist. Im Grunde genommen machen die SQLite-Libs und -DLLs aus einer normalen Anwendung ein DB-Frontend mit integriertem Backend. Oder mit anderen Worten: Das Programm wird selber zur Desktop-Datenbank-Anwendung.

Und natürlich kann SQLite auch Parameter-Abfragen ausführen. Aber soweit ich mich erinnere, läuft das dort nicht über einen internen oder externen Parser, sondern über gebundene Parameter. Das heist, das SQL-Statement korrespondiert zur Ausführungszeit mit den Bounded-Params, die eben dynamisch vom Frontend gesetzt werden können. Aber Shit... ist schon so lange her... ich hoffe, ich erinnere mich richtig.

Und hier über OOo isses eben notwendig, dass OOo die SQL-Statements mundgerecht und schmackhaft aufbereitet, so das SQLite sie kauen kann... und das gelingt mit dem o.g. Schalter pefekt über Anbindung via ODBC.

vg, Maddin
pmoegenb
********
Beiträge: 4330
Registriert: Di, 22.06.2004 12:02
Wohnort: 71134 Aidlingen
Kontaktdaten:

Re: Alternative zu Parameterabfragen mit SQLite

Beitrag von pmoegenb »

MaddinR hat geschrieben: SQL-Command direkt ausführen.

Code: Alles auswählen

SELECT * FROM MyTable WHERE BegDat <= :Dat AND  EndDat >= :Dat
SELECT * FROM MyTable WHERE BegDat <= :Dat1 AND  EndDat >= :Dat2
SELECT * FROM MyTable WHERE BegDat <= ? AND  EndDat >= ?
[/color]
Bei allen Fehlermeldung:
Die Dateninhalte konnten nicht geladen werden
Das Verhalten ist wie bei jedem anderen Datenbank-Manager oder wie bei jeder anderen Datenbank (SQLite, Firebird, SQL-Server u.s.w.). Die sogenannte Hostvariable/Parameter (z. B. Dat) muss durch das Anwenderprogramm gefüllt werden. In OOo übernimmt das z. B. Base in einer Abfrage per Abfragefenster. In einer Entwicklungsumgebung wie z. D. Delphi erfolgt die Parameterübergabe z. B. über Query1.ParamByName('Dat').AsDateTime :=.

Fazit: Das Verhalten ist korrekt.
Gruß

Peter
---------------------------------------------------------------------------
Windows 7 Prof. 64-bit SP1, LibreOffice 4.3.6.2 und AOO 4.1.1
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Alternative zu Parameterabfragen mit SQLite

Beitrag von DPunch »

Aloha
MaddinR hat geschrieben:

Code: Alles auswählen

SELECT * FROM MyTable WHERE BegDat <= :Dat AND EndDat >= :Dat
ist erfolgreich, verlangt 1 Eingabe
Also geht es doch mit der ganz normalen Syntax, solange das Kommando nicht direkt ausgeführt wird?
MaddinR
***
Beiträge: 61
Registriert: So, 06.03.2011 11:15

Re: Alternative zu Parameterabfragen mit SQLite

Beitrag von MaddinR »

DPunch hat geschrieben:Also geht es doch mit der ganz normalen Syntax, solange das Kommando nicht direkt ausgeführt wird?
Ja, richtig. Es lag an dem Schalter "Benannte Parameter durch '?' ersetzen", warum es zuerst nicht geklappt hat. Default-mässig ist der unchecked. Und wer kommt schon darauf, danach zu suchen, wenn nicht mal bekannt ist, dass dieser Schalte überhaupt existiert. Ich bin beim Experimentieren und durchsehen aller Optionen mehr oder weniger zufällig drüber gestolpert. Nun ja, egal... jetzt gehts....

vg, Maddin
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Alternative zu Parameterabfragen mit SQLite

Beitrag von DPunch »

Aloha
MaddinR hat geschrieben:Es lag an dem Schalter "Benannte Parameter durch '?' ersetzen", warum es zuerst nicht geklappt hat.
Genau darum gehts es mir ja, geht es bei SQL-Kommandos, die *nicht* direkt ausgeführt werden, ohne diese Zusatzoption nicht?
Sorry, dass ich da so bohre, aber das interessiert mich wirklich.
Denn die ":"-Parameter sollten schon von Base verarbeitet und eingesetzt werden, bevor das Ganze überhaupt an irgendeine Datenbank weitergereicht wird. Sprich die Datenbank sollte gar nicht wissen, dass überhaupt ein solcher Parameter in der Abfrage ist.
Könntest Du das bitte nochmal testen, wenn Du entsprechend Zeit findest?
Antworten