Jürgen: Problem mit langen SQL-Statements

Hallo!

Ich habe ein Problem bei großen Formular-Daten.

Wenn Ich z. B. ein Textarea-Formular-Feld mit 5000 Zeichen in eine FoxPro-Datenbank mit INSERT eintragen will, kommt die Fehlermeldung:
"Compiled code to long for this line".

Das Problem ist, dass foxpro-odbc eine Beschränkung bei der Länge von SQL-Statements hat, das heißt

insert into beitrag (text) values ('<z. B. wert mit 5000 Zeichen>')

verursacht den Fehler.

Geholfen wäre mir, wenn ich direkt mit Variablen arbeiten könnte, also:

ytext = request.form("text")
insert into beitrag (text) values (ytext)

Nur so funktioniert es bekanntlich nicht. Wer kennt eine Lösung?

Jürgen

  1. Wenn Ich z. B. ein Textarea-Formular-Feld mit 5000 Zeichen in eine FoxPro-Datenbank mit INSERT eintragen will, kommt die Fehlermeldung:
    "Compiled code to long for this line".

    Das Problem ist, dass foxpro-odbc eine Beschränkung bei der Länge von SQL-Statements hat, das heißt

    insert into beitrag (text) values ('<z. B. wert mit 5000 Zeichen>')

    verursacht den Fehler.

    Dann hilft Dir nur ein anderer Treiber.

    Geholfen wäre mir, wenn ich direkt mit Variablen arbeiten könnte, also:

    ytext = request.form("text")
    insert into beitrag (text) values (ytext)

    Nein, denn letztlich muß ja das komplette SQL an die DB geschickt werden, ein solches "Verkürzen" wäre rein künstlich.
    Sonst würde man ja auch prima eine 1000:1 Kompression realisieren können. ;-)

    1. Dann hilft Dir nur ein anderer Treiber.

      Korrigiere mich selbst:

      Natürlich geht es so:

      INSERT INTO tabelle (text) VALUES ('erste 2500 Zeichen');

      Dann ID des neuen Datensatzes holen und

      UPDATE tabelle SET text = text || 'nächste 2500 Zeichen'
      WHERE id = $gerade_geholte_id$

      (die "||" ist Oracle-Syntax, mußt halt gucken, wie Anhängen bei FoxPro geht).

      1. Dann hilft Dir nur ein anderer Treiber.

        Korrigiere mich selbst:

        Natürlich geht es so:

        INSERT INTO tabelle (text) VALUES ('erste 2500 Zeichen');

        Dann ID des neuen Datensatzes holen und

        UPDATE tabelle SET text = text || 'nächste 2500 Zeichen'
        WHERE id = $gerade_geholte_id$

        (die "||" ist Oracle-Syntax, mußt halt gucken, wie Anhängen bei FoxPro geht).

        Hallo Mulder,

        vielen Dank für Dein Posting. An sowas ähnliches habe ich bereits spekuliert.

        Warscheinlich wird es nur so funktionierten, denn in der MS KnowLedge wird dieses Problem mit Variablen gelöst.

        1. Hi,

          schon mal mit dem ADODB.Recordset Objekt probiert und den dazugehörigen Methoden: .AddNew und Update ???

          Dann brauchst du keine SQL-Insert-Statements schreiben
          sondern kannst direkt einem Feldobjekt den Wert zuweisen:

          myRS.AddNew
          myRS("feld").Value = deineVariable
          myRS.Update

          Gruß, Frank

          1. Hi,

            schon mal mit dem ADODB.Recordset Objekt probiert und den dazugehörigen Methoden: .AddNew und Update ???

            Dann brauchst du keine SQL-Insert-Statements schreiben
            sondern kannst direkt einem Feldobjekt den Wert zuweisen:

            myRS.AddNew
            myRS("feld").Value = deineVariable
            myRS.Update

            Gruß, Frank

            hi!
            genau das ist die lösung!
            wichtig ist, dass du das recordset mit AdUseClient öffnest, um schreiben zu können.

            z.b.:
            conn = 'deine DB-connection
            SQL = "SELECT ... FROM ..."
            Set objRS = Server.CreateObject("ADODB.Recordset")
            objRS.Open SQL, conn, 3, 3

            grtz
            chief

            1. z.b.:
              conn = 'deine DB-connection
              SQL = "SELECT ... FROM ..."
              Set objRS = Server.CreateObject("ADODB.Recordset")
              objRS.Open SQL, conn, 3, 3

              Hi...

              nur, daß adUseClient anders eingestellt werden muß...

              welche von den 4 Parametern ist den adUseClient ???

              denn die beiden Parameter hinter conn stehen für:

              sql,conn,adOpenStatic (3),adLockOptimistic (3)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
              die Cursor Location stellt man nach der Instanzierung des Recordsets ein:

              => objRS.CursorLocation = adUseClient|adUseServer

              darüber hinaus hat "adUseClient" nichts mit "schreiben können" zu tun

              zum Nachlesen sind die Parameter im msdn sehr gut beschrieben...

              "Nix für ungut..."

              tschau, schönen Arbeitstag noch
              Frank

              1. nur, daß adUseClient anders eingestellt werden muß...

                welche von den 4 Parametern ist den adUseClient ???

                denn die beiden Parameter hinter conn stehen für:

                sql,conn,adOpenStatic (3),adLockOptimistic (3)
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                die Cursor Location stellt man nach der Instanzierung des Recordsets ein:

                => objRS.CursorLocation = adUseClient|adUseServer

                darüber hinaus hat "adUseClient" nichts mit "schreiben können" zu tun

                zum Nachlesen sind die Parameter im msdn sehr gut beschrieben...

                "Nix für ungut..."

                tschau, schönen Arbeitstag noch
                Frank

                hast natürlich recht ;-)

                ich meinte auch nicht "adUseClient" sondern "adLockOptimistic"

                war ein schnell-verschreiber meinerseits.

                ebenfalls schönen arbeitstag :-)

                grtz
                chief

                1. Hallo!

                  Das mit dem Record-Set funktioniert einwandfrei. Nur was mache ich beim Ändern eines Datensatzes mit Update?

                  Jürgen

                  nur, daß adUseClient anders eingestellt werden muß...

                  welche von den 4 Parametern ist den adUseClient ???

                  denn die beiden Parameter hinter conn stehen für:

                  sql,conn,adOpenStatic (3),adLockOptimistic (3)
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  die Cursor Location stellt man nach der Instanzierung des Recordsets ein:

                  => objRS.CursorLocation = adUseClient|adUseServer

                  darüber hinaus hat "adUseClient" nichts mit "schreiben können" zu tun

                  zum Nachlesen sind die Parameter im msdn sehr gut beschrieben...

                  "Nix für ungut..."

                  tschau, schönen Arbeitstag noch
                  Frank

                  hast natürlich recht ;-)

                  ich meinte auch nicht "adUseClient" sondern "adLockOptimistic"

                  war ein schnell-verschreiber meinerseits.

                  ebenfalls schönen arbeitstag :-)

                  grtz
                  chief