[solved] QSqlQuery bindValue funktioniert nicht

Alles rund um die Programmierung mit Qt
Antworten
C167
Beiträge: 105
Registriert: 9. Februar 2008 20:30

[solved] QSqlQuery bindValue funktioniert nicht

Beitrag von C167 »

Tagchen, ich hab hier ein Programm, dass mehrere SQLite3-Datenbanken verwendet. Im kompletten Programm hab ich Probleme mit bindValue, es funktioniert einfach nicht. Den Teil der Querys, die dynamische Parameter haben, hab ich schon auf QString ("*" ).arg(); umgestellt, aber so langsam wirds mir unheimlich. Folgendes Beispiel:

Code: Alles auswählen

qDebug() << categories;
foreach ( int id, categories.keys() )
{
	qDebug() << id;
	QSqlQuery apps ( db );
	apps.prepare ( "SELECT id, category, name FROM \":table\" WHERE category = \":category\" ORDER BY name;" );
	apps.bindValue ( ":table", m_tableName );
	apps.bindValue ( ":category", id );
	apps.exec();
	if ( apps.lastError().isValid() )
	{
		qDebug() << apps.executedQuery() << "\n" << apps.lastError() << "\n" << apps.boundValues();
	}
	while ( apps.next() )
	{
		qDebug() << apps.value ( 0 ) << "\t" << apps.value ( 1 ) << "\t" << apps.value ( 2 );
	}
}
Die Map enthaellt die Kategorien, m_tableName ist ein QString. Das ganze Resultiert in Folgender Ausgabe:

Code: Alles auswählen

QMap((1, "Mathe/Physik")(2, "Informatik"))
1
"SELECT id, category, name FROM "?" WHERE category = "?" ORDER BY name;"
 QSqlError(-1, "Parameter count mismatch", "")
 QMap((":category", QVariant(int, 1) ) ( ":table" ,  QVariant(QString, "programs") ) )
2
"SELECT id, category, name FROM "?" WHERE category = "?" ORDER BY name;"
 QSqlError(-1, "Parameter count mismatch", "")
 QMap((":category", QVariant(int, 2) ) ( ":table" ,  QVariant(QString, "programs") ) )
Solange ich nciht mehr als eine einzige Datenbank benutze, funktionierts, eine einzelne Datenbank und nichts anderes als ne main()-Methode und schon funktionierts. Dabei ist es egal, welche DB ich wo einsetzt...
Zuletzt geändert von C167 am 12. März 2008 17:54, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Laß mal die \" weg, daß macht der Datenbanktreiber bei bindValue selbst...
C167
Beiträge: 105
Registriert: 9. Februar 2008 20:30

Beitrag von C167 »

das war mein letzter Versuch. obs geht. normal hab ich die naemlich weggelassen. Mit oder ohne, gleicher Fehler
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ach ja, Spalten/Tabellennamen kann man auch nicht mit bindValue übergeben.
C167
Beiträge: 105
Registriert: 9. Februar 2008 20:30

Beitrag von C167 »

ah aokay, dann kann ich mir das bindValue ja in allen Querys sparen... find ich nu nicht so gluecklich, wird sich wohl aber vom Design von QtSQL wohl nciht anders machen lassen :(
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Nein, du darfst QSqlQuery::bindValue nicht mit QString.arg verwechseln. Zum anderen übernimmt bindValue für dich das Escapen von Sonderzeichen. Ansonsten müßtest du ja immer

Code: Alles auswählen

QString QSqlDriver::escapeIdentifier ( const QString & identifier, IdentifierType type ) const 
verwenden.
C167
Beiträge: 105
Registriert: 9. Februar 2008 20:30

Beitrag von C167 »

gut, danke fuer die Hilfe
C167
Antworten