[BCB6] Datenbankabfrage mit dbExpress Komponenten



  • Hallo,

    ich habe es bereits hinbekommen, mit der dbExpress Komponente
    Daten in eine MYSQL DB zu schreiben.
    Allerdings scheiter ich gerade daran, Daten mit einer Bedinung wieder
    aus dieser DB zu lesen und sinnvoll in eine ListBox zu schreiben.
    Er schreibt mir immer nur einen Zahlencode rein.

    Memo1->Text = SQLConnection1->ExecuteDirect("SELECT * FROM invoice WHERE invoicenumber = '10000'");
    

    So hab ich das ganze mal versucht.

    Kann mir hier jemand weiterhelfen?



  • 1. Die Hilfe zu ExecuteDirect nochmal gründlich durchlesen.

    2. Siehe FAQ, "Datenbank - Ergebnisse von SELECT auswerten"



  • Hmm,
    hab ich die HIlfe-Dateien von Execute und ExecuteDirect richtig interpretiert, wenn ich sage, dass keiner der beiden Methoden die Ergebnisse zurückliefern, sondern nur Fehlercode bzw. Anzahl der Datensätze auf die zugegriffen wurden?

    ICh komm leider auch mit der FAQ nicht weiter, da dort ja soweit ich das sehe nicht die dbExpress Komponente verwendet wird 😕 Oder ich seh da so einiges falsch 🙂



  • z. 1: Genau.

    z. 2: Die Datenbankkomponenten, sei es nun dbExpress, IB, BDE oder andere, funktionieren alle nach denselben Prinzipien, das is ja grad das Schöne daran.



  • Sorry, ich krieg das leider nicht hin, bzw. kann das gelesene nicht anwenden.
    Könntest du mir evtl. nen kleines Beispiel bauen?



  • Hallo

    dann schau dir denn angesprochenen FAQ-Beitrag noch mal an, die Antwort von F98 ist doch ein Beispielcode
    http://www.c-plusplus.net/forum/viewtopic.php?t=39279
    Außerdem hat auch der Builder ne menge Beispielprogramme zum Thema DB, in <BCB-Path>/Examples/DBTasks

    bis bald
    akari



  • Hallo,

    ich hab das ganze mir jetzt mal weiter angeguckt und mich durch die Hilfen gelesen. Ich hatte auch gedacht so müsste es klappen, aber leider bekomme ich mit folgendem Code immer die Fehlermeldung "Für diese Operation ist die Eigenschaft SQLConnection1 nötig".

    SQLConnection1 ist bei mir die Bezeichnung für die SQLConnection die eingerichtet ist und auch funktioniert (dbExpress->SQLConnection).

    TSQLQuery* Query = new TSQLQuery(this);
    Query->SQL->Clear();  
    Query->SQL->Add("SELECT * FROM invoice WHERE invoicenumber = '10000'");  
    Query->Open();
    

    Der Fehler scheint an dem Open() zu liegen, aber damit rufe ich ja den Select Code auf, oder?



  • Hallo

    die Fehlermeldung ist bereits aussagekräftig.
    Du benutzt ja nicht die Standard-Komponenten für BDE/Paradox, sondern angepaßte für MySQL. Deshalb brauchst du noch die Passende Connection-Komponente. Eine solche sollte neben der TSQLQuery-Komponente verhanden sein. Ich weiß nbur nicht genau, welches Packet du benutzt.

    bis bald
    akari



  • Hey! Danke für die schnelle Antwort!

    Wo sehe ich welches Paket ich benutze?
    VL hilft es dir wenn ich hier mal den kompletten Quellcode poste.

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit2.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm2 *Form2;
    //---------------------------------------------------------------------------
    __fastcall TForm2::TForm2(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::Button1Click(TObject *Sender)
    {
    Memo1->Text = SQLConnection1->ExecuteDirect("SELECT * FROM invoice WHERE invoicenumber = '10000'");
    }
    //---------------------------------------------------------------------------
    

    Und auf der Form ist wie gesagt nur eine dbExpress->SQlConnection Komponente und ein Button. DIie SQLConnection hat als DriverName MYSQL.



  • Ich kanns leider nicht löschen, aber der andere Quelltext war der Alte, Sorry!

    //--------------------------------------------------------------------------- 
    
    #include <vcl.h> 
    #pragma hdrstop 
    
    #include "Unit2.h" 
    //--------------------------------------------------------------------------- 
    #pragma package(smart_init) 
    #pragma resource "*.dfm" 
    TForm2 *Form2; 
    //--------------------------------------------------------------------------- 
    __fastcall TForm2::TForm2(TComponent* Owner) 
            : TForm(Owner) 
    { 
    } 
    //--------------------------------------------------------------------------- 
    
    void __fastcall TForm2::Button1Click(TObject *Sender) 
    { 
    TSQLQuery* Query = new TSQLQuery(this); 
    Query->SQL->Clear();   
    Query->SQL->Add("SELECT * FROM invoice WHERE invoicenumber = '10000'");   
    Query->Open();
    } 
    //---------------------------------------------------------------------------
    

    Das ist der jetzige bei dem die Fehlermeludung "Für diese Operation ist die Eigenschaft SQLConnection1 nötig" kommt.



  • Du musst das zur Laufzeit erstellte SQLQuery auch mit der SQLConnection verknüpfen, so wie du es sonst im ObjectInspector machen würdest.
    Arbeite vielleicht erstmal das DB-Tutorial in der Hilfe durch.

    Ausserdem das delete nicht vergessen, sonst müllst du dir bei wiederholten Buttonclicks den Speicher zu.



  • Okay, ich habs hinbekommen.
    Danke für Eure Geduld! Klasse Forum hier.
    Für alle anderen die Rätseln.

    TSQLQuery* Query = new TSQLQuery(this);
            Query->SQLConnection = SQLConnection1;
            Query->SQL->Clear();
            Query->SQL->Add("SELECT * FROM invoice WHERE invoicenumber != '' ORDER BY invoicenumber DESC LIMIT 1 ");
            Query->Open();
            Label10->Caption = Query->Fields->Fields[1]->AsString;
            delete Query;
    

Anmelden zum Antworten