QtSql bindValue - Werte werden nicht übernommen

Alles rund um die Programmierung mit Qt
Antworten
jd
Beiträge: 130
Registriert: 22. Januar 2008 17:55

QtSql bindValue - Werte werden nicht übernommen

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Du gibts dem query keine db connection an und hast wohl auch keine mit addDatabase() angelegt.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
jd
Beiträge: 130
Registriert: 22. Januar 2008 17:55

Beitrag 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?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
jd
Beiträge: 130
Registriert: 22. Januar 2008 17:55

Beitrag 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?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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...
Antworten