Lösungsmöglichkeiten Error: Incorrect token followed by „:“ (SQL)

10. Mai 2018 - Lesezeit: 2 Minuten

 

Sprachen: PHP, C++, Delphi,… alles womit man auf SQL Datenbanken zugreifen kann.

Dieser Artikel gibt einen kleinen Lösungsvorschlag zur Fehlermeldung:

„ Incorrect token followed by “:“ “ (wobei by auch ein anderes Zeichen sein kann)

Weiterlesen


[Pascal/Delphi] HTML entfernen - Geschwindigkeitstest mit verschiedenen Funktionen

9. Mai 2018 - Lesezeit: 7 Minuten

(Entstammt aus einen Forenbeitrag unter Delphipraxis. Hier die Zusammenfassung:)

 

Da viele Leute auf diese Funktionen hier zurückgreifen, möchte ich noch ergänzen.

Unter dem Geschwindigkeitsaspekt habe ich gemessen:

dwStrips benötigte im Durchschnitt 77,6 ms
StripTags benötigte im Durchschnitt 56,3 ms
CleanHTMLTags benötigte im Durchschnitt 4,6 ms

Für kleinere Anwendungen oder wenigen Anrufen spielt es keine Rolle welche Funktion man nimmt. Möchte man aber größere Texte, öfters Texte durchlaufen lassen sollte man CleanHTMLTags nehmen. dwStrips zieht sich schnell in die Länge.
 

Weiterlesen


[Pascal/Delphi] Fehlersuche bei steigenden Arbeitsspeicher Run Time Error 223

8. Mai 2018 - Lesezeit: ~1 Minute

Mit StringList wird bei jedem .add etwas in den Speicher geschrieben. Mit .free gibt man den Speicher wieder frei.

ABER wenn der Arbeitsspeicher trotzdem weiter ansteigt, hat man entweder ein .free vergessen oder etwas übersehen.

Wenn ein .free in einer Funktion gemacht wurde, zuvor aber eine Bedingung gemacht wurde z. B:

if (x = y) then exit;

Und das .free danach niemals aufgerufen wird... steigt der Speicher an. Besonders dramatisch wird soetwas, wenn man solch eine Funktion in einer Schleife durchlaufen lässt. Weil dann können schnell aus wenigen KB mehrere hundert MB werden.

Deshalb:

Bei .create's nach .free's suchen und zusätzlich nach vorzeitigen "exit" prüfen evtl. auch nach "break"/"continue" u. ä. !!

Bei dynamischen Arrays kann ich mir ein ganz ähnliches Problem vorstellen.

Wenn man das richtig gemacht hat, durfte das Programm je nach Ablauf keinen dauerhaft steigenden Arbeitsspeicher verursachen, wobei Schwankungen nach oben und unten (!) möglich sind.

Sinnvoll scheint hier auch die konstante Anwendung von

try and finally zu sein, um dieses Problem zu vermeiden (im finally Bereich dann ein x.free.).


Lazarus mit Packages erneut installieren

7. Mai 2018 - Lesezeit: ~1 Minute

(Dieser Artikel ist eine Zusammenfassung eines meiner Beiträge aus einem Internetforum)

Wie man eine bestehende Lazarus Packages auf einen neuen Rechner überträgt (oder erneut aufspielen möchte); Ohne die nervenaufreibende einzelne Installation der Packages.

Beschrieben für Win 7:

- Zuerst natürlich den normalen Lazarus Ordner mit IDE usw. auf die neue Platte oder Laufwerk kopieren.

- Den alten Ordner primary config path (hier zu finden C:\Users\USERNAME\AppData\Local\lazarus) auf Laufwerk C habe ich gefunden und auf den neuen kopiert (am besten selbst per Hand anlegen, falls nicht vorhanden. Wurde Lazarus zuvor mal gestartet, erstellt Lazarus den Ordner).

- Die Pfade habe ich mit lazarus.exe -setup geändert.

- Und danach im fpc Verzeichnis noch die Pfade in der fpc.cfg auf den neuen Laufwerksbuchstaben geändert. (Tipp: In Notepad mit Suchen & Ersetzen arbeiten! Backup von der Datei jedoch vorher machen für den Fall der Fälle)

Danach Lazarus samt aller Packages starten und das Projekt erfolgreich compilieren.

 


[Pascal/Delphi/Sqlite3/Zeos] Kleiner Geschwindigkeitstest von Insert

6. Mai 2018 - Lesezeit: 14 Minuten

Mich hat es interessiert, wie sich die Geschwindigkeiten von

Inserts bei SQLite3 und Zeos

verändern, mit unterschiedlichen "schreibweisen"; Und habe festgestellt, dass es durchaus erhebliche Unterschiede geben kann.

 


Ich habe den Test mehrmals durchlaufen, auch mit unterschiedlichen Zahlen und habe folgende Durchschnittszeiten bekommen:

Hier die sortierte Ergebnisse:

Benötigte Zeit % |  Funktionsname
48,57                  Test2 (Insert mit .add(Format(... siehe auch Test5 )                
17,62                  Test1 (Insert und exec... direkt hintereinander)
16,88                  Test8 (Wie Test7 + Prepare)
16,46                  Test7 (Nur ParamByName in Schleife)
0,22                   Test4 (Insert; in Transaction, außerhalb der Schleife)
0,21                   Test3 (Insert; in Transaction, innerhalb der Funktion)
0,03                   Test9 (wie 8 + Transaction)
0,01                   Test6 (Wie Test5 mit Transaction)
0,01                   Test5 (Direkt, Ohne .ParamByName.)



17,62                  Test1 (Insert und exec... direkt hintereinander)
48,57                  Test2 (Insert mit .add(Format(... siehe auch Test5 )                
0,21                   Test3 (Insert; in Transaction, innerhalb der Funktion)
0,22                   Test4 (Insert; in Transaction, außerhalb der Schleife)
0,01                   Test5 (Direkt, Ohne .ParamByName.)
0,01                   Test6 (Wie Test5 mit Transaction)
16,46                  Test7 (Nur ParamByName in Schleife)
16,88                  Test8 (Wie Test7 + Prepare)
0,03                   Test9 (wie 8 + Transaction)

 

(Funktion 2 hat im Test nicht teilgenommen. Ich war der Annahme, es ist auch mögliche mehrere Inserts mit add zu schreiben, doch das ist so nicht möglich.)

Hier die verschiedene Abschnitte:

 


function test1(testzahl: integer): string;
var
  a: integer;
begin
  for a := 1 to testzahl do
  begin
    Form1.ZQuery1.SQL.Text := 'Insert into daten2 (zahl) values (:zahl)';
    Form1.ZQuery1.ParamByName('zahl').AsInteger := a;
    Form1.ZQuery1.ExecSQL;
  end;
end;



function test2(testzahl: integer): string; //nahpets
var
  a: integer;
begin

  Form1.ZQuery1.SQL.Clear;
  for a := 1 to testzahl do
  begin
    Form1.ZQuery1.SQL.add(Format('Insert into daten2 (zahl) values (%d);', [a]));
  end;
  Form1.ZQuery1.ExecSQL;

end;


function test3(testzahl: integer): string;
var
  a: integer;
begin
  Form1.ZQuery1.SQL.Text := 'begin transaction;';
  Form1.ZQuery1.ExecSQL;

  Form1.ZQuery1.SQL.Text := '';
  for a := 1 to testzahl do
  begin
    Form1.ZQuery1.SQL.Text := 'Insert into daten2 (zahl) values (:zahl);';
    Form1.ZQuery1.ParamByName('zahl').AsInteger := a;
    Form1.ZQuery1.ExecSQL;
  end;


  Form1.ZQuery1.SQL.Text := 'Commit;';
  Form1.ZQuery1.ExecSQL;
end;




function test4(testzahl: integer): string;
var
  a: integer;
begin

  Form1.ZQuery1.SQL.Text := '';
  for a := 1 to testzahl do
  begin
    Form1.ZQuery1.SQL.Text := 'Insert into daten2 (zahl) values (:zahl);';
    Form1.ZQuery1.ParamByName('zahl').AsInteger := a;
    Form1.ZQuery1.ExecSQL;
  end;

end;



function test5(testzahl: integer): string; //mensch72
var
  a: integer;
begin

  Form1.ZQuery1.SQL.Clear;
  for a := 1 to testzahl do
  begin
    Form1.ZQuery1.SQL.Text := 'Insert into daten2 (zahl) values (' + IntToStr(a) + ')';
  end;
  Form1.ZQuery1.ExecSQL;

end;


function test6(testzahl: integer): string;
var
  a: integer;
begin
   Form1.ZQuery1.SQL.Text := 'begin transaction;';
  Form1.ZQuery1.ExecSQL;

  Form1.ZQuery1.SQL.Clear;
  for a := 1 to testzahl do
  begin
    Form1.ZQuery1.SQL.Text := 'Insert into daten2 (zahl) values (' + IntToStr(a) + ')';
  end;
  Form1.ZQuery1.ExecSQL;

  Form1.ZQuery1.SQL.Text := 'Commit;';
  Form1.ZQuery1.ExecSQL;

end;



function test7(testzahl: integer): string;
var
  a: integer;
begin
  Form1.ZQuery1.SQL.text := 'Insert into daten2 (zahl) values (:zahl);';

  for a := 1 to testzahl do begin
      Form1.ZQuery1.ParamByName('zahl').AsInteger := a;
      Form1.ZQuery1.ExecSQL;
  end;

end;

function test8(testzahl: integer): string;
var
  a: integer;
begin
  Form1.ZQuery1.SQL.text := 'Insert into daten2 (zahl) values (:zahl);';
  Form1.ZQuery1.Prepare;

  for a := 1 to testzahl do begin
      Form1.ZQuery1.ParamByName('zahl').AsInteger := a;
      Form1.ZQuery1.ExecSQL;
  end;
end;



function test9(testzahl: integer): string;
var
  a: integer;
begin
  Form1.ZQuery1.SQL.Text := 'begin transaction;';
 Form1.ZQuery1.ExecSQL;

  Form1.ZQuery1.SQL.text := 'Insert into daten2 (zahl) values (:zahl);';
  Form1.ZQuery1.Prepare;

  for a := 1 to testzahl do begin
      Form1.ZQuery1.ParamByName('zahl').AsInteger := a;
      Form1.ZQuery1.ExecSQL;
  end;

  Form1.ZQuery1.SQL.Text := 'Commit;';
 Form1.ZQuery1.ExecSQL;
 
 
 
 //Starts....

  Form1.ZQuery1.SQL.Text := 'Delete from daten2';
  Form1.ZQuery1.ExecSQL;
  test1(testzahl);

  Form1.ZQuery1.SQL.Text := 'Delete from daten2';
  Form1.ZQuery1.ExecSQL;
  test2(testzahl);

  Form1.ZQuery1.SQL.Text := 'Delete from daten2';
  Form1.ZQuery1.ExecSQL;
  test3(testzahl);



  Form1.ZQuery1.SQL.Text := 'Delete from daten2';
  Form1.ZQuery1.ExecSQL;
  Form1.ZQuery1.SQL.Text := 'begin transaction;';
  Form1.ZQuery1.ExecSQL;
  test4(testzahl);
  Form1.ZQuery1.SQL.Text := 'Commit;';
  Form1.ZQuery1.ExecSQL;


  Form1.ZQuery1.SQL.Text := 'Delete from daten2';
  Form1.ZQuery1.ExecSQL;
  test5(testzahl);


  Form1.ZQuery1.SQL.Text := 'Delete from daten2';
  Form1.ZQuery1.ExecSQL;
  test6(testzahl);


  Form1.ZQuery1.SQL.Text := 'Delete from daten2';
  Form1.ZQuery1.ExecSQL;
  test7(testzahl);


  Form1.ZQuery1.SQL.Text := 'Delete from daten2';
  Form1.ZQuery1.ExecSQL;
  test8(testzahl);


  Form1.ZQuery1.SQL.Text := 'Delete from daten2';
  Form1.ZQuery1.ExecSQL;
  test9(testzahl);

 

Test2,1,8,7: Sind deutlich langsam. Sollte man so keinesfalls verwenden, wenn Geschwindigkeit ein Kriterium sein soll.
Nur ParamByName in der schleife (Test7) ergibt für sich keinen Geschwindigkeitsvorteil, auch nicht mit Prepare verbunden (Test8); Und ergibt nur Sinn, wenn man diese mit Transaction verbindet (Test9). Mit Format() (Test2) sollte man bzgl. Schnelligkeit eher vorsichtig sein, diese war sogar fast dreimal solangsam wie Test1 (Insert,Exec direkt hintereinander).


Test3,4: Insert mit Transactionen gehen bereits erheblich schneller und können/sollten verwendet werden. Dabei spielt es keine Rolle ob "begin transaction / commit) innerhalb der Funktion oder außerhalb ist.

Test9,6,5: Sind nochmal um ca. 0,2 % schneller als Test3 und 4. Variablen direkt in die SQL Anweisung zu schreiben (Test5), war das schnellste; Gleiches mit Transaction (Test6) ist sogar einen Tick langsamer und wird nicht wirklich benötigt.

 

 

 


Android SDK Manager funktioniert nicht - Lösung

25. Februar 2018 - Lesezeit: ~1 Minute

Fehlbeschreibung (Windows): Nach dem Download und entpacken von Andoid SDK will man die Datei SDK Manager.exe starten. Es öffnet sich kurz ein Fenster, schließt sich aber sofort wird und sonst geschieht nichts weiter.

Lösung: Die Lösung ist einfach und simpel....

WICHTIG Die Dateien müssen auf dem Windowslaufwerk C: liegen! Wo in welchen Unterordner spielt dabei keine Rolle.

Beispiel Richtig: C:\lamw\android-sdk-windows Beispiel Falsch: D:\lamw\android-sdk-windows

Sobald man auf dem Windowslaufwerk den SDK Manager öffnen (C:\...\android-sdk-windows\SDK Manager.exe), geht kurz das Fenster auf, schließt sich wieder, und kurz danach öffnet sich ein weiteres Fenster!

 

Stand: Oktober 2017


Dotclear Sprachumstellung auf Deutsch

25. Februar 2018 - Lesezeit: ~1 Minute

In den folgenden Artikel beschreibe ich wie man das CMS Dotclear auf Deutsch umstellt. Der Artikel ist beschrieben für die Version 2.8. Kann aber wahrscheinlich auch auf andere Versionen umgesetzt werden. Evtl. sind dann einige Übersetzungen noch nicht übersetzt.

Die Sprachdateien befinden sich im Verzeichnis "locales". Dort sind Verzeichnisse mit einem Länderkürzel z. B. "en" für Englisch. Erstelle dort im Verzeichnis locales ein weiteres Verzeichnis "de" und kopiere dort die Daten hinein.

Dotclear wird die Sprache dann automatisch auf "Deutsch" umstellen.

Allgemeine Hinweiße


Die deutschen Sprachdateien haben die Endung *.po.

Die anderen Dateien mit der Endung *.php sind die Standartdateien die dotclear IMMER verwendet: date.lang.php, main.lang.php, plugins.lang.php, public.lang.php

Diese Dateien haben eine standartmäßig deutsche Übersetzung. Diese sind aber unvollständig, und vorallem FALSCH! Das führt bei der Nutzung von Dotclear dann eher zur Verwirrung.

Installation


Alle *.php Dateien entfernen! (Ggf. auch umbennen/verschieben) im Verzeichnis locales/de.

Dann werden die *.po Dateien mit der richtigen Deutschen Übersetzung verwendet.!

09/2015, stefan.programmiert@web.de