Seite 1 von 1

[solved] QSqlQuery bindValue funktioniert nicht

Verfasst: 12. März 2008 15:46
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...

Verfasst: 12. März 2008 16:01
von upsala
Laß mal die \" weg, daß macht der Datenbanktreiber bei bindValue selbst...

Verfasst: 12. März 2008 16:44
von C167
das war mein letzter Versuch. obs geht. normal hab ich die naemlich weggelassen. Mit oder ohne, gleicher Fehler

Verfasst: 12. März 2008 16:56
von upsala
Ach ja, Spalten/Tabellennamen kann man auch nicht mit bindValue übergeben.

Verfasst: 12. März 2008 17:07
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 :(

Verfasst: 12. März 2008 17:13
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.

Verfasst: 12. März 2008 17:53
von C167
gut, danke fuer die Hilfe
C167