21. november 2005 - 10:57Der 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
Det sjove er at jeg angiver Oracle.DataAccess.Client.OracleDbType.Decimal men den returnerer en Oracle.DataAccess.Types.OracleDecimal. Hvad er forskellen?
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å?
Synes godt om
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.
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.
Synes godt om
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).
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?
I det sidste metode skal kulturen selvfølgelig kontrolles.
Synes godt om
Ny brugerNybegynder
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.