[C++Builder] ADOConnction richig anwenden



  • Hallo zusammen,

    ich habe mit folgende Klasse zusammengestellt:

    class Datenbankbearbeiter
    {
    
       private:
    
          TADOConnection *adoconnection;
          TADOQuery      *adoquery;
          TDataSource    *datasource;
    
       public:
    
          void Verbindung_herstellen();
          Verbindung_trennen();
          Transaktion_starten();
          Transaktion_beenden();
          Sperre_setzen();
          Sperre_ueberpruefen();
          sql_statement_ausfuehren();
    
    };
    

    und habe gerade mal zur Probe die "void Verbindung herstellen" Methode codiert.

    Diese sieht folgendermaßen aus:

    void Datenbankbearbeiter::Verbindung_herstellen()
    {
    
       if (adoconnection->Connected==true)
       {
          adoconnection->Close();
       }
       adoconnection->ConnectionString = "Provider=MSDASQL.1;Password=root;"
                                         "Persist Security Info=True;User ID=root;"
                                         "Data Source=myodbc_zeiterfassung";
    
       adoconnection->LoginPrompt    = false;
       adoconnection->KeepConnection = true;
    
       adoconnection->Open();
    
    }
    

    wenn ich jetzt das Projekt compilieren lasse, dann kommt folgende Fehlermeldung:

    Anwendungsfehler: ExceptionAccessViolation in Modul rtl60.bpl bei 00000000
    

    Und diese Meldung poppt sofot auf, wenn der Debugger an der Stelle

    if (adoconnection->Connected==true)
    

    ist

    Kann mir jemand sagen was daran falsch ist, und wie ich das zum laufen bekomme??

    Danke für die Antworten

    Gruß



  • Du geifst nur auf einen Zeiger zu.
    Stichwort : new



  • Danke erst mal.

    Wo muss ich denn den new - Befehl setzen.
    Geht es, dass ich die in meiner Klasse

    TADOConnection *adoconnection
    

    stehen lass?

    Frage ist halt nur, wo ich jetzt das new setzen muss?!



  • Es stellt sich für mich eh die generelle Frage, wie ich Komponenten erzeuge!

    In manchen Fällen reicht es aus, wenn man nur einen Pointer auf eine Komponente setzt, dann im anderen Fall muss man "new" benutzen.

    Kann mir einer mal bitte die Regeln für solche Erstellungen geben.

    Z.B. wenn ich den Befehl habe:

    TADOCOnnection adoconnection = new TADOConnection();
    

    dann muss man manchmal etwas in die Klammern bei TADOConnection reinschreiben und manchmal nicht!
    Oder wenn man was reinschreiben muss, woher weiß ich dann was das sein soll?

    Kann mir hier jemand weiter helfen?

    Vielen Dank



  • Am besten im Konstruktor deiner Klasse:

    class Datenbankbearbeiter
    {
    
       private:
    
          TADOConnection *adoconnection;
          TADOQuery      *adoquery;
          TDataSource    *datasource;
    
       public:
          Datenbankbearbeiter()
          {adoconnection=new TADOConnection(Application);}
    
          void Verbindung_herstellen();
          Verbindung_trennen();
          Transaktion_starten();
          Transaktion_beenden();
          Sperre_setzen();
          Sperre_ueberpruefen();
          sql_statement_ausfuehren();
    
    };
    


  • Ich habe die Klasse: Datenbankbearbeiter und dessen Methodendefinitionen in einer neue Unit.

    Wenn ich deine Lösung nehme, dann sagt er

    [C++ Fehler] Datenbankbearbeiter.h(30): E2451 Undefiniertes Symbol 'Application'

    und

    [C++ Fehler] Datenbankbearbeiter.cpp(12): E2285 Keine Übereinstimmung für 'TADOConnection::TADOConnection()' gefunden

    Kann das daran liegen, dass ich eine neue Unit benutze und er deshalb die Application nicht kennt? Außerdem programmiere ich gerade keine normale Anwendung, sondern eine Service-Anwendung. Vielleicht hat es damit etwas zu tun?!



  • Du kannst statt Application dort auch 0 angeben. Du mußt adoconnection dann aber selber löschen, Am Besten im Destruktor deiner Klasse.



  • Morgen!

    Also nochmal zu dem Problem. Wenn ich das mit einem Konstuktor für meine Klasse probiere, dann schmeist er immer wieder Exceptions.

    Hier mal die Fehlermeldung:

    Im Projekt Projekt2.exe ist eine Exception der Klasse EOleSysError aufgetreten. Meldung: 'CoInitialize wurde nicht aufgerufen'

    Doch wenn ich eine Methode für das erstellen des Objekts selbst definiere, z.B. setze_werte(), dann macht er das ohne Probleme!

    Weiß jemand, warum das mit meinem Konstuktor nicht funktioniert?

    Hier nochmal mein Code:

    Klasse

    class Datenbankbearbeiter
    {
    
       private:
    
          TADOConnection *adoconnection;
          TADOQuery      *adoquery;
          TDataSource    *datasource;
    
          //void Verbindung_herstellen();
          Verbindung_trennen();
          Transaktion_starten();
          Transaktion_beenden();
          Sperre_setzen();
          Sperre_ueberpruefen();
    
       public:
    
          //setze_werte();
    
          Datenbankbearbeiter();
          void Verbindung_herstellen();
          sql_statement_ausfuehren();
    
    };
    

    cpp

    Datenbankbearbeiter::Datenbankbearbeiter()
    {
       adoconnection = new TADOConnection(Application);
    
    }
    

    Sollte doch eigentlich funktionieren oder??

    Danke für die Antworten

    Gruß



  • Diese Fehlermeldung besagt, dass die COM Bibliothek nicht initialisiert wurde. Schreib einfach in den Konstruktor noch CoInitialize(NULL); Dann sollte es gehen.



  • Jetzt funktionierts!
    Danke


Anmelden zum Antworten