ADO Komponenten funktionieren nicht



  • Hallo Leute,

    Ich habe 2 Formen, in beiden brauche ich einen Zugriff auf eine DB.In Meinem Main Formular habe ich da auch keine Probleme, aber in meinem 2 Formular habe ich einige DBCharts. Wenn ich denen als Datenmenge die Query aus meinem Main zuweise,muss ich einen SQL String in die Komponente eintragen. Beim Starten bleibt mein Programm dann hängen, wohl weil aus beiden Formularen gleichzeitig unterschiedliche Zugriffe Stattfinden, oder so.
    Jetzt habe ich versucht im 2 Formular eine 2 komplett neue Verbindung aufzubauen,
    (wenn form 2 geöffnet wird wird Cennectionstring 1 deaktiviert,2 aktiviert)
    und während der Entwicklungszeit geht das auch,wenn ich den SQL-Bef. in die Komp.
    eintrage, aber während der Laufzeit kann ich den SQL Befehl absolut nicht ändern.
    warum? was muss ich da ändern?



  • Scooby schrieb:

    aber während der Laufzeit kann ich den SQL Befehl absolut nicht ändern.?

    Was soll das genau heissen?

    Und glaubst du nicht auch, dass die von dir gewählte Überschrift reichlich unpräzise bzw. unpassend ist?



  • das heißt, ich habe auf jeder Form jeweils eine ADOConnection,eine ADOQuery und eine DataSource.
    auf der ersten Form funktioniert alles, auf der 2 kann ich mit Code z.B.
    (

    Main->ADOQuery1->Close();
         Main->ADOQuery1->SQL->Clear();
         AnsiString q=Main->ADOQuery1->SQL->Add("SELECT ...);
         Main->ADOQuery1->Open();
    

    während der Laufzeit nichts ändern. In die Query kann ich aber zur Entwicklungszeit direkt einen SQL String eingeben, wenn ich das tue dann funktioniert es, aber nur dann. Die Frage ist wieso? Ich habe auch darauf geachtet das zur Laufzeit nur eine Connection aktiv ist(ADOConnection1->Connected=false, ADOConnection2 = true).Bringt aber nichts.

    wenn ich nur eine Verbindung zur DB habe, bekomme ich es mit den Charts nicht hin

    mfg


  • Mod

    Hallo

    2 mal Connection ?

    warum denn

    und mit was ist dein Query denn verbunden

    MfG
    Klaus



  • Hallo,
    die 2 Connections sind wahrscheinlich nicht nötig, aber miteiner hat es halt auch nicht funktioniert, deswegen habe ich die 2 dazugenommen um wirklich 2 Getrennte Vorgänge zu erstellen.
    Verbunden wird meine Query mit einer Access Datenbank.



  • 1. Die Connection öffnet sich automatisch, wenn die Query mit dieser Connection verbunden ist. Das Setzen auf true bringt also wirklich nichts.
    2. Ich glaube, die Frage von KlausB ziehlte nicht auf die verbundene Datenbank, sondern darauf, mit welchem DataSet die Query verbunden ist.
    3. Wenn Du mit zwei Forms auf dieselbe Datenbank zugreifen willst, brauchst Du zwei Connections (idealerweise eine pro Formular).

    Insgesamt ist der Fehler immer noch unklar. Wie äußert sich der Fehler? Wird tatsächlich der SQL-String nicht geändert (glaube ich aber nicht, auch wenn die Zuweisung an q etwas merkwürdig ist) oder wird nur DBChart nicht aktualisiert?

    Machst Du ein Refresh auf DBChart? Von allein aktualisiert sich das Ding nämlich nicht!



  • Manfred Schmidtke schrieb:

    3. Wenn Du mit zwei Forms auf dieselbe Datenbank zugreifen willst, brauchst Du zwei Connections (idealerweise eine pro Formular).

    Also, das ist nun definitiv falsch. Idealerweise hat man die Connection und die DataSets in einem DataModule. In den Formularen sollten sich nur die Oberflächenelemente befinden.



  • Mmmh... wo habe ich behauptet, dass die Connections auf den Formularen zu definieren sind 😕



  • Manfred Schmidtke schrieb:

    Mmmh... wo habe ich behauptet, dass die Connections auf den Formularen zu definieren sind 😕

    Ok, aber trotzdem benötigt man nur eine Connection pro Datenbank. Auf gar keinen Fall pro Form. Die Forms enthalten idealerweise überhaupt keinen Datenbank-Code.



  • Ok, vermutlich hast Du recht.

    Die Erfahrung, mit mehreren Connections bei parallelen Zugriffen zu arbeiten stammt aus der BDE. Hier mussen unterschiedliche Pfade für die Speicherung angegeben werden, sonst hats geknallt.

    ADO ist da offenbar (glücklicherweise) anders gestrickt.

    Punkt drei also (geistig) wieder löschen. 😃



  • Hallo,
    Also ich muss noch mal Nachfragen, denn Ich Verstehe nicht ganz was KlaußB meint, mit was meine Query Verbunden ist. Ich habe ja nur die ADOConnection, ADO Query und eine DataSource Komponente.

    Das mit dem Auslagern der DB Komponenten in ein seperates Modul ist eine gute Idee, ich weiß aber nicht ganz wie ich das machen soll. wenn ich die Komponenten alle in eine extra cpp datei setzte, muss ich dann für alle aktionen(SQL) die ich von den anderen Formen aufrufe extra Funktionen Schreiben? Oder verstehe ich das jetzt falsch?

    @Manfred Schmidtke:
    Ich habe es bei den Charts auch erfolglos mit Refresch() versucht. aber Sicherheitshalber habe ich noch ein DBGrid eingefügt um genau sehen zu können was passiert. Das DBGrid tut ja normalerweise ohne Probleme.
    Zum Fehler:
    ich habe in ein Button eine SQL Abfrage implementiert, mit der ich die Auswahl von Datensätzen ändere. wenn ich da drauf klicke, passiert aber gar nichts,die Daten ändern sich weder im DB Grid noch in den Charts.Wenn ich in meiner 2 Query nicht direkt in das vorgesehene Feld zur entwurfzeit SQL-Code eingebe bleibt alles leer, egal was für Codes ich zur Laufzeit ausführe!!!

    (habe Versucht das DBGrid mit der Query meines Main-Fensters zu verbinden, das geht nur die Charts können das irgendwie nicht)



  • Wenn ich das richtig verstehe, soll die zweite Form auf die Auswahl der ersten Form reagieren. Es stellt sich dabei die Frage, wozu alles doppelt vorhanden sein muss.

    Lagere die Datenbank-Komponenten in ein Data-Module aus und includiere das Data-Module in beiden Forms.

    Die Aktualisierung von DBChart sollte nach Borland-Hilfe eigentlich automatisch geschehen, wenn AutoRefresh und RefreshInterval entsprechend gesetzt sind.



  • Hallo,
    ich habe jetzt meine DB Komponenten in eine DataModule ausgelagert. Wenn ich nun einen Funktionstest mit jeweils einer Form mache,(d.h. alle Datenbankzugriffe der 2.Form (mit Charts) auf disable setze, und umgekehrt, alle DB zugriffe in der 1 Form auskommentieren, die Charts auf enable),dann funktionieren alles.

    Aber, wenn ich alles zusammen aktiv lasse, wie es ja auch sein soll, dann hängt sich mein Programm beim Starten auf,d.h ich sehe den Startbildschirm meines Programms und eine Sanduhr die ewig läuft. Irgendwo ist also wohl eine art endlosschleife oder sowas.
    Ich glaube das dies mit den Charts zusammenhängt, weil, wenn ich sie deaktiviere geht alles. Aber weiß jemand warum das so ist, und wie es behoben werden kann?

    bitte helft mir, es ist dringend. Ich muss mit dem Projekt fertig werden aber ich komme hier nicht weiter



  • Hast Du schon mal mit dem Debugger geschaut, wo es stehen bleibt?



  • Ohne genauere Informationen und Code wird's schwierig.

    Ins Blaue: Wenn von Form1 das Statement abgesetzt wird und Form2 das Ergebnis grafisch darstellen soll: Schalte AutoRefresh bei den DBChart(s) ab und rufe die Refresh-Funktion nach Ausführung des Statements auf.



  • Also ich habe jetzt noch mal von mit dem zugriff von meiner Hauptform begonnen und den ganzen rest weggelassen. Dabei habe ich festgestellt, das hinter meinem Startbildschirm eine Fehlermeldung kommt ->daher das Hängenbleiben.
    Die Fehlermeldung ist eine EAccessViolation. Fehler beim zugriff auf adresse ...
    und zwar kommt dieser fehler genau dann, wenn ich das erste mal auf die Query Komp. in DataModule zugreife (DataModule1->ADOQuery1->Close();)
    Das ist eigentlich komisch, weil genau der selbe Aufruf in meiner 2 Form funktioniert.



  • Im Konstruktor des Forms?



  • Ja,der Befehl ist in einer Funktion und die ist im Konstruktor von TMain



  • Du kannst im Konstruktor des Hauptforms noch nicht auf andere Forms oder Datenmodule zugreifen, da diese noch nicht erzeugt wurden.

    Mögliche Lösung:
    Das Datenmodul nicht automatisch erzeugen lassen, sondern im Konstruktor der Haupform manuell erzeugen.



  • OK, soweit ist jetzt tut jetzt etwas, alle funktionen auf meinem Formular 1 sind gegeben.
    Aber auf dem 2 Formular kommt bei einer ganz simplen abfrage

    DataModule1->ADOQuery1->Close();
    DataModule1->ADOQuery1->SQL->Clear();
    DataModule1->ADOQuery1->SQL->Add("SELECT * FROM Tabelle1");
    DataModule1->ADOQuery1->Open();
    

    zu einem EOLE error: Insuficient key column for updating or refreshing.
    und das erst nachdem er die Abfrage ausgeführt hat, also erst wenn er aus der obigen button routine zurückspringt. Ich weiß nicht wer da was updaten will, den die Charts habe ich vorsichtshalber mal deaktiviert.


Anmelden zum Antworten