QSql Spaltennamen auslesen

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

Beitrag von reinki0013 »

Schönen guten Morgen,

wollte gerne von euch wissen, ob jemand folgende Fehlermeldung schon hatte bzw. weiß warum ich diese bekommen könnte:

Code: Alles auswählen

QSqlError(19, "Der Datensatz konnte nicht abgeholt werden", "constraint failed")
Hoffe irgendjemand hatte schon mal so einen fehler bzw. kann mir weiterhelfen.

lg und besten dank
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Also, der Fehler ist mir unbekannt, der Fehlercode bringt einen nicht weiter ohne Info welche DB du momentan verwendest.

Im übrigen geht das dermaßen simpel, mit SQL nen neue Spalte hinzuzufügen:

Code: Alles auswählen

$ sqlite3
SQLite version 3.6.14.1                            
Enter ".help" for instructions                     
Enter SQL statements terminated with a ";"         
sqlite> CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT);
sqlite> INSERT INTO test (name) VALUES ("Peter");             
sqlite> SELECT * FROM test;                                   
1|Peter                                                       
sqlite> ALTER TABLE test ADD nachname TEXT;                   
sqlite> SELECT * FROM test;                                   
1|Peter|                 
sqlite> UPDATE test SET nachname="Pan" WHERE id=1;     
sqlite> SELECT * FROM test;     
1|Peter|Pan 
ALTER TABLE ist das entscheidende.
Das ist jetzt mit SQLITE, funktioniert aber garantiert mit jeder anderen SQL-Datenbank.

Ansonsten geht das doch auch deutlich schöner, in den du mit Relationen arbeitest. Sprachen prinzipiell nur in eine eigene Tabelle, Die haben dann die ID + die Übersetzung.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

und eine Tabelle für die Dateien und eine Zuweisungstabelle... das sage ich scho seit ner ewigkeit ;-)

siehe angehängtes pic!
Dateianhänge
bsp_tablelayout.PNG
bsp_tablelayout.PNG (14.52 KiB) 4395 mal betrachtet
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

So,

ich hab nun endlich die lösung für mein problem...
ich bin überglücklich euch diese zu präsentieren...

und zwar war das problem das ich hatte bzw. die fehlermeldungen eigentlich ein bug von qt...
hab dazu einen bug-tracker gefunden 224113...

und zwar:

Code: Alles auswählen

QSqlTableModel::setRecord() doesn't update an existing row, it will
    fail since it can't create the WHERE clause"
deshalb hab ichs so gemacht, und siehe da es funzt:

Code: Alles auswählen

    for (int column = 0; column < record.count(); column++)
    {
        if (!setData(index(row, column), record.value(column)))
            return false;
    }

wenn jemand jetzt die fertige funktion sehen will, kann ich euch erst morgen hier reinstellne, codemäßig...

dieser bug sollte lt. Trolltech bei der Version 4.5.1 behoben sein...

lg ein glücklicher :D
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

QSqlTableModelist dermaßen mit Kanonen auf Spatzen...
Das macht bitte keiner nach!

Hier einfach nochmal Schritt für Schritt das was im Thread verstreut liegt, falls jemand mal ne Tabelle um Spalten (sprich: "neue Datenfelder") erweitern will, bzw. die Spaltennamen abfragen will.

Das macht man alles mit QSqlQuery.

angenommen wir haben eine Tabelle "test".

So fügen wir eine neue Spalte ein:

Code: Alles auswählen

query.exec("ALTER TABLE test ADD COLUMN nachname TEXT");
Mit SQLite funktioniert ADD <Spalteninfos> und ADD COLUMN <Spalteninfos>.

So finden wir die Anzahl der Spalten heraus:

Code: Alles auswählen

query.exec("SELECT * FROM test LIMIT 0"); // wir brauchen nur den record(), darum LIMIT 0
int numFields = query.record().count()
Mit der Info kann man jetzt alle Spalten nach dem Namen fragen:

Code: Alles auswählen

for( int i=0; i<numFields; i++ ) {
    qDebug() << query.record().field(i).name();
}
Mit der Info kann man nun auch herausfinden, ob eine bestimmte Spalte schon existiert. Das in eine Funktion gepackt und man tut sich richtig leicht!

Grüße
Franz
Antworten