Announcement

Collapse
No announcement yet.

SQL-Update mit Programmvariablen, Syntaxproblem

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

  • SQL-Update mit Programmvariablen, Syntaxproblem

    Hallo und guten Tag!
    Mein Problem ist der syntaktische Aufbau einer SQL-Query, die eine in meinem Programm angelegte Variable übernehmen, und deren Inhalt, per Update-Anweisung, in ein Dateifeld schreiben soll.

    Zielsetzung:
    Die Variable SiBu wird als Programm-Variable aus einem normalen Edit-Feld im Programm-ablauf befüllt. Der Eintrag wird dann in einer String-Variablen S abgelegt. An die Parameter-Variable :SiBu wird der Inhalt von S mit einem konstanten String ergänzt, und übergeben.
    Danach soll per Query1.SQL.Text:= Update-Query………..das Feld eines DatenbankTable mit dem Inhalt des Parameters überschrieben werden. Der Parameter-String beinhaltet Pfadangaben, also auch mehrfach das Zeichen \ (Backslash).

    Bisherige Versuche:

    1. MyQuery1.Close;
    MyQuery1.Params.CreateParam(ftString,':SiBu',ptOut put);
    MyQuery1.ParamByName(':SiBu').AsString:= S + 'Sicherung Buchung\';
    In den überwachten Ausdrücken werden die Daten in den Parameter :SiBu übernommen
    MyQuery1.SQL.Text:= 'Update hb_sql.Pfade set SichernBuchenMySQL := :SiBu';
    Aber auch
    MyQuery1.SQL.Text:= 'Update hb_sql.Pfade set SichernBuchenMySQL = :SiBu';
    MyQuery1.Execute;

    Ergebnis
    Das Datenfeld wird in seinem Eintrag auf NULL gesetzt.
    Immerhin keine Fehlermeldung. Aber trotzdem falsch.

    Dann habe ich im Forum-Beitrag Syntaxproblem bei SQL.Add eine Problemlösung gesehen, die ich übernehmen wollte.

    2. MyQuery1.Close;
    MyQuery1.SQL.Text:=
    'MyQuery1.Insert into hb_sql.Pfade (SichernBuchenMySQL) values (:SiBu);' +
    'MyQuery1.ParamByName(":SiBu").datatype:=ftString; ' +
    'MyQuery1.ParamByName(":SiBu"):= S + "Sicherung Buchung\";';
    MyQuery1.Execute;

    Ergebnis: Siehe Aufnahme1

    Danach habe ich eine weitere Syntaxänderung vorgenommen.
    3. MyQuery1.Params.CreateParam(ftString,'SiBu',ptOutp ut);
    MyQuery1.ParamByName('SiBu').AsString:= S + 'Sicherung Buchung\';
    MyQuery1.SQL.Text:= '"Update hb_sql.Pfade set SichernBuchenMySQL =''''+SiBu"';
    MyQuery1.Execute;

    Ergebnis: Siehe Aufnahme 2

    Alles, was ich im Thema bisher im Netz gelesen und an Büchern gewälzt habe, ging immer von Datenbankverbindungen mit Table´n aus, oder vom SQL- Befehlszeilen-Editor.
    Das mein Befehls-Konstrukt nicht so ganz falsch sein kann, zeigte mir der nachfolgende Befehlstext, der einwandfrei ausgeführt wird. Allerdings mit einer SQL-Systemvariablen.

    MyQuery1.Close;
    //Nächste Anweisung überschreibt im Buchungen-Tabel DaJar mit aktuellem Jahr
    MyQuery1.SQL.Text:= 'Update hb_sql.Buchung set DaJar = YEAR(CURDATE())';
    MyQuery1.Execute;

    Ergebnis: Alles korrekt.

    Wer kann mir in diesem Thema aufs Pferd helfen? Ich danke dafür!
    Attached Files
    Zuletzt editiert von Heinz-Jürgen Klawuhn; 18.08.2011, 16:08.

  • #2
    Variante 2 sieht am vielversprechendsten aus, ist aber so wie angegeben noch ein wenig durcheinander.
    Man muss die SQL - Anweisungen sauber von den Delphi - Anweisungen trennen, etwa so (ungetestet):

    [highlight=pascal]
    MyQuery1.Close;
    //1. SQL Anweisung mit Parametern zuweisen
    MyQuery1.SQL.Text:='Insert into hb_sql.Pfade (SichernBuchenMySQL) values (:SiBu)';
    //2. Parameter befuellen
    MyQuery1.ParamByName('SiBu').datatype:=ftString;
    MyQuery1.ParamByName('SiBu'):= S + 'Sicherung Buchung\';
    MyQuery1.Execute;
    [/highlight]

    Btw: Welchen Typ hat MyQuery1 oder - welche Art des Zugriffs nutzt du?

    Viel Erfolg
    Tino
    Ich habs gleich!
    ... sagte der Programmierer.

    Comment


    • #3
      Danke für die rasche Antwort!

      Versuch 2 geändert:

      MyQuery1.ParamByName('SiBu'):= S + 'Sicherung Buchung\';

      Ergebnis: Compilerfehler E2010 Incompatible types: 'TDAParam' and 'string'

      Geändert in:
      MyQuery1.ParamByName('SiBu').AsString:= S + 'Sicherung Buchung\';

      Ergebnis: Der Compiler akzeptiert die Zeile, aber die SQL-Ausführung ergibt eine Fehlermeldung. Siehe Aufnahme 3.

      Die Frage nach dem MyQuery-Typ, bzw. den Zugriff hoffe ich richtig verstanden zu haben.
      Es handelt sich um eine MyDAC-Komponente in der Bezeichnung MySQL-Access. Sie ist mit der in den Befehlen genannten Datenbank im MySQL-Server über die Komponente MyConnection verbunden. Letztere Hat alle Verbindungsdaten zum MySQL-Server und zur Datenbank.
      Attached Files

      Comment


      • #4
        Ok, das sah auf den ersten Blick auch so aus wie die Devart - Komponenten (MyDac).

        Setze bitte einmal MyQuery.Debug:=True;

        Dann sieht man das SQL - Statement, welches schließlich an die Datenbank gesendet wird.
        Entweder, man sieht dann gleich, wo das Problem ist oder man kopiert sich das Statement einmal in einen Queryeditor für die Datenbank (z.B. phpMyAdmin) und begibt sich dort auf die Fehlersuche.

        Ich vermute, dass es irgendwo zuviele oder falsche Anführungszeichen in den Strings gibt.
        Ich habs gleich!
        ... sagte der Programmierer.

        Comment


        • #5
          Ich muss mich entschuldigen, dass ich nicht immer sofort antworte.
          Drei Projekte liegen mir in der Tastatur und wollen zur Ablieferungsreife gebracht werden.
          Deshalb gebe ich das Thema jetzt auch auf. Ich habe schon vor meiner Forumanfrage Stunden mit dem Thema zugebracht.

          Ich gebe auf, nicht ohne mich noch einmal für Deine tätige Mithilfe herzlich zu bedanken!

          Deine Frage nach dem Zugriff hat bei mir das Aha-Erlebnis ausgelöst.

          Das Problem kann man ja auch konventionell über Table.Edit usw. lösen.
          So habe ich es jetzt auch gemacht. Es tut jetzt exakt das, was meine Zielsetzung war.

          Deine Anregung habe ich aufgegriffen und den Query-Debug direkt über die Komponente, die bei Doppelklick auch ein kompletter Querybrauwser ist, laufen gelassen. Die Debug-Ausgabe war ein enttäuschender blanker Frame.

          Darüber hinaus habe ich jetzt eine eigene Unit erstellt, nur um das Problem später weiter massieren zu können. Das Gesamtprogramm, in dem die Statements stehen ist umfangreich und wurde durch meine ständige Umschreiberei immer unübersichtlicher. Und es war, bis auf diesen Problemfall fast fertig. Jetzt ist es fertig.

          Ein schönes Wochenende !

          Comment

          Working...
          X