Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
Zitat:
|
Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
So, ich habe mir alles mal angeschaut und mich entschlossen bei meiner Logik zu bleiben, aber Eure Einwände mit einzubeziehen.
@nahpets: Deine Prozedur hat leider scheinbar auch einige Fehler, jedenfalls liefert Sie nicht immer ein korrektes Ergebis. z.B. bei
SQL-Code:
Aber es geht ja hier nicht um Deine Prozedur, sondern um meine ;-) Trotzdem Danke für Deine Anregungen.Select * /* Daten -- ,daten1 -- ,daten2 -- ,daten3 */ from Deine Anmerkungen hinsichtlich Oracle sind zwar richtig, aber in meinem Fall brauch ich das wohl nicht zu beachten, da ich nur mit dem MS-SQL-Server arbeite. Das mit:
SQL-Code:
ist aber allerdings schon ein Problem. Ich denke aber ich kann das vernachlässigen, zumindest bis zur 1.Meldung eines Kunden, der nach diesem String selektieren möchte ;.)
Select * from tabelle where sqlstring like '%/*%'
Die Kommentare müssen raus, da sie beim Zugriff mit ADO unter gewissen Umständen zu Problemen führen und ich nicht weiß was mein Kunde in seine SQL-Skripte alles reinschreibt. @DeddyH: Deine Prozedur funktioniert hervorragend, ist aber deutlich langsamer (bis zu 10x) als meine, sobald es sich um große SQL-Skripte mit vielen Zeilen handelt, ansonsten ist sie schneller. @Alle Ansonsten noch mal allen vielen Dank. Ich hoffe die Optimierungen (besonders die COPY-Problematik) haben geholfen und ich sehe den Fehler nie wieder in meinen Fehlerprotokollen. Gruß Micha |
Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
Hallo,
Zitat:
Zitat:
Bin ja nicht neugierig :wink:, aber wie sieht jetzt Deine Lösung aus? Stephan |
Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
Hallo,
ich hab nichts weiter mehr geändert, nur die Reihenfolge der Blöcke vertauscht, die überflüssige IF-Anweisung raus und noch ein try/finaly dazu.
Delphi-Quellcode:
Gruß
function DeleteCommentsNeu(const SQLLines:TStringList):Boolean;
var beg,en,i,Laenge : integer; var Temp,begStr,enStr:String; begin Laenge:=Length(SQLLines.Text); SQLLines.BeginUpdate; Try //Mehrzeile Kommentare Temp:=SQLLines.Text; while (pos('/*',Temp) <> 0) and (pos('*/',Temp)>pos('/*',Temp)) do begin beg:=pos('/*',Temp); en:=pos('*/',Temp)+2; begStr:=copy(Temp,1,beg-1); enStr:= copy(Temp,en,Length(Temp)); Temp:=begStr+enStr; end; SQLLines.Text:=Temp; //Einzeilige Kommentare for i:= SQLLines.Count-1 downto 0 do Begin beg:=pos('--',SQLLines[i]); if beg <> 0 then Begin if beg=1 then SQLLines.Delete(i) else SQLLines[i]:=Copy(SQLLines[i],1,beg-1); end; end; Finally SQLLines.EndUpdate; End; Result:=Length(SQLLines.Text)<>Laenge; end; Micha |
Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
Hallo,
einen hätt' ich noch, Du ermittelst die Beginn- und Endepositionen mehrfach, das kann bei großen Datenmengen schon ein bisserl dauern:
Delphi-Quellcode:
Das könnte eventuell schneller werden.
//Mehrzeile Kommentare
Temp := SQLLines.Text; beg := pos('/*',Temp); en := pos('*/',Temp) + 2; while (beg <> 0) and (en > beg) do begin begStr := copy(Temp,1,beg - 1); enStr := copy(Temp,en,Length(Temp)); Temp := begStr + enStr; beg := pos('/*',Temp); en := pos('*/',Temp) + 2; end; SQLLines.Text := Temp; Stephan |
Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
Dazu fällt mir noch was ein, ich schreib mal Kommentare in den Code...
Zitat:
|
Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
"beg" kann nicht 0 sein, daß wird doch schon in der WHILE-Bedingung abgefangen.
Das mit dem PosEx werde ich noch ändern, Danke für den Hinweis. Gruß Micha |
Re: Fehlermeldung "Zu wenig Arbeitsspeicher"
Du hast Recht, ich hatte mir nur das Snippet im letzten Post angeschaut, da ist die umfassende Whileschleife ja nicht mit drin, deswegen hab ichs übersehen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz