代码之家  ›  专栏  ›  技术社区  ›  Koen

如何通用地格式化OracleNumber

  •  3
  • Koen  · 技术社区  · 14 年前

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

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

    那么有没有一种方法可以覆盖这些类型的ToString方法呢?某种形式的注入格式化引擎?

    谢谢

    3 回复  |  直到 14 年前
        1
  •  1
  •   Michał Niklas    14 年前

    你可以用 ALTER SESSION SET NLS_... . 看: http://download.oracle.com/docs/cd/B28359_01/olap.111/b28126/dml_options072.htm

    有一个例子说明了它如何使用点ad小数点和空格作为千位分隔符(还请注意日期时间设置):

    alter session set NLS_NUMERIC_CHARACTERS='. '
    alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS'
    
        2
  •  1
  •   Koen    14 年前

    似乎没有好的通用方法可以做到这一点。对于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类型,但是由于结果集可能非常大,这可能是一个危险的繁重的技巧,所以我们将只使用英语符号在那里生活。。。

        3
  •  0
  •   Rob van Laarhoven    14 年前
    SQL>select to_char(1000001/3, '999G999G990D999999', 'NLS_NUMERIC_CHARACTERS = '',.''')
    from dual;
    

    33.3333666667号

    补充:

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

    http://cs.felk.cvut.cz/10gr2/win.102/b14307/OracleGlobalizationClass.htm#i1010070 可能的参数