Top / .NET備忘録 / 10.oo4o / 16.OracleDecimal

たとえば

 SELECT 1 / 3 AS HOGE FROM DUAL

という SQL を実行すると、結果が .3333333333.... になりますが、これを OracleDecimal 型で取り出し、Value プロパティを参照すると、OverflowException が発生します。桁落ちなのに OverflowException ?

簡単な例を紹介すると、Oracle.DataAccess を参照設定し、以下のようなコードを実行します。

 Imports Oracle.DataAccess.Types
 
 Module Module1
 
     Public Sub Main()
         Dim value1 As New OracleDecimal(1)
         Dim value3 As New OracleDecimal(3)
         Dim result As OracleDecimal = OracleDecimal.Divide(value1, value3)
         Debug.Print("{0}", result.Value)
     End Sub
 
 End Module

OracleDataAdapter の Fill メソッドでは、同様の変換が行われているらしく、ReturnProviderSpecificTypes プロパティを True にしないと OverflowException が発生します。

 Imports Oracle.DataAccess.Client
 Imports Oracle.DataAccess.Types
 
 Module Module1
 
    Public Sub Main()
         Using con As New OracleConnection("DATA SOURCE=ORCL;USER ID=SCOTT;PASSWORD=TIGER")
             con.Open()
             Using adapter As New OracleDataAdapter("SELECT 1/3 AS RESULT FROM DUAL", con)
                 adapter.ReturnProviderSpecificTypes = True                                  ' ←これがないと OverflowException
                 Dim dt As New DataTable
                 adapter.Fill(dt)
             End Using
         End Using
     End Sub
 
 End Module

OracleDecimal 型を、Decimal に変換する方法として、2つほど例をあげておきます。

 Imports Oracle.DataAccess.Types
 Imports System.Globalization
 
 Module Module1
 
     Public Sub Main()
        Dim value1 As New OracleDecimal(1)
        Dim value3 As New OracleDecimal(3)
        Dim result As OracleDecimal = OracleDecimal.Divide(value1, value3)
        Dim dec As Decimal
        dec = Decimal.Parse(result.ToString(), NumberStyles.Any)           '....(1)
        dec = OracleDecimal.SetPrecision(result, 28).Value                 '....(2)
     End Sub
 
 End Module

(1) ToString() の戻り値を Decimal に Parse する
(2) OracleDecimal.SetPrecision で 28 桁にする




トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2013-08-22 (木) 02:29:22 (1455d)