3

我为 Oracle 构建了一个带有 CSV 导出功能的小型查询工具,它带有一个 OracleDataAdapter 来填充显示在 DataGrid (WinForms) 中的数据集。起初我使用 .NET 类型(DateTime、decimal、string、...),但在某些情况下,由于 Oracle ( NUMBER(30,10)) 中的精度更高,我得到了溢出异常。因此我必须ReturnProviderSpecificTypes = true在 OracleDataAdapter 中设置属性,所以现在它使用 OracleClient (OracleNumber, OracleBoolean, OracleString,...) 类型。

问题是当我在 nl-BE 区域时(我们使用逗号作为小数分隔符,点作为千位分隔符),所有内容总是本地化(在屏幕上和 CSV 输出期间)为 en-US 格式。CSV 中的列分隔符是分号 btw,因此十进制数字中的逗号不会受到干扰。

那么有没有办法以某种方式覆盖这些类型的 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)并相应地转换它。然后有两种选择:

// 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

ADDED:

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

See http://cs.felk.cvut.cz/10gr2/win.102/b14307/OracleGlobalizationClass.htm#i1010070 for the possible parameters

于 2010-11-22T11:44:57.213 回答