Entwickler-Ecke
Datenbanken - Begrenzte Ressourcen für Query.Update
kiwicht - Di 28.01.03 21:23
Titel: Begrenzte Ressourcen für Query.Update
N´abend...
ist es vielleicht möglich, das ich bei Query Update
insgesamt nur rd. 25 Felder angeben darf in denen ein Wert geändert wird?
Oder bezieht sich das vielleicht sogar auf alle SQL-Befehle, das die auf eine bestimmte Zeilen-Anzahl, was 'Add' betrifft, begrenzt sind?
Zum besseren verständnis:
-------------------------------
2 Datenbanken - Einmal Vorgangsbuch, einmal History.
In der History werden die Datensätze gespeichert, die jemand im Vorgangsbuch geändert hat, und zwar so wie sie ursprünglich waren.
Beide Datenbanken haben, logisch, die gleichen Felder, knapp 25.
Wenn ich jetzt also für beide Datenbanken
Quelltext
1: 2: 3: 4:
| with Query do begin Clear; Add('UPDATE vorgbuch'); Add('SET .... = .... '); <- und das halt 25 mal, je Datenbank. |
entsprechend die Daten in die Felder schreiben will, erhalt ich bei der Ausführung, wenn das direkt unter Delphi läuft:
| Zitat: |
"Project .....exe raised expception class EDBEngineError with message:
"Type missmatch in expression" Process stopped....."
|
und wenn ich das Programm selbstständig ausführe erhalt ich:
| Zitat: |
"Bei der Eingabe der Suchkriterien ist ein Fehler aufgetreten!"
|
Also erstmal zwei völlig verschieden Meldungen, und sie erscheinen nur (!) wenn ich das Programm ausführe, und die gewisse Operation mehr als 3, 4 mal aktiviere....
ihr könnt vielleicht verstehen , das ich jetzt doch etwas sehr verstört bin, weil ich da absolut nicht kapiere wieso weshalb warum.. ich hau mir das problem jetzt schon seit heut mittag um die ohren, komm aber zu keiner lösung... :( :roll:
vielleicht könnt ihr mir helfen...
mfg
kiwicht
smiegel - Di 28.01.03 22:20
Hallo,
wie sehen Deine Set-Parameter im Detail aus?
Werden etwa in der Parameterliste falsche Datentypen übergeben, z.B. String statt Integer?
kiwicht - Di 28.01.03 22:56
Hi
es werden nur Strings übergeben, aber damit hatte ich bisher noch kein Problem... zumal es ja erst klappt, und dann ne weile garnicht.
Jedenfalls sind sie alle schematisch wie dieser:
Quelltext
1: 2: 3: 4:
| UPDATE datenbank SET feld1 = ' + variable1); , feld2 = ' + variable2); , feld3 = ' + variable3); |
und dann halt Query.ExecSQL;
Moderiert von
Tino: Code-Tags hinzugefügt.
smiegel - Di 28.01.03 23:41
Hallo,
es ist schwierig aus Deinen Code-Fragmenten den Fehler herauszufinden.
Poste doch einmal den Code den Benutzt. Fügst Du nach jeder Set-Zuweisung ein Komma ein, bis auf die letzte?
Etwa in der Form:
Quelltext
1: 2: 3: 4:
| Add('SET Feld1='+variable1+', '); Add('Feld2='+variable2+', '); ... Add('Feld25='+variable25); |
kiwicht - Mi 29.01.03 09:46
stimmt.. ich wollte halt vermeiden das das forum so zu-getextet wird mit code en masse :roll:
also, dann ma los, und nich erschrecken: :twisted:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107:
| procedure TForm1.Button1Click(Sender: TObject); begin
QueryVorgbuch.Active := True; QueryVorgbuch.Active := False;
Vorgang := QuotedStr(FVEvorgang.Text); // [...] und 29 weitere zuweisungen, alle nach dem gleichen Prinzip
with QueryVorgbuch.SQL do begin Clear; Add('UPDATE vorgbuch '); Add('SET vorgang = ' + Vorgang); Add(', kndcd = ' + Vkndcd); //[...] die in der Mitte hab ich mal rausgelassen, sind aber vom gleichen // Syntax-Schema wie das obere Add(', kfz = ' + Vkfz); Add('WHERE lfdnr = ' + LfdNrToEdit); end; QueryVorgbuch.ExecSQL;
// da ich das Problem hatte, das mein Prog manchmal abstürzt, hab ich // UPDATE gesplittet... hier der Rest with QueryVorgbuch.SQL do begin Clear; Add('UPDATE vorgbuch '); Add('SET provan = ' + Vprovan); Add(', bemerkung1 = ' + Vbemerkung1); [...] Add(', bemerkung7 = ' + Vbemerkung7); Add('WHERE lfdnr = ' + LfdNrToEdit); end; QueryVorgbuch.ExecSQL;
////////////////////////////// mal kommt die fehlermeldung hier...
// Hier Lese ich die Letzte Lfd nr. aus der History, und inkrementiere // mit 1.... with QueryHistory.SQL do begin Clear; Add('SELECT * FROM history'); end; QueryHistory.Active :=True; QueryHistory.Last; LfdNrHistory := QueryHistory.FieldByName('lfdnr').AsString; if LfdNrHistory = '' then LfdNrHistory := '1' else LfdNrHistory := IntToStr(StrToInt(LfdNrHistory) + 1);
// hier ermittle ich fuer die history mein aktuelles datum aend_datum := FormatDateTime('dd"."mm"."yyyy', Date); aend_datum := QuotedStr(aend_datum); QueryHistory.SQL.Clear; QueryHistory.SQL.Add('INSERT INTO history (lfdnr,vorgang )'); QueryHistory.SQL.Add('VALUES (' + LfdNrHistory + ',' + Vorgang + ')'); QueryHistory.ExecSQL;
// und dann schließlich werden die alten Daten in der History gespeichert with QueryHistory.SQL do begin Clear; Add('UPDATE history '); Add('SET kndcd = ' + Hkndcd); Add(', termin = ' + Htermin); [...] Siehe Vorgangs-Update... Add(', provan = ' + Hprovan); Add('WHERE lfdnr = ' + LfdNrHistory); end; QueryHistory.ExecSQL;
// und wieder gesplittet with QueryHistory.SQL do begin Clear; Add('UPDATE history '); Add('SET bemerkung1 = ' + Hbemerkung1); Add(', bemerkung2 = ' + Hbemerkung2); [...] Add(', aend_dat = ' + aend_datum); Add('WHERE lfdnr = ' + LfdNrHistory); end; QueryHistory.ExecSQL;
//////////////////////////// ............oder fehlermeldung halt hier.....
// damit gleich nach fertigstellung der aktuelle vorgang angezeigt wird, // kommt jetzt folgender filter QueryVorgbuch.SQL.Clear; QueryVorgbuch.SQL.Add('SELECT * FROM vorgbuch WHERE lfdnr = ' + LfdNrToEdit); QueryVorgbuch.Open;
// die history.... QueryHistory.SQL.Clear; QueryHistory.SQL.Add('SELECT * FROM history'); QueryHistory.Open; QueryHistory.Last;
// jetzt noch n paar irrelevante, so glaub ich, programm-funktionen TabFirmendt.TabVisible := True; TabSchadort.TabVisible := True; TabHistory.TabVisible := True;
TabsAktualisieren;
FormVorgbuchEdit.SendToBack; FormVorgbuch.Height := 328;
VorgangEdit := False;
end; |
sämtliche variablen werden vorher (global) als strings deklariert.... sonst gibts nichts weiter zu sagen... glaub ich
vielen dank
kiwicht
smiegel - Mi 29.01.03 15:44
Hallo kiwicht,
leider kann ich an Deinem Code nicht erkennen, was da falsch sein soll.
Wenn ich mich noch recht erinnere (weiss leider nicht mehr, wo ich die Info gelesen habe :-( ), hat DBase in Verbindung mit DML (UPDATE, INSERT, SET, ...) Probleme.
Eine andere Fehlerquelle könnte QuotedStr sein. Da diese Funktion, lt. Delphi-Hilfe nur halbe (') Anführungszeichen hinzufügt.
Versuche es doch einmal mit AnsiQuotedStr und Gänsefüsschen (").
Quelltext
1: 2: 3: 4:
| ... // statt Vorgang :=QuotedStr(FVEvorgang.Text); Vorgang:=AnsiQuotedStr(FVEvorgang.Text, '"'); ... |
kiwicht - Mi 29.01.03 17:47
Danke, das werd ich aufjedenfall natûrelement mal probieren, aber wundern tuts mich schon... mal klappts, dann mal wieder nicht... :( obwohl ich nichts geändert hab... nun ja .. ich meld mich wenn ich neuigkeiten hab....
danke erstmal
mfg
bis11 - Mi 29.01.03 18:18
Hi kiwicht,
Du hast doch gesagt, das Du nur Strings in Deine beiden Datenbanken reinschreibst oder ? Wenn ja, warum wird dann der String den Du übergibst nicht mit einem einfachen Hochkomma in den SQL-Befehl reingeschrieben ?
kiwicht - Mi 29.01.03 20:41
ähm... keine Ahnung, ich dachte so geht das nicht
so versteh ich jetzt das was du sagst:
Quelltext
1:
| Add('SELECT * FROM databank WHERE feld1 = 'mystring''); |
und so mach ich das ja für gewöhnlich:
Quelltext
1: 2: 3: 4: 5:
| MyString := QuotedStr(MyString); // aus inhalt wird also "inhalt" Add('SELECT * FROM databank WHERE feld1 = + ' mystring); das gleiche wäre: Add('SELECT * FROM databank WHERE feld1 = "inhalt" '); |
ich dacht eigentlich bisher, mein Code wäre Regel-Konform... :?
kiwicht - Mi 29.01.03 20:53
also, mit
AnsiQuotedStr
hab ichs probiert... genau das gleiche.
Ich hab jetzt aber mal zum Testen einfach alles rausgenommen, was KEINEN string sondern Datum´se oder Integer in die DB schreibt.... es klappt (erstmal).. ich werd mich also nochmal der Übergabe von Integern und Daten an SQL widmen..
vielen herzlichen Dank für eure Hilfe..
mfg
kiwicht
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!