Seite 1 von 1

QtSql bindValue - Werte werden nicht übernommen

Verfasst: 16. März 2008 11:29
von jd
Hallo ich habe ein Programm, welches ein Login benutzt, jedoch schaffe ich es nicht die Logindaten zu validieren. Das Problem ist, das ich die "Platzhalter" in meinem SQL-Statement nicht ersetzten kann.

Code: Alles auswählen

void CLoginDialog::validateLogin() {
	QSqlQuery query;

	query.prepare("SELECT COUNT(*) FROM user WHERE username = :username AND password = :password");
	query.bindValue(":username", usernameLineEdit->text());
	query.bindValue(":password", passwordLineEdit->text());
	query.exec();
	qDebug() << query.lastQuery();

	if (query.size() == 1) {
		accept();
	} else {
		QMessageBox::critical(0, tr("Fehler"), tr("Die Logindaten sind falsch.\n"));
	}
}
qDebug() meldet dann:
"SELECT COUNT(*) FROM user WHERE username=:username AND password=:password"
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
Ein normaler SELECT * funktioniert, also die DB-Connection funktioniert.

Also lastError bekomme ich QSqlError(-1, "", "")

Hat jemand eine idee wie ich den Fehler beheben kann?

Verfasst: 16. März 2008 12:06
von Christian81
Du gibts dem query keine db connection an und hast wohl auch keine mit addDatabase() angelegt.

Verfasst: 16. März 2008 13:36
von jd
Doch eigentlich schon, das habe ich in meiner main funktion gemacht

Code: Alles auswählen

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
	db.setHostName("192.168.0.2");
	db.setUserName("test");
	db.setPassword("test");
	db.setDatabaseName("test");

	if (!db.open()) {
		QSqlError error = db.lastError();
		QMessageBox::critical(0, QObject::tr("Fehler"), error.text());
		return 1;
	}
Oder ist das in der main funktion falsch?

Verfasst: 16. März 2008 14:07
von franzf
Versuchs mal mit

Code: Alles auswählen

QSqlQuery query(QSqlDatabase::database());
Du gibst beim database erstellen (in main()) ja keinen Namen an, damit ist es die defaultConnection.

Verfasst: 16. März 2008 14:42
von jd
Ich habe die Funktion jetzt umgebaut.

Code: Alles auswählen

void CLoginDialog::validateLogin() {
	QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
		db.setHostName("192.168.0.2");
		db.setUserName("test");
		db.setPassword("test");
		db.setDatabaseName("test");

		if (!db.open()) {
			QSqlError error = db.lastError();
			QMessageBox::critical(0, QObject::tr("Fehler"), error.text());
			return;
		}

	QSqlQuery query;
	query.prepare("SELECT COUNT(*) FROM user WHERE username = :username AND password = :password");
	query.bindValue(":username", usernameLineEdit->text());
	query.bindValue(":password", passwordLineEdit->text());
	query.exec();
	qDebug() << query.lastQuery();

	if (query.size() == 1) {
		accept();
	} else {
		QMessageBox::critical(0, tr("Fehler"), tr("Die Logindaten sind falsch.\n"));
	}
}
Das Problem ist immer nocht das selbe:

Log-Meldung:
"SELECT COUNT(*) FROM user WHERE username = :username AND password = :password"
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
Alternative habe ich die query-definition auch so gemacht:

Code: Alles auswählen

QSqlQuery query(QSqlDatabase::database());
Hat da jemand eine idee?

Verfasst: 16. März 2008 15:43
von upsala

Code: Alles auswählen

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); 
Damit fügst du jedes(!) Mal, wenn du die Funktion aufrufst eine neue Verbindung hinzu. Da die Login-Funktion weder die einzige Verbindung zur Datenbank sein wird, noch im gesamten Programmablauf nur im einmal aufgerufen werden wird, weist dich die Meldung darauf hin...