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
auf die Table....
dann gehst durchs resultset.....
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
Verfasst: 13. Mai 2009 09:10
von reinki0013
AuE hat geschrieben: ist statisch!!!!!!
sorry, mein fehler...
So jetzt habe ich in
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
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:
habs auch so probiert:
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...
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
Verfasst: 13. Mai 2009 14:31
von reinki0013
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();