- PR -

ADO.NETのOverflowExceptionについて

1
投稿者投稿内容
AKIHIRO-T
会議室デビュー日: 2005/02/14
投稿数: 5
投稿日時: 2006-03-23 17:15
現在、Delphiで作成したWindowsアプリケーションを.NET Framworkで再構築する業務に携わっています。
データベースにはOracle(ver 10.1.0.4)、Visual Studio 2005(C#)を使用しています。

ADO.NETで以下のコードを実行すると、adp.Fillの箇所でOverflowExceptionが発生します。
なお、System.Data.OracleClientとOracle.DataAccess.Clientのどちらを利用した場合も
同じ現象が発生します。
前者のメッセージは「OCI-22053: オーバーフロー・エラー」で、後者のメッセージは
「算術演算の結果オーバーフローが発生しました。」となります。

コード:

using System;
using System.Data;
using System.Data.OracleClient;

class Test
{
static void Main(string[] args)
{
string szCon = "DATA SOURCE=ORCL;USER ID=scott;PASSWORD=xxxxx";
string szSql = "select 10 / 3 as VALUE from DUAL";

using (OracleDataAdapter adp = new OracleDataAdapter(szSql, szCon))
{
DataTable dt = new DataTable();
dt.Columns.Add("VALUE", typeof(decimal));
adp.Fill(dt);

Console.WriteLine(dt.Rows[0][0]);
}
}
}



この現象については、http://msdn2.microsoft.com/ja-jp/library/364x0z75(VS.80).aspxにも
あるとおり、decimal型の有効桁数が28〜29であることが原因で、DataColumnをtypeof(double)など
他の型で定義しても発生することがわかっています。

解決方法としては、ROUND関数などを使って数値データを丸めることが挙げられますが
ROUND(10 / 3, 28) -> OK
ROUND(10 / 3, 29) -> エラー
ROUND(100 / 3, 28) -> エラー
ROUND(100 / 3, 27) -> OK
のように、数値の大きさによって丸めの桁数に違いが生じます。

長くなりましたが、皆さんはこの点についてどのように対応しておられるのでしょうか。
私が思いつくのは、ROUND(X, 10)のようにある程度大きな値でもオーバーフローが発生しないような桁数で
丸める方法や、対数関数などを利用して汎用的な数値丸め関数を自作するといった方法です。
他にもよりよい方法がありましたら、ご指摘いただけると幸いです。

[ メッセージ編集済み 編集者: AKIHIRO-T 編集日時 2006-03-23 17:19 ]

[ メッセージ編集済み 編集者: AKIHIRO-T 編集日時 2006-03-23 17:37 ]
1

スキルアップ/キャリアアップ(JOB@IT)