3

DataGrid(WinForms)に表示されるデータセットを入力するために、OracleDataAdapterを備えたCSVエクスポート機能を備えたOracle用の小さなクエリツールを作成しました。最初は.NETタイプ(DateTime、decimal、string、...)を使用しましたが、Oracle()の精度が高いために、オーバーフロー例外が発生する場合がありましたNUMBER(30,10)。したがって、OracleDataAdapterでプロパティを設定する必要があったReturnProviderSpecificTypes = trueため、代わりにOracleClient(OracleNumber、OracleBoolean、OracleString、...)タイプを使用するようになりました。

問題は、私がnl-BE領域にいる間(画面上およびCSV出力中に)すべてが常にen-US形式にローカライズされることです(小数点記号としてコンマを使用し、千単位の区切り文字としてポイントを使用します)。CSVの列区切り文字はセミコロンです。したがって、10進数のコンマとの干渉はありません。

では、これらのタイプの方法でToStringメソッドをオーバーライドする方法はありますか?ある種のフォーマットエンジンを注入しますか?

ありがとう

4

3 に答える 3

1

を使用できますALTER SESSION SET NLS_...。見てください:http://download.oracle.com/docs/cd/B28359_01/olap.111/b28126/dml_options072.htm

ドットと小数点を千単位の区切り文字として使用した場合の例があります(日時の設定にも注意してください)。

alter session set NLS_NUMERIC_CHARACTERS='. '
alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS'
于 2010-11-22T11:47:53.233 に答える
1

これを行うための良い一般的な方法はないようです。CSV出力の場合、回避策が見つかりましたが、画面上の出力では見つかりませんでした。

出力中に、タイプOracleNumberのすべての値をテストし(とにかくINullableをテストする必要があります)、それに応じてキャストする必要があります。次に、2つのオプションがあります。

// Replace: not clean and could be a heavy operation
writer.Write(myOracleNumber.ToString().Replace('.', ','));

また

// Returns decimal but result is not exact (which is acceptable in my case)
writer.Write(OracleNumber.Round(myOracleNumber, 10).Value);

画面に出力する場合は、同様の手法を使用して、OracleDataAdapterで入力されたものから.NET CLRタイプを使用して、メモリに新しいDataTableを読み込むことができますが、結果セットが非常に大きくなる可能性があるため、危険なほど重いトリックになる可能性があります。 、だから私たちはそこで英語の表記法で生きるでしょう...

于 2010-11-23T12:48:44.077 に答える
0
SQL>select to_char(1000001/3, '999G999G990D999999', 'NLS_NUMERIC_CHARACTERS = '',.''')
from dual;

33.3333,666667

追加した:

private si As OracleGlobalization; 
si.DateFormat = "YYYY-MM-DD";
conn.SetSessionInfo(si);

可能なパラメーターについては、http://cs.felk.cvut.cz/10gr2/win.102/b14307/OracleGlobalizationClass.htm#i1010070を参照してください。

于 2010-11-22T11:44:57.213 に答える