Seite 1 von 1

Datensätze einfügen

Verfasst: 12. August 2006 13:31
von det
Hallo

Ich versuche mich seit kurzem ein wenig mit der QT, klappt auch alles ganz gut, -bis auf
die Arbeit mit Datenbanken.

Also ich habe eine total einfache App geschrieben (zum probieren eben), ein Hauptfenster mit QDataTable zur Anzeige der Datensätze in der Datenbank.
Zum Hinzufügen eines neuen Datensatzes dient ein einfacher Dialog zur Eingabe des Vor- und Nachnamen.

Hier mal der Code:

Code: Alles auswählen

void CMainFrm::newItem()
{

    CAddEditDlg e;
    if ( ! e.exec() )
    {
	return ;
    };
    
    QSqlCursor cur( "person" ); 
   
     QSqlRecord *buffer = cur.primeInsert();
    
	buffer->setValue( "name",  e.m_name->text()  );
	buffer->setValue( "vorname", e.m_vorname->text()  );
	cur.insert();
  
   m_ctrlTable->refresh();
}
Nun das Problem: In die Datenbank lässt sich ausschliesslich EIN Datensatz einfügen, nämlich der erste, danach passiert nichts mehr.

Die Datenbank: PostgreSQL 8, die Deklaration der Tabelle sieht so aus:

Code: Alles auswählen

CREATE TABLE person ( id int primary key, name varchar(80),vorname varchar(80));
Wäre dankbar wenn mir jemand helfen könnte, wo liegt hier mein Fehler.

Verfasst: 12. August 2006 15:32
von det
AHA, ich hab die Lösung gefunden. PostgreSQL kennt im Gegensatz zu MySQL kein auto_increment, daher war primary key ständig -1, also konnte ausser 0 ( der erste Datensatz) nichts weiter hinzugefügt werden.
Also fix eine Funktion geschrieben, welche die id selbst generiert:

Code: Alles auswählen

int genID( const QString &table )
{
  QSqlQuery query("SELECT max(id) FROM " + table); 
  query.exec(); 
  query.next(); 
  return query.value(0).toInt() + 1; 
};
....und umgesetzt in:

Code: Alles auswählen

void CMainFrm::newItem()
{

    CAddEditDlg e;
    if ( ! e.exec() )
    {
   return ;
    };
   
    QSqlCursor cur( "person" );
   
     QSqlRecord *buffer = cur.primeInsert();
   
    buffer->setValue("id", genID("person")); 
    buffer->setValue( "name",  e.m_name->text()  );
    buffer->setValue( "vorname", e.m_vorname->text()  );
    cur.insert();
 
   m_ctrlTable->refresh();
} 
So, und nun funktioniert das ganze, ob das nun DER elegante Weg ist, wird sich mir dann wohl erst bei komplexeren Anwendung zeigen. :wink:

Verfasst: 12. August 2006 19:51
von upsala
Postgres kennt stattdessen den Datentyp serial und bigserial

Verfasst: 13. August 2006 10:16
von det
Danke, werde mich wohl auch eingehender mit PSQL beschäftigen müssen.