QSql Spaltennamen auslesen

Alles rund um die Programmierung mit Qt
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

QSql Spaltennamen auslesen

Beitrag von reinki0013 »

Hallo zusammen,

ich hab ein kleines problem mit einer datenbank...
und zwar erzeuge ich die datenbank in meiner datenbank-klasse und im hauptprogramm kann ich die datenbank über einen Menüpunkt befüllen...

Ich habe in meinem hauptprogramm ein tablewidget wo ich den spaltennamen in die datenbank schreibe und die daten ebenfalls...

jetzt bräuchte ich zur kontrolle, ob es diese spalte schon gibt, ich meine da den spaltennamen, eine funktion oder wie soll ich das auslesen?
wisst ihr was ich meine? also ich will kontrollieren ob es schon so eine spalte mit dem spaltennamen gibt bevor ich sie in die datenbank eintrage...

wie ich einzelne einträge in meiner spalte durchsuchen kann weiß ich schon, aber da gibt es keine funktion bzw. befehle zum auslesen des spaltennamens...

bin wirklich ein wenig ratlos...

wäre wirklich für jeden tipp dankbar...

mfg
reinki
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Klar geht das....

Die Tabellen deiner DB gibts via

Code: Alles auswählen

QStringList tableListIB = objQIbaseDb.tables(QSql::Tables);
dann machste einfach ein

Code: Alles auswählen

select TOP(1) * 
auf die Table....

dann gehst durchs resultset.....

Code: Alles auswählen

colNames.append( query.record().fieldName(actPos));
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

hallo,

besten dank mal für deine antwort...

also ich erkläre jetzt nochmal mein problem genauer...
ich erzeuge beim starten des programms im konstruktor der datenbank-klasse meine datenbank.

diese hat beim start 3 spalten: Name, Datei, Kategorie

im hauptprogramm, kann ich in die datenbank hineinschreiben, dort schreibe ich die jeweils ausgewählte sprache hinein...
beim ersten mal Deutsch und beim zweiten mal z.b. Englisch.

Ich will jetzt gerne überprüfen ob diese Sprache, die ich hineinschreiben will schon als Spalte vorhanden ist.

deshalb, weil ich ja im hauptprogramm bin, kann ich ja

Code: Alles auswählen

QStringList tableListIB = objQIbaseDb.tables(QSql::Tables);
nicht machen, weil ich ja im hauptprogramm bin...

ich will, praktisch im hauptprogramm nachsehen in der datenbank ob die sprache schon als Spalte vorhanden ist...

wie kann ich das am besten machen?

mfg
reinki
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Code: Alles auswählen

QSqlDatabase::database();
ist statisch!!!!!!
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

AuE hat geschrieben:

Code: Alles auswählen

QSqlDatabase::database();
ist statisch!!!!!!
sorry, mein fehler...

So jetzt habe ich in

Code: Alles auswählen

QStringList tableListDB
den Namen meiner Datenbank, also in meinem Fall "Texte"...

aber ich benötige ja die schon vorhandenen Spaltennamen...

Wie mache ich das jetzt mit dem

Code: Alles auswählen

select TOP(1) * 
jetzt genau?
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

schau dir mal QSqlQuery an!
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

AuE hat geschrieben:schau dir mal QSqlQuery an!
ja okay...

habs jetzt so probiert:

Code: Alles auswählen

query.exec("SELECT TOP(1) *");
habs auch so probiert:

Code: Alles auswählen

query.exec("SELECT TOP(1) * Texte");
da bekomme ich aber ein false zurück... ich finde leider keine infos über "TOP(1)" was genau macht das bzw. ich finde auch nichts davon beim QT-Assistenten...

und was genau soll ich mit dem "resultset" machen?
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

So ich hab jetzt die Lösung für mein Problem gefunden...

Und zwar sieht die folgendermaßen aus:

Code: Alles auswählen

QSqlTableModel model;
QString test = model.headerData(3, Qt::Horizontal, Qt::DisplayRole).toString();

Code: Alles auswählen

model.headerData(Spalte, Horiz. Header od. Vert. Header, DisplayRole);
Bin jetzt wieder glücklich :)
werd jetzt in einer schleife die ganzen spalten durchgehen und schon hab ich das was ich wollte...

trotzdem danke an AuE
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

ich habs so

Code: Alles auswählen

void SqlDumpper::GetInfo()
{
	QSqlDatabase dbObj = QSqlDatabase::database();
	QStringList tablelist =	dbObj.tables(QSql::Tables);

	ui.treeWidget->clear();


	
	QTreeWidgetItem *MainRootItem = new QTreeWidgetItem(ui.treeWidget);
	MainRootItem->setText( 0, ui.leDatabase->text() );

	while (!tablelist.empty())
	{
		QTreeWidgetItem *table = new QTreeWidgetItem(MainRootItem);
		table->setText(0, tablelist.at(0));
	
		QSqlQuery query;

		query.exec(QString("Select TOP(1)* from %0").arg(tablelist[0]));
		if ( query.lastError().isValid() )
			qDebug("Query ERROR: %s when executing query '%s'",qPrintable(query.lastError().text() ), qPrintable(query.lastQuery())); 
		
	
		for (int i = 0; i < query.record().count(); i++)
		{
			QTreeWidgetItem *col = new QTreeWidgetItem(table);
			col->setText(0, query.record().fieldName(i));
		}
		
		tablelist.pop_front();
	}
}
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

hi,

ich hab noch ein kleines problem, hier mal der code:

Code: Alles auswählen

  QString Sprache1 = "DE"; // z.B.
  QStringList SprachenDB;
  if(!SprachenDB.contains(Sprache1, Qt::CaseSensitive))
  {
    // Spalte hinzufügen, benennen und als VARCHAR definieren
    query.exec("ALTER TABLE `Texte`Add " + Sprache1 + " VARCHAR;");
    // Funktion NeuLaden aufrufen
    m_Datenbank.Laden();
  }

  QSqlTableModel model;
  
  model.setTable("Texte");
  model.select();  
  //qDebug() << model.select();

  for(i = m_Texte.TextMap.begin(); i != m_Texte.TextMap.end(); i++)
  {
    QModelIndex insertIndex;

    row = insertIndex.row()  == -1 ? 0 : insertIndex.row();
    model.insertRow(row);
    QSqlRecord record = model.record(row);

    // ID, Datie, Kateogrie
    record.setValue("ID", i->ID);
    record.setValue("Datei", Datei);
    record.setValue("Kategorie", i->Kategorie);
    
    record.setValue(Sprache1, i->MapText[spr1]);
    //qDebug() << i.key() << i->MapText[spr1] << " " << record;
    // hier findet man in der Konsole: 
    // QSqlField("DE", QString, generated: yes, typeID: 5)
   // was bedeutet das eigentlich?
 
    model.setRecord(row, record);  // Record setzen
    model.submitAll();
    index++;
  }
  model.select(); 
jetzt legt er mir zwar die neue spalte mit der sprache an, aber leider schreibt er mir nichts in diese spalte hinein...

könnt ihr mir da weiterhelfen?
wäre euch sehr verbunden...

lg reinki
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

jau schau mal in die doku.... da steht drin wann es submittet wird beim table!
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

AuE hat geschrieben:jau schau mal in die doku.... da steht drin wann es submittet wird beim table!
könntest du mir das näher erläutern, bin nämlich schon fast am verzweifeln... :oops:

was meinst du genau damit?
ich krieg nämlich am ende bei dem model.submitAll() false zurück...
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

http://doc.qtsoftware.com/4.5/qsqltable ... itStrategy

was steht denn im Compileroutput nach dem Submit?
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

AuE hat geschrieben:http://doc.qtsoftware.com/4.5/qsqltable ... itStrategy

was steht denn im Compileroutput nach dem Submit?
also ich habe jetzt in der ausgabe-debug-modus, wenn
ich mit model.lastError() abfrage, "Der Datensatz konnte nicht abgeholt werden"...

was heißt das jetzt?
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Folgendes geht bei mir....

Code: Alles auswählen

	 QSqlTableModel model; 
	 model.setEditStrategy(QSqlTableModel::OnManualSubmit);
	 model.setTable("T_Test"); 
     model.select();  
	 QModelIndex insertIndex;
     int row = insertIndex.row()  == -1 ? 0 : insertIndex.row(); 
     model.insertRow(row); 
     QSqlRecord record = model.record(row); 

    // ID, Datie, Kateogrie 
    record.setValue("Name", "bla"); 
    record.setValue("TeilNr", "abs"); 
    record.setValue("BID", 5);     
    
	  
    model.setRecord(row, record);  // Record setzen 
    model.submitAll(); 
   
 
  model.select();
Antworten