Problem mit langen SQL-Statements
Jürgen
- asp.net
0 Mulder0 Mulder0 Jürgen0 Frank0 Chief Brodie0 Frank0 Chief Brodie0 Jürgen
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
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. ;-)
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).
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.
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,
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
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
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
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