Frage

Ich bin mit zwei Problemen gerichtet ...

(1) Wenn ich versuche, in eine Datenbank (SQLite) mit der Verwendung von Delphi XE6 zu schreiben, bekomme ich immer die Datenbank, dass die Fehlermeldung gesperrt ist.Ich bin sicher, dass ich die Datenbank jedes Mal schließe, wenn ich mit dem Befehl zugreifen kann Fdconnection1.close;

(2) Wie füge ich mich aus eingehenden Parametern in eine Tabelle ein? Ich habe folgende ankommende Parameter

generasacodicetagpre.

und versuchte, mit dem folgenden SQL-Befehl in die Tabelle zu schreiben:

generasacodicetagpre.

aber es scheint nicht zu funktionieren ...

Das Folgende ist das vollständige Verfahren, mit dem ich Probleme mit

habe generasacodicetagpre.

Alle Hinweise werden sehr geschätzt.Vielen Dank im Voraus.

War es hilfreich?

Lösung

Es gibt zwei Techniken, um eine dynamische SQL-Anweisung auszuführen. Aber ich benutze eine kürzere SQL, um sich auf die Logik zu konzentrieren:

der reine Weg (mit Parametern)

generasacodicetagpre.

Der schmutzige Weg (Gebäude SQL)

generasacodicetagpre.

Die Unterschiede sind signifikant. Der schmutzige Weg legt Ihnen SQL-Injektionsprobleme aus (wie in den meisten anderen Sprachen, wenn Sie jedoch SQL-Dinamical bauen, jedoch ohne Parameter). Dies könnte für Sie ein Problem sein oder nicht. Wenn Sie wissen, dass das Verfahren nur von Ihrem eigenen Code privat aufgerufen wird und dass diese Prozedur-Parameterwerte nur gute Werte enthalten können ... oder wenn Sie ein guter Parameterprüfung vor dem Erstellen und Ausführen Ihres SQL ... dann sind Sie sicher .

Wenn Sie jedoch mit Parametern (reinen Weg) tun, werden Sie automatisch vor der SQL-Injektion geschützt, da die SQL-Anweisung vom Motor validiert wird, ohne die Parameterwerte zu kennen. Die SQL-Anweisungsstruktur ist also vom Motor bekannt und kann nicht mit den tatsächlichen Werten geändert werden.

Eine andere Überlegung ist, wie häufig Sie diese Einfügungs-Anweisung ausführen. Mit dem reinen Weg können Sie die Abfrage einmal vorbereiten und es viele Male mit unterschiedlichen Parameterwerten ausführen (Sie dürfen das Abfrageobjekt nicht zerstören, noch die SQL-Eigenschaft ändern, und Sie müssen die Vorbereitungsmethode einmal anrufen). Wenn Sie es in einer Schleife häufig ausführen, kann es effizienter sein, als das SQL die SQL-Vielfache der dreckigen Art zu bauen. OTOH Wenn Sie nur eine einzelne Zeile einlegen müssen, kann es ein bisschen mehr aufgeben.

===================

als beiseite ... CL ist richtig ... diese Werte sollten keine Saiten sein. Beachten Sie, dass das Parameterobjekt viele Eigenschaften hat, um verschiedene Datentypen zu handhaben:

generasacodicetagpre.

... und so weiter.

Wenn Sie keine Parameter verwenden, werden die Dinge schwierig. Die QUICESTEST-Funktion ist gut für Saiten, aber wenn Sie Datumsangaben und Währungen und andere Werttypen direkt in Ihrem SQL brennen möchten, müssen Sie wissen, was Sie tun. Möglicherweise stoßen Sie auf viele verschiedene Probleme an ... Locale-Spezifikations- oder Formateinstellungen, die nicht gut für die Kommunikation mit Ihrem Server sind, die sich auf dem gegenüberliegenden Ende der Welt befinden können, oder können möglicherweise nicht in der Lage sein, Werte auf diese Weise formatiert zu lassen. Möglicherweise müssen Sie motorspezifische Formatierungs- und Konvertierungsprobleme umgehen.

Wenn Sie Parameter verwenden, sollte FireDAC um all das für Sie kümmern;)

Andere Tipps

Um Werte in die Abfrage zu erhalten, verwenden Sie Parameter (dies wird dem Dokumentation ):

generasacodicetagpre.

(und ich bezweifle, dass all diese Werte wirklich Saiten sein sollten ...)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top