Announcement

Collapse
No announcement yet.

dbExpress + Neuling = Verwirrung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • dbExpress + Neuling = Verwirrung

    Hallo Experten,

    ich bin ein Neuling was Datenbanken betrifft, muss mich aber jetzt dummerweise damit rumärgern.
    Ich hab auch schon einiges gelsen und im Groben läuft das ganze auch. Allerdings stehe ich noch vor einem Problem, dass ich nicht in den Griff bekomme:
    Ich habe dem TSQLDataSet zur Designzeit den CommandText gegeben.
    "SELECT * FROM TABLEX;"
    Hierdurch holt er sich ja auch zur Designzeit die Feldnamen.
    Ich bin jetzt aber gezwungen zur Laufzeit zwischen mehreren Tables zu wählen, diese haben auch unterschiedliche Felder.

    Probiere ich jetzt aber zur Laufzeit folgendes:

    Code:
    SQLDataSet->Active=false;
    SQLDataSet->CommandText="select * from TABLEY;";
    try{                   
    	SQLDataSet->ExecSQL(true);
    	}
    catch(...){
    	Edit1->Text="ExeqSQL failed! Text was: "+SQLDataSet->CommandText;
    	}
    SQLDataSet->Active=true;
    und versuche dann Values zuzuweisen, bekomme ich die Meldung:
    "Table Schema1.tabley doesnt exist"

    Woran liegt das? Wie kann ich zur Laufzeit die zu nutzende Tabelle umschalten?

    Viele Gruesse,

    Bodo

  • #2
    Hallo,

    die Frage gehört ja wohl primär in das Forum der Programmiersprache und hat erstmal nichts mit MySQL zu tun!

    Um welche Sprache geht es, damit ich es richtig verschieben kann?

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Datenmengen werden mit
      Code:
      SQLDataSet->Active = True
      geöffnet

      Comment


      • #4
        Sorry , dass ich ins falsche Forum gepostet habe.
        Ich wusste nicht, dass es im Delphi Forum noch ein Unterforum fuer dbExpress gibt, da ich es ja mit c++ benutze.

        Die Datenmenge habe ich ja bereits mit

        SQLDataSet->Active = True

        geoeffnet, wie in meinem Code oben zu sehen ist. Aus irgendeinem Grund macht er das aber offensichtlich nicht richtig, oder irgendwas anderes ist noch faul.

        Comment


        • #5
          Was für eine Exception wird geworfen?

          Mal nicht einfach alles wegdrücken mit (...), sondern richtig catchen
          Christian

          Comment


          • #6
            Active = True wendest Du erst an, wenn es schon zu spät ist. (Letzte Zeile Deines Code Schnippsel)
            Zuvor arbeitest Du mit ExecSQL, was man eher für Comannds nehmen sollte, die keine Daten liefern, sondern ändern (insert, update ...)

            Versuch mal SQLDataSet->Open statt Active bzw ExecSQL.

            Außerdem stören vermutlich die persistenten Felder die Du zur Designzeit für tablex angelegt hast. Die versucht er nun für TableY auch zu verwenden.

            Wenn Du dynamische Tabellen verwendest, dann müssen auch die Edits dynamisch gehandelt werden, also die Fields hinter den Edits.
            Als erstes also alle FieldDefs aus dem Dataset löschen.

            Wenn du auf den "Komfort" der persistenten Feldinfos nicht verzichten willst, kannst Du bspw. für jede Table ein eigenes Dataset anlegen und mit Feldinfos bestücken.
            Dann musst Du allerdings dynamisch die Datenanzeige (Grid oder so) auf die verschiedenen Datasets/Datasources umhängen.
            Gruß, defo

            Comment


            • #7
              Hallo Christian & defo!

              @Christian: An dieser Stelle kommt keine Exception, erst wenn ich versuche der Table Daten zuzuweisen (ClientDataSet1->FieldByName("Sigma")-Value=3; ), dann kommt die Fehlermeldung, dass die Table nicht existiert.

              @defo: Ok, dass klingt vernünftig. Am liebsten würde ich gar nix zur Designzeit machen, mir ist aber absolut nicht klar, was ich dann alles initialisieren muss.
              Obigen Codeschnipsel hab ich nur eingeführt, weil ich vermutete, dass es das ist, was die Komponente zur Designzeit gemacht hat.
              Ich hab keine Eigenschaft gefunden, die den Tabellenname spezifiziert. Weiterhin ist mir auch nicht klar wie ich die Felder initialisiere.
              Mit der SQLConnection war ich in der Lage die Tabbellennamen sowie die Feldnamen mir in eine TList übergeben zu lassen.
              Dummerweise weiß ich nicht, wie ich jetzt die Feldnamen setzen kann. Ich find hier TField bzw. TFieldDefs und weiß nicht wie und wohin damit... dasselbe Spiel mit dem Name der Tabelle.
              Vielleicht weiß ja jemand Rat, das wäre furchtbar nett. :-)

              Grüße, Bodo

              Comment


              • #8
                Du musst die Feldnamen nicht unbedingt festlegen. Wenn Du eine Table angibst, werden die Feldnamen automatisch zur Laufzeit bestimmt. So wie es auch zur Designzeit geschieht.
                Am einfachsten wird das klar, wenn Du das Dataset mit einer Datasource zu einem DBGrid verknüpfst.
                Im Grid kannst Du direkt editieren.

                Ich hab leider keinen Builder verfügbar und auch keine Ahnung von C++.

                Was möchtest Du eigentlich erreichen? Welche Version setzt Du ein?
                Wenn Du per Code Feldwerte setzen willst, kannst Du per Fields[index] darauf zugreifen, mit Dataset.fieldbyname kannst Du über den Feldnamen gehen.

                Wenn Du eine GUI mit dynamischen DBEdits haben willst, dann bleibt Dir nichts übrig, als die zur Laufzeit zu erzeugen. Nachdem das Dataset geöffnet ist (open), kannst Du durch die FieldDefs iterieren und Feldnamen, Typen etc auslesen. Anhand dessen kannst Du DBedits erzeugen, Feldnamen und Datenquelle zuweise und sie auf der Form platzieren.

                Diesen Link hab ich auf die Schnelle gefunden, vlt hilft das weiter.
                http://www.baghli.com/bcb_mysql.html
                Gruß, defo

                Comment


                • #9
                  Hallo defo,

                  die Version ist 15.0.3953.35171.
                  Es geht um eine Datenbank für Messergebnisse von Sensoren. Mein Programm verbindet sich mit einem Gerät, dass die Sensoren testet. Von diesem wird auch der Sensortyp übergeben.
                  Verschiedene Sensortypen bedeuten wiederum verschiedene Tables, da hier verschiedene Parameter geprüft werden.
                  Das Programm läuft hier sowohl als auch im Ausland, da verbindet es sich per VPN zu unserem SQL Server.
                  Leider kann ich nicht nur mit Commands arbeiten (INSERT INTO...) da ich auch gezwungen bin bei bestimmten Sensoren Blob's zu verwenden. Das funktioniert soweit nur für die Tabelle, die ich zur Designzeit angegeben habe.

                  Dank des Links hab ich aber die Lösung gefunden:
                  Ich hatte keine SQLTable auf der Form, das ist die einzige Komponente die die Eigenschaft "TableName" hat. Wenn ich diese zur Laufzeit setze geht alles glatt
                  Offensichtlich ist mir das Konzept hinter den dbExpress Komponenten noch nicht so klar, zumindest hab ich kein Plan wozu ich die alle brauche...

                  Auf jeden Fall danke!

                  Comment


                  • #10
                    Ok, eine dämliche Frage hab ich noch....
                    Schreiben klappt jetzt wunderbar, wie kann ich aber später einen spezifischen Datensatz öffnen.
                    Beispiel: In meiner Tabelle sind alle Sensoren indiziert, die Laufvariable ist ein auto inkrement und heisst INDX.
                    Ich will jetzt den Datensatz von INDX=55 öffnen, wie geht das?
                    Muss ich per

                    ClientDataSet1->FindFirst();

                    und dann per for-Schleife mit ->Next() durchlaufen bis ich INDX==55 finde, oder geht das irgendwie eleganter?

                    Grüße, Bodo

                    Comment


                    • #11
                      Wo kommt den das Clientdataset nun her?

                      Im Dataset kannst Du mit >locate< arbeiten.
                      Gruß, defo

                      Comment


                      • #12
                        Ahh, cool!

                        Das ClientDataSet hab ich eingefügt, weil ich BLOB's in die Datnbank streamen muss und in diesem Link zu lesen ist:
                        Don't forget that you must use TSQLClientDataSet instead of TSQLDataSet's to achieve this functionality.
                        Ich habs jetzt gar nicht erst mit dem Dataset probiert, obwohl es auch die CreateStream-Funktionalität hat...

                        Comment

                        Working...
                        X