Zugriff auf Access MDB mit QSqlQuery

Alles rund um die Programmierung mit Qt
Antworten
QT-Junkee
Beiträge: 18
Registriert: 14. März 2007 14:59

Zugriff auf Access MDB mit QSqlQuery

Beitrag von QT-Junkee »

Mein Programm soll den Inhalt einer Microsoft Access Datenbank verändern und auslesen können.
Vorgehensweise, die ich dabei erarbeitet habe:

1. Microsoft Access Driver laden
2. Verbindung zur MDB herstellen
3. Zugriffe mit Hilfe von QsqlQuery

Das Umbenennen einer Spalte in einer Tabelle klappt schon mal nicht, obwohl alles fehlerfrei kompiliert wird und Open Befehl erfolgreich durchgeführt wird (getestet)..., hier der Code:

Code: Alles auswählen

		QString mdbName("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=");
		mdbName.append(m_mdb); 															// den pfad zur Datenbank hinzufügen
		m_mdb = QSqlDatabase::addDatabase("QODBC"); 				// Add a database with QODBC driver
		m_mdb.setDatabaseName(mdbName);

		if (m_mdb.open()) 
		{ 
			QSqlQuery RenameQuery;
			QString rename = "ALTER TABLE T_TbTexte RENAME COLUMN No TO Nummer"; 
			RenameQuery.exec(rename);
		}
		else
		{// to show error message box if something failed while db opening
			QMessageBox::critical(this, tr("Database"), T_TbTexte.lastError().text(),
				QMessageBox::Ok, QMessageBox::NoButton);
		}
Hat jemand schon Erfahrung damit? Woran könnte es liegen?

MFG Junkee
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag von CaptnChaos »

also spontan würde ich behaupten da stimmt was mit deinem SQL befehl nicht. so wars jedenfalls desöfteren bei mir und MySQL.
Frag mal auf jeden Fall QSqlQuery::exec() ab ob der true zurückliefert.
dann kannst du nämlich ggf von einem falschen befehl ausgehen.
QT-Junkee
Beiträge: 18
Registriert: 14. März 2007 14:59

Beitrag von QT-Junkee »

Hi.

Ja , ich habe es geprüft, die Funktion liefert FALSE zurück.
Ich habe die Syntax beim Googeln gefunden, es gibt halt in diversen Tutorials und Foren den Befehl, wo man die TABLE anvisiert, und die Spalte X in Spalte Y umbenennt. Sieht eigentlich simpel aus, aber funzten tut es nicht.

Auch die 2. Variante, die ich gefunden und ausprobiert habe geht leider nicht:

Example of RENAME COLUMN

The following example assigns the new name of c_num to the customer_num column in the customer table:

RENAME COLUMN customer.customer_num TO c_num
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag von CaptnChaos »

und zur datenbank hast du verbindung? du hast die datenbank auch geöffnet und die spalte die du umbenennen willst existiert?
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

In Access geht das auch nicht. Was Du machen kannst, so in etwa:
- ALTER TABLE T_TbTexte ADD COLUMN Nummer TEXT(50)
- UPDATE T_TbTexte SET Nummer=No
- ALTER TABLE T_TbTexte DROP COLUMN No
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
QT-Junkee
Beiträge: 18
Registriert: 14. März 2007 14:59

Beitrag von QT-Junkee »

Ja, das Öffnen funzt, ich habe schon Werte aus der DB in eine QMap gespeichert, und ja, die Spalte existiert. Der eigentliche Grund, warum ich die Spalte umbenennen will ist folgender. Kurz gefasst: Wenn die Spalte "No" heisst, dann werden die Werte dieser Spalte nicht ausgelesen, als ob die gar nicht existiert, wenn ich die Spalte "No" manuell über MS Access umbenenne, z.B in "Nummer", dann werden die Werte der Spalte ohne Probleme ausgelesen. Die Spalte muss No heissen und das Auslesen muss auch so klappen. Deswegen wollte ich "No" temporär umbenennen. Hier der Code, wo ich die Werte in eine QMap speichere:

Code: Alles auswählen

...
		QMap<QString, QString> map;

		// For opening  databases
		QString mdbName1("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=");
		mdbName1.append(m_mdb);
		m_mdb= QSqlDatabase::addDatabase("QODBC");
		m_mdb.setDatabaseName(mdbName1);

		if (m_mdb.open()) 
		{ 		
			QSqlQuery query;
			QString sNumber, sText;
			sNumber = "No";
			QString select = "SELECT ";
			select.append(sNumber);
			select.append(" ,");
			select.append(sLanguage);
			select.append(" FROM T_TbTexte WHERE No <= 1000");
			
			query.exec(select);
			while (query.next()) 
			{
				sNumber = query.value(0).toString();
				sText = query.value(1).toString();
				map.insert(sNumber, sText);
			}
				
			m_mdb.close();// success! 
		}
		else
		{// to show error message box if something failed while db opening
			QMessageBox::critical(this, tr("Database"), m_mdb.lastError().text(),
				QMessageBox::Ok, QMessageBox::NoButton);
		}

	}
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Das kommt davon wenn man reservierte Namen benutzt. Damit das nicht noch mal passiert: http://office.microsoft.com/de-de/acces ... 31031.aspx
Und damit Du trotzdem damit umgehen kannst, versuch es mal mit quoten des Tabellennamens mit den Backticks, auch bekannt als accent grave. Lassen sich hier im Forum leider nicht darstellen.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
QT-Junkee
Beiträge: 18
Registriert: 14. März 2007 14:59

Beitrag von QT-Junkee »

@ Macman Vielen Dank, Problem gelöst,
NO <-- reserviertes Wort, in eckige Klammern gesetzt, alles geklappt.
Antworten