Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   ADOCommand Parameter - ich werde bekoppt (https://www.delphipraxis.net/178412-adocommand-parameter-ich-werde-bekoppt.html)

süden 6. Jan 2014 19:04

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:
   dKost := FieldByName('intern').AsFloat;
   ...
   Parameters.ParamByName('I').Value := dKost;
Ergebnis in der neuen Tabelle = 41666666666666666
Ich dachte, weil dKost mit Komma ist.

Umgebaut zu Stingvariable sKost.
Code:
   sKost := FieldByName('intern').AsSting;
   ...
   Parameters.ParamByName('I').Value := StringReplace(sKost, ',', '.', [rfReplaceAll]);
Ergebnis der Variable = '416.66666666666666' mit Punkt
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?

nahpets 6. Jan 2014 19:33

AW: ADOCommand Parameter - ich werde bekoppt
 
Was passiert bei:
Delphi-Quellcode:
Parameters.ParamByName('I').Value := FieldByName('intern').AsFloat;
Value ist, soweit ich weiß, vom Typ Variant, da wird (glaub' ich) der Typ des übergebenen Wertes interpretiert.
Delphi-Quellcode:
Parameters.ParamByName('I').Value := FieldByName('intern').Value;
Wenn Du die Daten von "Hand" in die Datenbank eingibst, musst Du dann als Dezimaltrenner das Komma oder den Punkt eingeben?

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?

süden 6. Jan 2014 19:53

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:
sqlText := 'UPDATE tSN_Budget SET [ist] = '+sKosti+', istEx = '+sKoste+' WHERE ( '
                       +'(Proj_Ident = '+QuotedStr(sProj_Ident)+') '
                       +' AND (LeistungsKlasse = '+QuotedStr(sLK)+') '
                       +' AND (Leistung = '+QuotedStr(sLeistung)+'))';
Gehts!!!

Furtbichler 6. Jan 2014 20:00

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;

süden 6. Jan 2014 21:10

AW: ADOCommand Parameter - ich werde bekoppt
 
Ist fest verdrahtet im Objektexplorer als ftFloat.

jobo 7. Jan 2014 06:54

AW: ADOCommand Parameter - ich werde bekoppt
 
Hast Du es mal mit ftBCD statt float versucht?

Furtbichler 7. Jan 2014 07:09

AW: ADOCommand Parameter - ich werde bekoppt
 
Zitat:

Zitat von süden (Beitrag 1242460)
Ist fest verdrahtet im Objektexplorer als ftFloat.

:shock: Access oder SQL-Server?
Zitat:

Delphi-Quellcode:
dKost := FieldByName('intern').AsFloat;
...
Parameters.ParamByName('I').Value := dKost;

Welcher Datentyp ist
Delphi-Quellcode:
dKost
? Jetzt sag nicht 'Double' :wall:

Hmm..
Delphi-Quellcode:
Post(TheCodeSchnipselThatMakesDieProbleme)
IF DB=Access then
  Append(TheBeispielAccessDB)
else
  Append(TheBeispielSchemaSkript)

süden 7. Jan 2014 10:02

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?

sx2008 7. Jan 2014 10:31

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.

süden 7. Jan 2014 10:39

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 00:04 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz