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 »

AuE hat geschrieben: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();
danke vorweg mal...

also ich hab das mit dem SetEditStrategy jetzt dazu gebaut...
aber wie gesagt, das erste mal, wenn noch keine Sprache in der Datenbank ist, funktioniert es, bekomme ich beim submitAll() auch true zurück...

allerdings wenn ich eine 2. Sprache hinzufüge, bekomme ich wieder ein false zurück und es wird wieder nichts eingetragen...
also ich check das überhaupt nicht, weiß überhaupt nicht mehr was ich noch machen könnte...

zur info:
ich lege in meiner datenbank.h klasse beim starten im Konstruktor bereits die Datenbank an...
diese hat ja dann nur 3 spalten, ID, Datei, Kategorie und erst im Hauptprogramm schreibe ich in die Datenbank hinein...

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

Beitrag von AuE »

dann versuch doch einfach dich ans ende zu setzen....

oder machs einfach mit ganz normalen Querys ohne das QSqlTableModel

Wenn du die table net anzeigst ist das tableview model auch recht naja ich sag mal mit kanonen auf spatzen geschossen-geht auch alles via QSqlQuery!
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

AuE hat geschrieben:dann versuch doch einfach dich ans ende zu setzen....

oder machs einfach mit ganz normalen Querys ohne das QSqlTableModel

Wenn du die table net anzeigst ist das tableview model auch recht naja ich sag mal mit kanonen auf spatzen geschossen-geht auch alles via QSqlQuery!
ja gut, mit query, aber wie soll ich das query anlegen mit einer unkonstanten?

ich habe ja fix ID, Datei und Kategorie und die Sprachen sind ja nicht fix, ändern sich ja...

Code: Alles auswählen

query.prepare(
"INSERT INTO Texte (ID, Datei, Kategorie, ??Sprache??)"
"VALUES (:ID, :Datei, :Kategorie, ??:Sprache??)");
weißt du was ich meine, weil der String Sprache ändert sich ja ständig, deshalb kann ich den ja net fix hineinschreiben...

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

Beitrag von AuE »

Variablen?

du kannst doch den string bauen wie du willst

QString queryfor = QString("Insert into T_Tabelle(Sprache) VALUES(%0)).arg(meineSprache);

wenn es ganz schön machen magst dann via addbindvalue


querySQL.addBindValue(VarList);
querySQL.execBatch();


oder am BSp:

Code: Alles auswählen

 QSqlQuery query;
     query.prepare("INSERT INTO person (id, forename) "
                   "VALUES (:id, :forename)");
while (!People.empty())
{     
     query.bindValue(":id", people[0].id);
     query.bindValue(":forename", people[0].forename);
     people.pop_front();
}
     query.exec();
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

hallo,

also ganz verstehen tu ich das nicht was du meinst...
vom prinzip her schon, weiß aber net wie ich das anwenden soll...

ich habe ja schon fixe spalten:
ID, Kategorie, Datei

hinzu kommen soll dann die spalten:
DE, GB, FR z.B.

also beim ersten mal die Sprache DE...
ich habe einen QString Sprache1 wo die Sprache drin steht, z.B. DE
beim zweiten mal GB usw.

Wie soll ich das dann schreiben?

Code: Alles auswählen

query.prepare("INSERT INTO Texte (Sprache1)"
"VALUES(:Sprache1)");
dann hätte ich geschrieben:

Code: Alles auswählen

query.bindValue(":ID", i->ID);
query.bindValue(":Datei", Datei);
query.bindValue(":Kategorie", i->Kategorie);
query.bindValue(":Sprache1", i->MapText[spr1]);
aber das funktioniert nicht...
da kommt der Fehler das es diese Spalte nicht gibt...
ich tu mir unheimlich schwer damit...

lg
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Welche Datenbanken verstehen denn SELECT TOP(1)...?

Dann würde ich mir 2 Tabellen anlegen. Die eine hast du schon und die 2. enthält 3 Spalten:
Referenz auf die 1. Tabelle, Sprache, Text

Und dann würde ich mir mit diesem Beispiel ein passendes Editierbares Model zusammenbauen.
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

So,

jetzt hab ich noch eine idee, bzw. ist mir noch was aufgefallen...

und zwar wenn ich das mit der QSqlTableModel und QSqlRecord mache...

und zwar kann ich ja die erste Sprache problemlos in die Datenbank einfügen, es wird genauso gemacht wie es sein sollte.

allerdings, wenn die zweite Sprache eingefügt werden sollte, bekomme ich am schluß bei "model.submitAll()" ein false zurück.
wenn ich dann über "model.lastError()" den Fehler abfrage, kommt folgender Fehler:

Code: Alles auswählen

QSqlError(19, "Der Datensatz konnte nicht abgeholt werden", "constraint failed")
und wenn ich beim QSqlRecord die Debuggausgabe mache kommt folgendes:

Code: Alles auswählen

QSqlRecord(5)"
 "" 0: "QSqlField("ID", QString, generated: yes, typeID: 3) "
 "" 1: "QSqlField("Datei", QString, generated: yes, typeID: 3) "
 "" 2: "QSqlField("Kategorie", QString, generated: yes, typeID: 3) "
 "" 3: "QSqlField("DE", QString, generated: yes, typeID: 3) "
 "" 4: "QSqlField("GB", QString, generated: yes, typeID: 5) "
was mir sofort auffällt ist, dass beim der letzten Sprache "GB" bei "typeID: 5" steht, was bedeutet das? is da vielleicht der hund begraben?

lg
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

könnte das sein das das was mit meinem fehler zu tun haben könnte?
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

@Upsala: was ist an nen Select Top (1) falsch? MSSQL versteht das ohne Proleme!

@reinki0013:
Ahsooo du willst also spalten dynamisch hinzufügen?
aber warum nicht folgender Weg:

Deine Ursprungstabelle um die Spalte "Sprache" ergänzen, neue Tabelle (Spalten SprachID, Sprache) weitere neue Tablle (Sprache_zu_ Datei) die nur die Werte SpracheID und DateiID (die primäschlüssel der beiden Tabellen beinhaltet) dann kannst dir ne view bauen wo du die beiden sachen gegeneinander joinst!
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

AuE hat geschrieben:@Upsala: was ist an nen Select Top (1) falsch? MSSQL versteht das ohne Proleme!

@reinki0013:
Ahsooo du willst also spalten dynamisch hinzufügen?
aber warum nicht folgender Weg:

Deine Ursprungstabelle um die Spalte "Sprache" ergänzen, neue Tabelle (Spalten SprachID, Sprache) weitere neue Tablle (Sprache_zu_ Datei) die nur die Werte SpracheID und DateiID (die primäschlüssel der beiden Tabellen beinhaltet) dann kannst dir ne view bauen wo du die beiden sachen gegeneinander joinst!
so, ich hätte es jetzt noch mit QMYSQL versucht, allerdings funktioniert da schon wieder was nicht...

jetzt bekomme ich die fehlermeldung:

Code: Alles auswählen

QSqlError(2036, "QMYSQL3: Der Wert konnte nicht gebunden werden", "Using unsupported buffer type: -842150451  (parameter: 1)") 
was hat das genau zu bedeuten? wo können die möglichen ursachen liegen?

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

Beitrag von AuE »

wir hätten evtl schon mal eher damit anangen sollen:

Was willst du eigentlich machen? Was ist das Problem was du mit deiner SW lösen möchtest?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

@AuE: Wo wurde hier von MSSQL gesprochen, und wo würde das im SQL-Standard stehen?
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

upsala hat geschrieben:@AuE: Wo wurde hier von MSSQL gesprochen, und wo würde das im SQL-Standard stehen?
zu erstens: nirgends (sorry)
zu zweitens: hätte ich besser lesen sollen!
The TOP Clause

The TOP clause is used to specify the number of records to return.

The TOP clause can be very useful on large tables with thousands of records. Returning a large number of records can impact on performance.

Note: Not all database systems support the TOP clause.
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

So, also noch mal von vorne ;-)

ich will eine datenbank anlegen, in der ich sprachen dynamisch hinzufügen möchte...

also ich habe 3 fixe spalten...

Code: Alles auswählen

ID | Datei | Kategorie -> und jetzt pro Sprache eine dynamische Spalte
Die Sprache die ich hinzufügen möchte, wähle ich im Hauptprogramm aus, also z.B. DE für Deutsch, so sollte das dann aussehen...

Code: Alles auswählen

ID | Datei | Kategorie | DE
Danach eine andere Sprache auswählen, überprüfen ob die Sprache schon vorhanden ist, wenn nicht dann hinzufügen, z.B. GB für Englisch

Code: Alles auswählen

ID | Datei | Kategorie | DE | GB
so sollte das alles aussehen...

so hier nun mein bisheriges programm:

Code: Alles auswählen

  

    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();
     }

   for(i = m_Texte.TextMap.begin(); i != m_Texte.TextMap.end(); i++)
  {
       QSqlTableModel model;
       model.setEditStrategy(QSqlTableModel::OnManualSubmit); 
       model.setTable("Texte");
       model.select();

       QModelIndex insertIndex;

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

       // ID, Datei, Kateogrie, Sprache
       record.setValue("ID", i->ID);
       record.setValue("Datei", Datei);
       record.setValue("Kategorie", i->Kategorie);
       record.setValue(Sprache1, i->MapText[spr1]);

       model.setRecord(row, record);  // Record setzen
       model.submitAll();     //  
       qDebug() << model.lastError();  // -->> hier bekomme ich den Fehler
  }
  // wird erst nach beenden der for-schleife ausgeführt
  model.select(); 
Die erste Sprache wird super hinzugefügt, inkl. der Texte der jeweiligen Sprache, bei der zweiten Sprache allerdings dann der Fehler:

Code: Alles auswählen

QSqlError(19, "Der Datensatz konnte nicht abgeholt werden", "constraint failed")
Die Spalte wird problemlos hinzugefügt, aber eben ohne Text...

Vielleicht kann mir doch noch jemand weiterhelfen, wäre echt toll...

lg
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

Hallo an alle,

so ich würde jetzt gerne mal wissen, was folgende Fehlermeldung bedeutet:

Code: Alles auswählen

"Der Datensatz konnte nicht abgeholt werden" "constraint failed"
Kann mir bitte irgendwer in diesem Forum sagen, warum anscheinend ich der erste bin der diesen Fehler hat?

bin echt am verzweifeln...

lg :cry:
Antworten