datenbank anzapfen mit c++ und auslesen der daten!



  • hallo!
    brauche dringend hilfe, wo was zum thema datenbanken (hier postgres) zu finden ist.
    ich möchte keine komponenten zb vom c++ builder nutzen, sondern per hand auslesen sozusagen.

    wonach muss ich denn da suchen???

    hab noch nicht so viel schimmer von c++ bitte helft mir auf die richtige spur





  • Ich würde dir sowas wie die DTL oder Soci auch empfehlen bzw. wenigstens in Betracht ziehen. Einer der Vorteile ist, das diese Libraries für mehrere DB-Modelle sind (MySQL, Oracle, Postgres usw.). Du mußt dann nicht bei einem DB-Wechsel oder Projektwechsel eine andere API lernen. Bei Soci ist es wichtig, das ein ODBC-Treiber vorhanden ist.

    http://soci.sourceforge.net/
    http://dtemplatelib.sourceforge.net/



  • ich bin da noch nicht so ganz fit drin!
    heisst das, dass wenn ich nur den c++ builder nutze und will da zb die abfrage einer datenbank oder das ergebnis daraus in einem vektor speichern, sortieren oder was auch immer, es nicht funktionieren kann???

    sondern, ich soci oder so haben muss damit das geht???



  • Das hat jetzt nichts mit dem C++Builder, Speicherung, Sortierung oder ähnlichen zu tun. Diese APIs liefern dir Funktionen und/oder Klassen zum Zugriff bzw. Verwaltung der Datenbanken.



  • ah ja...das ist sozusagen eine erweiterung der mitgelieferten klassen...mit der ich jetzt im c++ style die datenbank abfragen kann und die ergebnisse daraus verwalten kann???

    wo muss denn diese erweiterung in den builder eingebunden werden wenn ich das soci runtergezogen und entpackt habe???



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum VCL/CLX (Borland C++ Builder) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • SOCI ist halt eine Bibliothek die als Sourcecode vorliegt. Da müsstest du erst die notwendigen libs erzeugen. Die vorhandenen Makefiles scheinen aber erstmal alle für Linux zu sein.
    Warum willst du denn keine Komponenten benutzen? Damit wäre es deutlich einfacher.



  • sinn und zweck ist es, dass ich die daten, die ich bekomme zu bearbeiten, zu sortieren, zu verbinden und das möglichst variabel.

    ich hab das soweit, dass ich den rquest aus dem sql statement in ein dbgrid einfügen kann.

    mir ist der weg ich nicht so ganz klar zu einem variablen ergebnis...
    wenn du mir näheres zu der möglichkeit mit komponenten sagen kannst mach ich das halt auch gern so.

    wichtig ist nur variabel!!!



  • Ich hab jetzt nochmal genauer nachgeschaut.
    SOCI - wurde bisher nur unter LINUX getestet
    libpqxx - gibts auch für Windows aber noch keinen Test für einen Borland-Compiler
    DTL - hier gehts anscheinend auch mit dem BCB

    Zeig doch mal was du mit den Komponenten vom BCB gemacht hast bzw. was du willst und warum das bei dir nicht geht.



  • ok!
    @braunstein & all:
    Ich bin Dir sehr dankbar dass du helfen willst.
    Werde das noch mal prüfen, morgen im büro, es nochmal selber probieren und dann noch mal posten.



  • Die Frage ist jetzt, wie ich die zurückgegebenen Werte zb summieren kann???
    Und wie ich diese Daten in einen Container packe zb einen Vektor???

    OK...So sieht das im Moment mit Komponenten aus:

    using namespace std;
     AnsiString textFeld;
     vector<int>vec(1000);
    
            try
            {
                    if(Query1->Active == true)
                    {
                            Query1->Close();
                            Query1->SQL->Clear();
                    }
                    textFeld = Edit2->Text;
                    DataSource1->DataSet = Query1;
                    Query1->SQL->Add("Select su0005 from fibu.kontensummen where ma0001 =:textFeld");
                   //select su0005 from fibu.kontensummen where ma0001 ='0010010000';
                    Query1->ParamByName("textFeld")->AsString = textFeld;
                    Query1->Open();
    
                    //vec = static_cast<float>
    
            }
            catch(EConvertError&)
            {
                    Edit2->Text = "Wert eingeben!";
            }
    


  • siehe FAQ



  • Die TQuery-Klasse hat diverse Methoden dafür (schau am besten in der Hilfe nach).
    Hier ein möglicher Ansatz:

    Query1->First();
    while (!Query1->Eof)
    {
     // Hier werden alle Datensätze verarbeitet (z.B)
     string sName = Query1->FieldByName("Name")->AsString;
     int nAnzahl = Query1->FieldByName("Count")->AsInteger;
     ...
     // hier dann einfach die Daten in den vector pushen
    
     Query1->Next();
    }
    


  • ok...das passt und hilft mir.
    habe jetzt eine anweisung, deren daten ich an ein dbgrid übergebe.

    allerdings fehlen da im dbgrid mehrere tabellen, die varchar sind...in pgadmin funzt der befehl.

    s = Edit1->Text;
                    DataSource1->DataSet = Query2;
                    Query2->SQL->Add("select * from zmis.mandant where ma0001 =:s");
                    Query2->ParamByName("s")->AsString = s;
                    Query2->Open();
    


  • Hallo

    fehlen da im dbgrid mehrere tabellen, die varchar sind

    😕
    - Ein DBGrid stellt genau eine Ergebnistabelle dar
    - Wie kann eine Tabelle varchar sein?

    bis bald
    akari



  • ...akari:
    das verstehe ich nicht so ganz.
    der datentyp der spalte ist in postgres datenbank ein varchar.
    war meine vermutung, dass es daran liegt...stimmt aber nicht.

    bekomme sehr viele ca. spalten in das dbgrid geliefert allerdings nicht die ersten 6 spalten.

    woran kann das liegen dass ich nicht alle spalten zurück bekomme????



  • Hallo

    mir ging es erstmal um den Bezeichnungsfehler. Du hast fälschlicherweise Tabelle geschrieben, richtig wäre Feld bzw. Spalte.

    Das DBGrid stellt grundsätzlich alle vorhandenen Spalten dar. Da du *select ** machst gibt es für uns natürlich keine Möglichkeiten die Feldmenge einzuschätzen.
    Gib doch statt dem * mal die genauen Feldnamen in der ABfrage an, die du sehen willst, und für dann diese im Programm aus.

    bis bald
    akari



  • select ma0001,ma0002,ma0003 from zmis.mandant limit 100;
    gibt ein ganz und gar leeres dbgrid!
    edit:
    ich versuche jetzt, das query mal direkt auszulesen...
    überschreitet listindex ist die fehlermeldung:

    s = Edit1->Text;
                    DataSource1->DataSet = Query2;
                    Query2->Close();
                    Query2->SQL->Clear();
                    Query2->SQL->Add("select ma0000,ma0001,ma0002 from zmis.mandant where ma0001 =:s");
                    Query2->ParamByName("s")->AsString = s;
                    Query2->Open();
                    Query2->First();
    
                    while (!Query2->Eof)
                    {
                    for (int i=0;i<=AnzSpalten;i++)
                    {
                            Memo1->Lines->Add(Query2->Fields->Fields[i]->AsString);
                    }
                            Query2->Next();
                    }
    


  • Hallo

    ist ja schön und gut, aber welchen Wert hat AnzSpalten? Hat der Überhaupz etwas mit der Abfrage,enge zu tun?
    Ich vermute das kein Datensatz der where-Bedingung entspricht und deshalb die Ergbenismenge einfach leer ist.
    Aber selbst dann sollten doch immer noch die Spalten ansich vorhanden sein.

    bis bald
    akari


Anmelden zum Antworten