Fehler beim Ausprobieren von libpqxx-4

Hallo liebe Community,
Ich beschäftige mich gerade damit libpqxx zu lernen.
folgendes Script:

#include <iostream>
#include <pqxx/pqxx>

 int main()
 {
   try
   {
     pqxx::connection c(
	    "user=papa "
            "host=localhost "
            "password=mama "
            "dbname=postgres");
     pqxx::work w(c);
for (pqxx::result::const_iterator row = r.begin();
      row != r.end();
      ++row)
  {
    for (pqxx::result::tuple::const_iterator field = row->begin();
         field != row->end();
         ++field)
      std::cout << field->c_str() << '\t';

    std::cout << std::endl;
  }
     w.commit();

     std::cout << r[0][0].as<int>() << std::endl;
   }
   catch (const std::exception &e)
   {
     std::cerr << e.what() << std::endl;
     return 1;
   }
 }

führt leider zu folgendem Fehler:

g++ KapStart2.cpp -lpqxx -lpq -o zumi
KapStart2.cpp: In function ‘int main()’:
KapStart2.cpp:23:24: error: ‘pqxx::result::tuple’ has not been declared
     for (pqxx::result::tuple::const_iterator field = row->begin();
                        ^
KapStart2.cpp:24:10: error: ‘field’ was not declared in this scope
          field != row->end();
          ^
KapStart2.cpp:24:10: note: suggested alternative:
In file included from /usr/local/include/pqxx/field:19:0,
                 from /usr/local/include/pqxx/result.hxx:34,
                 from /usr/local/include/pqxx/result:19,
                 from /usr/local/include/pqxx/binarystring.hxx:26,
                 from /usr/local/include/pqxx/binarystring:18,
                 from /usr/local/include/pqxx/pqxx:17,
                 from KapStart2.cpp:2:
/usr/local/include/pqxx/field.hxx:43:22: note:   ‘pqxx::field’
 class PQXX_LIBEXPORT field
                      ^

Da ich ein Anfänger und nicht ein studierter Informatiker bin finde ich den verdammten Fehler nicht.

Ein auf dem ( Feuerwehr- ) Schlauch stehender

Mungo1981

P.S.: So wie ich die Fehlermeldung verstehe, reicht das #include <libpqxx/libpaxx> nicht aus, da ich die folgenden Kapitel erst verstehe wenn ich dieses Kapitel verstanden hab - steh ich halt auf nem Feuerwehrschlauch - und weis nicht so recht was ich tun soll.

Das ist ein ein Syntaxfehler und dein Program wird sich nicht kompilieren lassen bist Du diesen Programmierfehler korrigiert hast.

Der GNU C/C++ Compiler gibt Dir einen Hinweis:Der Fehler befindet sich in Zeile 24. Das Objekt ::tuple is unbekannt.Irgendein inlude header der dieses C++ Objekt definiert fehlt noch. Da Postgres selbst nur in C jedoch nicht in C++ programmiert wurde muss es sich bei der gesuchten *.h include Datei (oder Namespace) um etwas aus deinem libpg++ Paket handeln.

Schau einfach mal im libpq++ Ordner nach *.h Dateien und include die einfach mal und erstelle dann mit g++ neu, eine der inludes wird wohl der richtige sein.

Ok,
Ich hab zuerst versucht alle Librarys zu includen die unter “sugested alternative” forgeschlagen wurden.
Den kompletten Ordner pqxx hinzu zu fügen scheint Arbeit zu sein für jemanden der seinen Ödipus-Komplex ausargiert hat.

Hat sonst noch jemand eine Idee zur Lösung meines Problems ???

Mungo1981

Ok, hab noch was rumprobiert.
Ich hatte auch überlesen das "-std=c++11 " zu compilieren gesetzt sein muss.
Kann es sein das beim compilieren der Library dieser Parameter nicht gesetzt war,
Und deshalb irgendseine Komponente nicht richtig gebildet wurde und nun fehlt ???

Hat das denn nun funktioniert oder nicht?

Nein hat nicht funktioniert.

Hatte mittlerweile schon versucht “#include <pqxx/tuple>”

Kann sein,
dass der Fehler so banal ist, dass er vielleicht gar nicht gesehen wird !!! :frowning: :frowning: :frowning:

Also ich weiß nicht warum dein test code nicht läuft (läuft auch bei mir nicht) aber ich habe mal einen ähnlichen testcode zusammengebastelt und der läuft mit deiner libpq++ lib.

#Libpq am besten mit apt installieren: sudo apt-get install libpqxx-dev

Schritt 1:
Mit psql (oder womit Du ansonsten SQL-Queries bearbeitest) und Datenbank mit dem Namen “company” anlegen z.B so
CREATE DATABASE company;

Schritt 2:
CREATE TABLE employee (id int, name varchar(255), salary int);

Schritt 3:
INSERT INTO employee (id, name, salary) VALUES (1001, ‘Trump’, 10);
INSERT INTO employee (id, name, salary) VALUES (1002, ‘Obama’, 11);

So und nun unser libpq++ Testprogram (datei: libpq+±test.cc)

#include
#include <pqxx/pqxx>

/// Query employees from database.
pqxx::result query()
{
pqxx::connection c{“dbname=company user=postgres”};
pqxx::work txn{c};

pqxx::result r = txn.exec(“SELECT name, salary FROM employee”);
for (auto row: r)
std::cout
<< row[“name”].c_str()
<< " makes "
<< row[1].as()
<< “.”
<< std::endl;

txn.commit();
return r;
}

/// Query employees from database, print results.
int main(int, char *argv[])
{
try
{
pqxx::result r = query();

// Results can be accessed and iterated again. Even after the connection
// has been closed.
for (auto row: r)
{
std::cout << "Row: ";
// Iterate over fields in a row.
for (auto field: row) std::cout << field.c_str() << " ";
std::cout << std::endl;
}
}
catch (const pqxx::sql_error &e)
{
std::cerr << "SQL error: " << e.what() << std::endl;
std::cerr << "Query was: " << e.query() << std::endl;
return 2;
}
catch (const std::exception &e)
{
std::cerr << "Error: " << e.what() << std::endl;
return 1;
}
}

#Kompilieren mit
g++ libpq+±test.cc -lpqxx -lpq -o mylibpq++test

#Starten mit
./mylibpq++test

#Ausgabe:
Trump makes 10.
Obama makes 11.
Row: Trump 10
Row: Obama 11

Juston, whe have a problem:

Bei mir führt dieser ( dein ) Code zu mehr Fehlermeldungen als meine Konsole anzuzeigen vermag

Dann zeig mal die Fehlermeldungen, bei mir sind es genau 0

Ja eigentlich gern:

  1. Aber ich denke diese Menge Fehlermeldungen würden mehr als zwei Seiten dieses Forums lang.
  2. Ich hab deine Idee mit der Anweisung “for( auto x; r )” aufgegriffen.
    Und folgender Code läuft durch:
#include <iostream>
#include <pqxx/pqxx>
#include <pqxx/result.hxx>
#include <pqxx/result>
#include <pqxx/field>
#include <pqxx/binarystring>

 int main()
 {
   try
   {
     pqxx::connection c(
	    "user=papa "
            "host=localhost "
            "password=mama "
            "dbname=mydb");
     pqxx::work w(c);

pqxx::result r = w.exec("SELECT * from tz");
     w.commit();
std::cout << r.size() << std::endl;
std::cout << r[0].size() << std::endl;
std::cout << r[0][0] << std::endl;

for(auto x: r)
std::cout << x[0].c_str() << "\t" << x[1].as<int>()+111 << std::endl;

   }
   catch (const std::exception &e)
   {
     std::cerr << e.what() << std::endl;
     return 1;
   }
 }

Startet das Program auch und wird bei cout was ausgegeben?

Ok,
Ich hab den Code von dir etwas einfacher Umgeschrieben.

Zuerst einmal der Inhalt der Tabelle aus pqsql:

mydb=# select * from tz;
  a  |  b  
-----+-----
 123 | 321
 444 | 555
 123 | 666
(3 rows)

Dann die Ausgabe meines Codes:

oem@oem-HP-255-G5-Notebook-PC ~/TestForLibpq5 $ ./Mikado 
3
2
123
123	432
444	666
123	777

P.S.: Da ich schon seit 8Uhr for der Maschine hocke hatte ich mich etwas verhaspelt und leider zuerst unnötig den richtigen Code der Ausgabe meines Programms durch das Listening meines Programmes ersetzt, ENTSCHULDIGUNG ;-(

Ok, dann läuft es ja jetzt.

Ja eine Art Workaround.
Nur frag ich mich jetzt so langsam ob die DOC von libpqxx-4 die Bits Wert ist die sie belegt.
Es ist schon das zweite Programm das nicht wie es soll funktioniert ???

:angry: :confused: :angry: :frowning: :p

P.S.: Vielleicht ne bessere Anleitung.