| Autor |
Beitrag |
ibh_compucat
      
Beiträge: 130
Win 2000, Win 8.1
D6, Ent. XE5 Ent.
|
Verfasst: Di 30.03.10 14:01
Hallo,
wie kann man in einem SQL-String einen Wert an ein Integer-Feld in der Zieltabelle übergeben?
Delphi-Quelltext 1:
| s := 'INSERT INTO KUNDEN (Telefonnr) VALUES(........)'; |
wobei das Feld Telefonnr in der Zieltabelle z.B. Integer ist.
Gruß ibh_compucat
_________________ Was du nicht begreifst, kannst du nicht verlernen!
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 30.03.10 14:07
Arbeite mit Parametern.
Delphi-Quelltext 1: 2: 3:
| s := 'INSERT INTO KUNDEN (Telefonnr) VALUES(:TelefonNr)'; ... Query1.ParamByName('TelefonNr').asInteger := 12345; |
Der Doppelpunkt gibt an, dass es sich um einen Parameter mit folgendem Namen handelt, diesem Parameter kannst du anschließend einen Wert zuweisen.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
artelogic
      
Beiträge: 39
|
Verfasst: Di 30.03.10 14:22
|
|
ibh_compucat 
      
Beiträge: 130
Win 2000, Win 8.1
D6, Ent. XE5 Ent.
|
Verfasst: Di 30.03.10 14:32
Danke für Eure Antworten,
@Xentar: ich bekomm' nur die Auswahl (mit der Programmierhilfe) Query1.Parameters, ParamByNames bietet er mir nicht an. Muss man da etwas vorbereiten?
@artelogic:
die Richtung ist die, die mir vorschwebt, aber mein Zielfeld in der Zieltabelle ist numerisch. Dein Vorschlag wandelt mir den zu übertragenden Wert in einen String (für den SQL-String) um. Aber wie erfährt meine Zieltabelle, dass der Wert nun wieder numerisch umgewandelt werden muss für das Tabellenfeld(Integer)?
Gruß ibh_compucat
_________________ Was du nicht begreifst, kannst du nicht verlernen!
|
|
artelogic
      
Beiträge: 39
|
Verfasst: Di 30.03.10 14:41
Das weiß der SQL-Server, der den SQL-String empfängt und verarbeitet!
|
|
Critter
      
Beiträge: 328
Erhaltene Danke: 3
Windows 7
Delphi 7 Pro.
|
Verfasst: Di 30.03.10 14:41
Hallo,
ibh_compucat hat folgendes geschrieben : | | die Richtung ist die, die mir vorschwebt, aber mein Zielfeld in der Zieltabelle ist numerisch. Dein Vorschlag wandelt mir den zu übertragenden Wert in einen String (für den SQL-String) um. Aber wie erfährt meine Zieltabelle, dass der Wert nun wieder numerisch umgewandelt werden muss für das Tabellenfeld(Integer)? |
SQL-Anweisungen sind immer Strings, wenn das Zielfeld als Numerisch angelegt ist, dann ist es Aufgabe deiner Datenbank das zu erkennen und den entsprechendes Teil des Querys wieder in eine Zahl zu wandeln. Da musst du dich nicht drum kümmern.
critter
PS: Telefonnummern-Felder sollten genau so wenig wie PLZ-Felder als Integer gespeicher werden, denn wie willst du in einem Int Feld die 04912345678 von der 004912345678 unterscheiden? Außerdem mögen Nutzer es meist nicht, wenn ihre schön formatierte Eingabe (01234/56789-10) der Formatierungszeichen beraubt wird.
_________________ Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
|
|
ibh_compucat 
      
Beiträge: 130
Win 2000, Win 8.1
D6, Ent. XE5 Ent.
|
Verfasst: Di 30.03.10 15:17
Hallo an alle Helfer,
Die Datenbank (MS-SQL Server) wandelt tatsächlich selber den Wert in das passende Format um, man braucht also nur lokale numerische Werte in Strings für den SQL String umzuwandeln. Und das ist ja kein Problem.
Nochmal vielen Dank an alle!
Gruß ibh_compucat
_________________ Was du nicht begreifst, kannst du nicht verlernen!
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Di 30.03.10 16:11
Naja, Parameter wären schon richtiger geweisen. Schon allein, um nicht ganz so große SQL-Injection-Scheunentore offen zu lassen.
Critter hat folgendes geschrieben : | | PS: Telefonnummern-Felder sollten genau so wenig wie PLZ-Felder als Integer gespeicher werden, denn wie willst du in einem Int Feld die 04912345678 von der 004912345678 unterscheiden? |
Soweit richtig, aber:
Critter hat folgendes geschrieben : | | Außerdem mögen Nutzer es meist nicht, wenn ihre schön formatierte Eingabe (01234/56789-10) der Formatierungszeichen beraubt wird. |
Wer Formatierungszeichen mitspeichert gehört gevierteilt, gefedert, geteert und mit Vorlesungsmanuskripten Datenbanken geschlagen.
Die sollten bei der Eingabe entfernt und zur Anzeige wieder eingefügt werden. Wie willst du sonst 004912345678 und +49-12345-678 als gleich erkennen? Bei OpenStreetMap gibts da einen Artikel zum Thema, der die verschiedenen Formate und Hinweise zum Parsen gibt.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Critter
      
Beiträge: 328
Erhaltene Danke: 3
Windows 7
Delphi 7 Pro.
|
Verfasst: Mi 31.03.10 15:53
Hi,
Martok hat folgendes geschrieben : | | Die sollten bei der Eingabe entfernt und zur Anzeige wieder eingefügt werden. Wie willst du sonst 004912345678 und +49-12345-678 als gleich erkennen? |
Um ehrlich zu sein, ich speichere Telefonnummern meist zweifach, einmal in der Form, wie der user sie eingibt sowie in einer Normierten Variante. Ich empfände es als eine unverschämte Bevormundung des Users seine Eingabe in eine Standardform zu bringen. Gerade Durchwahlen könnte ich auch nicht automatisch erkennen, da muss ich mich auf die Benutzereingabe verlassen (und auch bei der habe ich schon die komischsten Trennzeichen gesehen). Suchen und Vergleiche mache ich natürlich auf der Normierten Form, anzeigen tue ich was der User eingegeben hat, es sei denn es wird eine Bestimmte Darstellung für die Ausgabe bevorzugt die kann man dann aber in der Regel aus der Normierten Form erstellen.
Natürlich gibt es ausnahmen, wenn von Auftraggeber eine bestimmte Eingabeform definiert wird, dann passe ich natürlich auf, dass der User sich an diese halten muss, im allgemeinen finde ich aber, das sich eher das Programm anpassen soll und nicht der Nutzer.
critter
_________________ Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
|
|
artelogic
      
Beiträge: 39
|
Verfasst: Mi 31.03.10 16:05
_________________ artelogic.com - plasmatrix.info
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Mi 31.03.10 16:35
Critter hat folgendes geschrieben : | | Hi, |
Hai.
Critter hat folgendes geschrieben : | | Um ehrlich zu sein, ich speichere Telefonnummern meist zweifach, einmal in der Form, wie der user sie eingibt sowie in einer Normierten Variante. |
So gehts natürlich auch. Ist zwar fast noch weniger "nach Lehrbuch", aber immerhin praktisch.
Ich muss zugeben, dass ich bisher das Problem nicht so hatte. Datumsfelder sind ja da doch freundlicher; bisher ließ sich das immer alles auf unformatierte Daten abbilden. Wobei ich bei Teilenummern schonmal ein ähnliches Problem hatte. Die betreffenden kann man entweder ohne Trenner, mit Leerzeichen oder mit Punkten schreiben. War dann so, dass ich nur die Ziffern speichere und wie oben geschrieben in ein MaskEdit werfe.
Critter hat folgendes geschrieben : | | im allgemeinen finde ich aber, das sich eher das Programm anpassen soll und nicht der Nutzer. |
Okay, so war das auch nicht gemeint. Mit der von dir beschriebenen Variante hat man dann auch einen guten Kompromiß zwischen starrsinnigen Usern und dem was man als Entwickler sinnvoll findet 
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
|