Seite 1 von 3

QSql Spaltennamen auslesen

Verfasst: 13. Mai 2009 08:15
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

Verfasst: 13. Mai 2009 08:28
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));

Verfasst: 13. Mai 2009 08:56
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

Verfasst: 13. Mai 2009 09:02
von AuE

Code: Alles auswählen

QSqlDatabase::database();
ist statisch!!!!!!

Verfasst: 13. Mai 2009 09:10
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?

Verfasst: 13. Mai 2009 09:42
von AuE
schau dir mal QSqlQuery an!

Verfasst: 13. Mai 2009 10:00
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?

Verfasst: 13. Mai 2009 10:21
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

Verfasst: 13. Mai 2009 10:39
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();
	}
}

Verfasst: 13. Mai 2009 14:11
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

Verfasst: 13. Mai 2009 14:14
von AuE
jau schau mal in die doku.... da steht drin wann es submittet wird beim table!

Verfasst: 13. Mai 2009 14:18
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...

Verfasst: 13. Mai 2009 14:28
von AuE
http://doc.qtsoftware.com/4.5/qsqltable ... itStrategy

was steht denn im Compileroutput nach dem Submit?

Verfasst: 13. Mai 2009 14:31
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?

Verfasst: 13. Mai 2009 15:06
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();