Seite 1 von 1

Select mit Platzhaltern

Verfasst: 6. Oktober 2009 08:54
von toem
Hallo,

man kann ja beim Insert mit dem QSqlQuery folgende Syntax mit Platzhaltern wählen:

Code: Alles auswählen

QSqlQuery query;
query.prepare("INSERT INTO person (id, forename, surname) "
                   "VALUES (?, ?, ?)");
query.bindValue(0, 1001);
query.bindValue(1, "Bart");
query.bindValue(2, "Simpson");
query.exec();
Ich möchte das selbe bei einem Select. Also in der Art

Code: Alles auswählen

QSqlQuery query;
query.prepare("Insert Or Replace Into def (Select * from abc where monat = '?'"));
query.bindValue(0, "10");
query.exec();
Aber hier wird der Platzhalter nie ersetzt. Geht das überhaupt so?

Verfasst: 6. Oktober 2009 18:35
von upsala
Deine Query ist falsch. Die Hochkommas sind überflüssig. Und wer sagt, daß dein ? nicht ersetzt wird. Ansonsten fehlen die Informationen zum Datenbankserver und zur Qt-Version.

Verfasst: 7. Oktober 2009 08:23
von toem
a.) Die Hochkommatas sind meiner Ansicht nach korrekt, da es sich um ein Char(2) Feld handelt.

b.) Ich arbeite mit SQLite

c.) QT 4.5.2

d.) Ich denke das die ? nicht ersetzt werden, weil ein query.executedquery() diese halt nicht als ersetzt anzeigt wie in anderen Sprüchen.

Verfasst: 7. Oktober 2009 09:34
von MichaelS
Die Hochkommatas sind meiner Ansicht nach korrekt, da es sich um ein Char(2) Feld handelt.
Trotzdem sind sie falsch (siehe Dein Beispiel aus der QT-Doku in Deinem ersten Beitrag).

Verfasst: 7. Oktober 2009 10:08
von toem
Schön und gut. Es geht aber auch ohne nicht.

Verfasst: 7. Oktober 2009 10:29
von Mani99
Event. weil es das programm schon beim parsen des ersten teils ohne bind aufstellt?

Was ist das für ein keyword "def"?
"Insert Or Replace Into def (Select * from abc where monat = '?'")

Verfasst: 7. Oktober 2009 10:40
von MichaelS
Funktioniert das Statement wenn Du es direkt über sqlite absetzt?

Verfasst: 7. Oktober 2009 11:18
von toem
mani: def soll ein tabellenname sein (probename)

und ja, es geht direkt in sqlite

Verfasst: 7. Oktober 2009 11:56
von NoRulez
Ich frage mich dennoch was Hochkomma in einem Bind-Statement zu suchen haben. Das ist nämlich die Aufgabe des SQL Interpreters.

LG NoRulez

Verfasst: 7. Oktober 2009 13:37
von toem
Diskutieren wir jetzt über Hochkommatas oder über meine Frage?

Verfasst: 7. Oktober 2009 13:48
von NoRulez
Also ich sehe nur das Du eine Klammer falsch gesetzt bzw. vergessen hast oder es ein Copy&Paste Fehler ist:

Code: Alles auswählen

query.prepare("Insert Or Replace Into def (Select * from abc where monat = '?'")); 
sollte doch eher wie folgt heißen

Code: Alles auswählen

query.prepare("Insert Or Replace Into def (Select * from abc where monat = '?')");
LG NoRulez

Verfasst: 7. Oktober 2009 14:13
von toem
Also das ist ehrlich ein Copy and Paste Error

Verfasst: 7. Oktober 2009 14:15
von NoRulez
Könntest Du bitte die Tabellen definition zeigen, ich gehe davon aus das die Werte wie im ersten Post korrekt sind.
Vielleicht hat's mit dem Typ den Du übergibst etwas damit zu tun.

LG NoRulez

Verfasst: 7. Oktober 2009 15:16
von toem
Monat ist in der Datenbank als char(2) festgelegt.

Verfasst: 7. Oktober 2009 22:04
von upsala
Schon mal in der Doku den Unterschied zwischen QSqlQuery::lastQuery und QSqlQuery::executedQuery gelesen?