C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: oracleからデータ抽出について


(過去ログ 123 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■73526 / inTopicNo.1)  oracleからデータ抽出について
  
□投稿者/ 田中 (1回)-(2014/10/07(Tue) 11:37:24)

分類:[C#] 

お世話になっております。

C#で単純にOracleに接続してDataTableに抽出した際に困った事が
起こりました。

TESTテーブルにNumber型(10,4)のカラムのみ作成し以下のデータ
を作りました。


12
12.1
12.12
12.123
12.1234

Oracle.DataAccess.Client(Ver.4.112.3.0)のOracleDataAdapterのFill
を行ったら以下の様な結果がDataTableに格納されました。

DataTable上
12
12.10
12.12
12.1230
12.1234

12.1と12.123の最後に0(ゼロ)が入ってきてしまいます。
これをOracleのデータと同じように取得する方法はないでしょうか?

宜しくお願いします。

引用返信 編集キー/
■73527 / inTopicNo.2)  Re[1]: oracleからデータ抽出について
□投稿者/ shu (623回)-(2014/10/07(Tue) 11:55:58)
> C#で単純にOracleに接続してDataTableに抽出した際に困った事が
> 起こりました。
なぜ困ったことなのでしょうか?
末尾に0が付いていようと数値としては変わりがありません。
取得後の目的により解決方法が変わるかと思います。

文字列として末尾0を削りたいのなら、TrimEnd("0"c).TrimEnd("."c)
でなんとかならないでしょうか?

引用返信 編集キー/
■73528 / inTopicNo.3)  Re[1]: oracleからデータ抽出について
□投稿者/ 魔界の仮面弁士 (135回)-(2014/10/07(Tue) 12:16:18)
No73526 (田中 さん) に返信
> C#で単純にOracleに接続してDataTableに抽出した際に困った事が
> 起こりました。

.NET の Decimal 型は、内部的には有効桁数を保持しています。
そのため、「12.100」と「12.10000」は、異なるデータとして格納されます。

ただし、それらは数値としては同一なため、== での比較においては、
12 と 12.100 と 12.10000 は、等価な値として扱われる仕様です。
そのため通常は、これらの違いを気にする必要はありません。


一方、Oracle の NUMBER 型は、桁数は固定です。
(10,4) であるならば、小数部は常に 4 桁であるものとして扱われます。

数値を文字列として出力する場合の桁数を明示したい場合は、
Oracle では TO_CHAR 関数を使います。
.NET では String.Format や、ToString(書式) メソッドなどですね。


> これをOracleのデータと同じように取得する方法はないでしょうか?
DataTable の値を、どのように使われているのでしょうか?
TextBox や DataGridView などにデータバインドで表示するときの話だとすれば、
明示的に書式を指定してみては如何でしょうか。

引用返信 編集キー/
■73530 / inTopicNo.4)  Re[2]: oracleからデータ抽出について
□投稿者/ 田中 (2回)-(2014/10/07(Tue) 13:26:56)
shuさん、魔界の仮面弁士さん。早い対応有難うございました!
知らなかった事なので、とても勉強になりました。

魔界の仮面弁士さんが言われている通りにDataGridViewで表示
後に、数値の正当性のチェック(桁数)など行おうとした時に
今回の現象が問題となりました。

理由が分かりましたので、フォーマットして正当性のチェックを行おうと思います。

ありがとうございました!
解決済み
引用返信 編集キー/
■73531 / inTopicNo.5)  Re[2]: oracleからデータ抽出について
□投稿者/ 魔界の仮面弁士 (136回)-(2014/10/07(Tue) 13:29:50)
No73528 (魔界の仮面弁士 さん) に返信
> 数値を文字列として出力する場合の桁数を明示したい場合は、
> Oracle では TO_CHAR 関数を使います。
> .NET では String.Format や、ToString(書式) メソッドなどですね。

DataTable 側を System.Decimal 列で定義しておき、
Oracle 側からは、TO_CHAR した文字列を代入するようにすれば、
一時代入の段階では、書式を一致させることが出来ます。

でも、そこまでして一致させないといけないものでしょうか?
12.10 でも 12.1 でも、値としては同じですよね?



SELECT CAST('12.0000' AS NUMBER(10,4)) FROM DUAL UNION ALL
SELECT CAST('12.1000' AS NUMBER(10,4)) FROM DUAL UNION ALL
SELECT CAST('12.1200' AS NUMBER(10,4)) FROM DUAL UNION ALL
SELECT CAST('12.1230' AS NUMBER(10,4)) FROM DUAL UNION ALL
SELECT CAST('12.1234' AS NUMBER(10,4)) FROM DUAL UNION ALL
SELECT CAST('12'      AS NUMBER(10,4)) FROM DUAL UNION ALL
SELECT CAST('12.1'    AS NUMBER(10,4)) FROM DUAL UNION ALL
SELECT CAST('12.12'   AS NUMBER(10,4)) FROM DUAL UNION ALL
SELECT CAST('12.123'  AS NUMBER(10,4)) FROM DUAL UNION ALL
SELECT CAST('12.1234' AS NUMBER(10,4)) FROM DUAL


SQL/Plus での実行結果
--------
      12
    12.1
   12.12
  12.123
 12.1234
      12
    12.1
   12.12
  12.123
 12.1234

============================================


var dec = new decimal[]
{ 12.0000m
, 12.1000m
, 12.1200m
, 12.1230m
, 12.1234m
, 12m
, 12.1m   
, 12.12m
, 12.123m 
, 12.1234m
};
Array.ForEach(dec, Console.WriteLine);
// var tbl = new System.Data.DataTable();
// tbl.Columns.Add("dec", typeof(decimal));
// Array.ForEach(dec, d => tbl.Rows.Add(d));


コンソールへの出力内容
--------
12.0000
12.1000
12.1200
12.1230
12.1234
12
12.1
12.12
12.123
12.1234

ウォッチ式への表示内容
--------
12
12.1
12.12
12.123
12.1234
12
12.1
12.12
12.123
12.1234

引用返信 編集キー/
■73532 / inTopicNo.6)  Re[3]: oracleからデータ抽出について
□投稿者/ 魔界の仮面弁士 (137回)-(2014/10/07(Tue) 13:32:24)
No73531 (魔界の仮面弁士 ) に追記:

あ。解決済みでしたか。チェック入れておきます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -