Eu vi decimal usado em vez de int/long em vários exemplos. Eu só estou tentando entender por que
Provavelmente porque .NET
decimal
e Oracle NUMBER
mapeia um pouco melhor que long
e NUMBER
e também lhe dá mais flexibilidade. Se você posteriormente adicionar uma escala na coluna Oracle, você não precisaria alterar o tipo de dados se já usasse decimal
. decimal
é certamente mais lento que int
e long
já que os dois últimos são suportados em hardware. Dito isso, você precisa processar uma quantidade séria de dados para que faça alguma diferença. Eu ainda acho que você deveria usar long
se é com isso que você está lidando e então você também deve deixar as definições de coluna da tabela representarem isso. NUMBER(18,0)
por long
e assim por diante. O motivo
decimal
mapeia um pouco melhor é que long
é de 64 bits e decimal
é (mais ou menos) 128 bits. .NET
Tipo:decimal
Intervalo aproximado:±1,0 × 10^−28 a ±7,9 × 10^28
Precisão:28-29 dígitos significativos
Tipo:longo
Intervalo:-9.223.372.036.854.775.808 a 9.223.372.036.854.775.807
Precisão:18 (19 para ulong) dígitos significativos
Oráculo
NUMBER
padrão para 38 dígitos significativos e escala 0 (inteiro).
Tipo:NUMBER
Intervalo:+- 1 x 10^-130 a 9,99...9 x 10^125
Precisão:38 dígitos significativos
A Microsoft está ciente do problema e observa
Esse tipo de dados é um alias para o tipo de dados NUMBER(38) e foi projetado para que o OracleDataReader retorne um System.Decimal ou OracleNumber em vez de um valor inteiro. O uso do tipo de dados .NETFramework pode causar um estouro.
Pensando bem, você realmente precisa de
BigInteger
ser capaz de representar o mesmo número de dígitos significativos que NUMBER
padrão para. Nunca vi ninguém fazer isso e acho que é uma necessidade muito rara. Também BigInteger
ainda não cortaria desde NUMBER
pode ser de infinito positivo e negativo.