Autor Beitrag
ibh_compucat
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win 2000, Win 8.1
D6, Ent. XE5 Ent.
BeitragVerfasst: Di 30.03.10 14:01 
Hallo,

wie kann man in einem SQL-String einen Wert an ein Integer-Feld in der Zieltabelle übergeben?

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Di 30.03.10 14:07 
Arbeite mit Parametern.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Di 30.03.10 14:22 
ausblenden Delphi-Quelltext
1:
s := 'INSERT INTO KUNDEN (Telefonnr) VALUES('+IntToStr(iTelNr)+')';					


vorausgesetzt deine Variable, die die Telefonnummer enthält ist auch integer, sonst

ausblenden Delphi-Quelltext
1:
s := 'INSERT INTO KUNDEN (Telefonnr) VALUES('+sTelNr+')';					


Wobei die Telefonnummer ja sicherlich ursprünglich per Eingabe aus'm TEdit.Text kommt und damit string ist?
ibh_compucat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win 2000, Win 8.1
D6, Ent. XE5 Ent.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Di 30.03.10 14:41 
Das weiß der SQL-Server, der den SQL-String empfängt und verarbeitet!
Critter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 328
Erhaltene Danke: 3

Windows 7
Delphi 7 Pro.
BeitragVerfasst: Di 30.03.10 14:41 
Hallo,
user profile iconibh_compucat hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win 2000, Win 8.1
D6, Ent. XE5 Ent.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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.

user profile iconCritter hat folgendes geschrieben Zum zitierten Posting springen:
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:
user profile iconCritter hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 328
Erhaltene Danke: 3

Windows 7
Delphi 7 Pro.
BeitragVerfasst: Mi 31.03.10 15:53 
Hi,
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Mi 31.03.10 16:05 
:zustimm: :zustimm: :zustimm:

_________________
artelogic.com - plasmatrix.info
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mi 31.03.10 16:35 
user profile iconCritter hat folgendes geschrieben Zum zitierten Posting springen:
Hi,

Hai.

user profile iconCritter hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconCritter hat folgendes geschrieben Zum zitierten Posting springen:
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."