Avatar billede stigc Nybegynder
21. november 2005 - 10:57 Der er 22 kommentarer og
1 løsning

OracleDbType.Decimal til .NET Decimal

Jeg modtager en OracleDbType.Decimal fra en stored procedure og vil lægge den over i en decimal. Jeg ville ikke have den skal forbi en streng eller en double. Hvordan gør man dette på den "rigtige" måde? Følgende virker ikke!

decimal d = (decimal)command.Parameters["returnValue"].Value
Avatar billede arne_v Ekspert
21. november 2005 - 10:59 #1
det ser rigtigt ud !

kan du uddybe "virker ikke" ?
Avatar billede dr_chaos Nybegynder
21. november 2005 - 11:00 #2
får du det ud i command.Parameters["returnValue"].Value
som du skal have ?
Den metode ser rigtig nok ud som arne også siger.
Avatar billede arne_v Ekspert
21. november 2005 - 11:00 #3
prøvt evt. at udskrive

command.Parameters["returnValue"].Value.GetType().Name

for at se hvad du har.
Avatar billede arne_v Ekspert
21. november 2005 - 11:00 #4
Og husk at NULL har sin egen type
Avatar billede stigc Nybegynder
21. november 2005 - 11:15 #5
Feltet er ikke NULL.

? command.Parameters["returnValue"].Value.ToString() giver mig tallet.

? command.Parameters["returnValue"].Value giver mig

{Oracle.DataAccess.Types.OracleDecimal}
    [Oracle.DataAccess.Types.OracleDecimal]: {Oracle.DataAccess.Types.OracleDecimal}
Avatar billede stigc Nybegynder
21. november 2005 - 11:16 #6
Det er en ReturnValue parameter.

command.Parameters.Add("returnValue", Oracle.DataAccess.Client.OracleDbType.Decimal, 9, System.Data.ParameterDirection.ReturnValue);
Avatar billede stigc Nybegynder
21. november 2005 - 11:17 #7
Det sjove er at jeg angiver Oracle.DataAccess.Client.OracleDbType.Decimal men den returnerer en Oracle.DataAccess.Types.OracleDecimal. Hvad er forskellen?
Avatar billede arne_v Ekspert
21. november 2005 - 11:20 #8
det ene er en enumeration som angiver typen

det andet er typen som indeholder en oracle decimal
Avatar billede arne_v Ekspert
21. november 2005 - 11:21 #9
prøv:

((Oracle.DataAccess.Types.OracleDecimal)command.Parameters["returnValue"].Value).

og se hvad intellisense foreslår af spændende metoder på sådan en type
Avatar billede stigc Nybegynder
21. november 2005 - 11:21 #10
godt så.
Avatar billede stigc Nybegynder
21. november 2005 - 11:22 #11
Den har jeg prøvet. Der er kun toDouble() og ikke toDecimal()
Avatar billede Slettet bruger
21. november 2005 - 11:28 #12
OracleDecimal odec = (OracleDecimal)command.Parameters["returnValue"].Value;
decimal d = (decimal)odec;

Brude kunne gøre det. Ifølge nedenstående link findes der en explicit operator decimal, altså explicit cast til en decimal fra en OracleDecimal.

http://skywheel.sarang.net/docs/Oracle/10g/win.101/b10117/oratypes002.htm#i1005512
Avatar billede stigc Nybegynder
21. november 2005 - 11:37 #13
Ja, det ser ud til at være måden at gøre det på. Det var godt gemt.
Avatar billede Slettet bruger
21. november 2005 - 11:44 #14
svar så ;)
Avatar billede stigc Nybegynder
21. november 2005 - 12:14 #15
takker
Avatar billede stigc Nybegynder
23. november 2005 - 13:51 #16
Desværre. så holder den heller ikke. Jeg fik en "arithmetic overflow" Exception.

? command.Parameters["returnValue"].Value.ToString() gav

"579035223,854725405191755745264723618091"

Hvordan klarer vi den så?
Avatar billede Slettet bruger
24. november 2005 - 07:35 #17
Skyldes at decimal er væsentligt "større" end en double så du skal over en System.Decimal, hvilket givet er den rigtigt type i forhold til en Oracle number.

Du kan så kalde ToDouble() på System.Decimal.
Avatar billede stigc Nybegynder
24. november 2005 - 18:32 #18
Det havde jeg sådan set også regnet ud, men hvordan klarer man den? En afrundning kan accepteres. Jeg bruger decimal da jeg går ud fra at denne er bedre end en double.
Avatar billede Slettet bruger
24. november 2005 - 18:44 #19
Decimal bruges når du skal have mange betydende cifre - den type lider ikke af de generelle problemer med double/float, hvor man kan få nogle meget spændende tal hvis man ganger og dividere (overflow problemer).
Avatar billede stigc Nybegynder
24. november 2005 - 19:10 #20
just precis
Avatar billede stigc Nybegynder
24. november 2005 - 19:12 #21
Nu er det vel ikke "overflow problemer" og de sker også ved almindelige addition og division.
Avatar billede stigc Nybegynder
02. december 2005 - 14:33 #22
Jeg har undersøgt lidt mere:

En .Net decimal må ikke have mere 28 betydende cifre og må ikke være mindre end 0.0000000000000000000000000001 (1 på 28. decimal). Samtidig kan den ikke have mere end 29 cifre i et tal. Dvs at 8 betydende cifre give en max præcision på 21 decimaler. (...det er sådan cirka hvad jeg har læst mig til og erfaret)

Følgende kan sagtens håndtere større tal end dette. fx. 1234567899.12345678991234567899 med 30 cifre. decimal.Parse fjerene simpelthen bare de mindst betydende cifre som der ikke er plads til.

  decimal d = decimal.Parse(command.Parameters["returnValue"].Value.ToString());

hvorimod følgende kaster en overflow.

  decimal d =(decimal)(OracleDecimal)command.Parameters["returnValue"].Value;

jeg er sku ikke meget for at smide decimalen forbi en streng, men det er jo den bedste metode af de to overstående. Har i nogen mening?
Avatar billede stigc Nybegynder
02. december 2005 - 15:55 #23
I det sidste metode skal kulturen selvfølgelig kontrolles.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester