![]() |
Datenbank: Access / SQL Server • Version: 2010/2005 • Zugriff über: ADO
ADOCommand Parameter - ich werde bekoppt
Hallo,
ich hoffe Ihr seit meine Rettung. a) Ich hole aus einer Tabelle Q eine Summe (ADODataset) b) Das Ergebnis ist 416,66666666666666. c) Mittels ADOConmmand und SQL UPDATE will ich dieses Ergebnis in eine andere Tabelle einfügen. Ich verwende brav Parameter. Es können viele Datensätze werden.
Code:
Ergebnis in der neuen Tabelle = 41666666666666666
dKost := FieldByName('intern').AsFloat;
... Parameters.ParamByName('I').Value := dKost; Ich dachte, weil dKost mit Komma ist. Umgebaut zu Stingvariable sKost.
Code:
Ergebnis der Variable = '416.66666666666666' mit Punkt
sKost := FieldByName('intern').AsSting;
... Parameters.ParamByName('I').Value := StringReplace(sKost, ',', '.', [rfReplaceAll]); Ergebnis in der neuen Tabelle = 41666666666666666 Sowohl mit Komma als auch mit Punkt als auch als Float/Double immer das Gleiche. Was passiert da? Ich dachte eigentlich mit Parametern gibt es die Probleme nicht? |
AW: ADOCommand Parameter - ich werde bekoppt
Was passiert bei:
Delphi-Quellcode:
Value ist, soweit ich weiß, vom Typ Variant, da wird (glaub' ich) der Typ des übergebenen Wertes interpretiert.
Parameters.ParamByName('I').Value := FieldByName('intern').AsFloat;
Delphi-Quellcode:
Wenn Du die Daten von "Hand" in die Datenbank eingibst, musst Du dann als Dezimaltrenner das Komma oder den Punkt eingeben?
Parameters.ParamByName('I').Value := FieldByName('intern').Value;
Ist das bei beiden Tabellen gleich? Meine momentane Vermutung wäre, dass das Komma als Tausendertrenner erkannt wird und ist nicht für die Speicherung erforderlich. Daher wird's einfach entfernt. Was passiert denn, wenn Du bei der Stringverarbeitung den Punkt drinne läßt? |
AW: ADOCommand Parameter - ich werde bekoppt
In der DB Oberfläche kann ich die Zahlen mit Komma eingeben,
und sie werden auch mit Komma angezeigt und ausgewertet. Mit Komma werden die Zahlen falsch interpretiert, bei dem StringReplace wechsel ich ja das Komma zu einem Punkt. Somit habe ich beide Varianten probiert. Mit:
Code:
Gehts!!!
sqlText := 'UPDATE tSN_Budget SET [ist] = '+sKosti+', istEx = '+sKoste+' WHERE ( '
+'(Proj_Ident = '+QuotedStr(sProj_Ident)+') ' +' AND (LeistungsKlasse = '+QuotedStr(sLK)+') ' +' AND (Leistung = '+QuotedStr(sLeistung)+'))'; |
AW: ADOCommand Parameter - ich werde bekoppt
Woher soll ADO wissen, was für ein Typ der Parameter ist? Da stopfst Du irgendwas rein und das geht auch mal schief. Abhilfe: Definiere den Parametertyp explizit. Entweder im Objektinspektor, oder (wenn Du die Query zur Laufzeit zuweist)
Delphi-Quellcode:
Parameters.ParamByName('I').DataType := ftFloat;
Parameters.ParamByName('I').Value := 1.234; |
AW: ADOCommand Parameter - ich werde bekoppt
Ist fest verdrahtet im Objektexplorer als ftFloat.
|
AW: ADOCommand Parameter - ich werde bekoppt
Hast Du es mal mit ftBCD statt float versucht?
|
AW: ADOCommand Parameter - ich werde bekoppt
Zitat:
Zitat:
Delphi-Quellcode:
? Jetzt sag nicht 'Double' :wall:
dKost
Hmm..
Delphi-Quellcode:
Post(TheCodeSchnipselThatMakesDieProbleme)
IF DB=Access then Append(TheBeispielAccessDB) else Append(TheBeispielSchemaSkript) |
AW: ADOCommand Parameter - ich werde bekoppt
Klar Double, wird ja als Float gelesen, und es funktioniert ja auch - bis auf die Kommaverschiebung.
Ich habe ja auch beides getestet, Float und String (mit '.' und mit ','. Direkt in den SQL-Commandtext gehts ja. Datenbanken: Für Access und SQL Server (ab 2005). Habe ich da irgendwas nicht auf dem Schirm? |
AW: ADOCommand Parameter - ich werde bekoppt
Wenn du mit Feldinhalten ein Problem hast dann darfst du nur dem MS SQL Management Studio vertrauen wenn du den Inhalt prüfen möchtest.
Ich wollt's nur mal gesagt haben weil wenn man sich nur auf ADO Komponenten verlässt die Ursachen nur schwer finden kann. Eine weitere Quelle von Problemen sind verschiedene Datenbanken zur Design- und Runtime. Sobald man in Delphi eine ADOQuery oder ADOCommand ändert wird im Hintergrund die ADOConnection geöffnet, der SQL-Text analysiert und daraus die Datentypen der Parameter abgeleitet. Verweisst z.B. die Connection zur Designtime auf eine lokale Accessdatenbank während zur Laufzeit ein SQL Server verwendet wird passen die Parametertypen in manchen Fällen nicht so richtig zusammen. Nach meinen Erfahrungen ist es besser zur Designtime eine SQL Server DB zuverwenden als eine Accessdatenbank. |
AW: ADOCommand Parameter - ich werde bekoppt
Ich entwickle erstmal Datenbank unabhängig mit ADO,
dann teste ich mit Accsess + SQL Server (oder umgekehrt). Hier habe ich zuerst mit Access getestet -> und bin nicht weiter gekommen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz