Seite 1 von 1

Zugriff auf Access MDB mit QSqlQuery

Verfasst: 25. September 2007 10:16
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

Verfasst: 25. September 2007 10:36
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.

Verfasst: 25. September 2007 11:04
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

Verfasst: 25. September 2007 11:19
von CaptnChaos
und zur datenbank hast du verbindung? du hast die datenbank auch geöffnet und die spalte die du umbenennen willst existiert?

Verfasst: 25. September 2007 11:29
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

Verfasst: 25. September 2007 11:33
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);
		}

	}

Verfasst: 25. September 2007 11:54
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.

Verfasst: 25. September 2007 12:02
von QT-Junkee
@ Macman Vielen Dank, Problem gelöst,
NO <-- reserviertes Wort, in eckige Klammern gesetzt, alles geklappt.