C# 如何通用地格式化OracleNumber
我为Oracle构建了一个带有CSV导出功能的小型查询工具,该工具带有OracleDataAdapter,用于填充数据网格(WinForms)中显示的数据集。起初,我使用.NET类型(DateTime、decimal、string等),但在某些情况下,由于Oracle中的精度较高(C# 如何通用地格式化OracleNumber,c#,oracle,dataset,dataadapter,C#,Oracle,Dataset,Dataadapter,我为Oracle构建了一个带有CSV导出功能的小型查询工具,该工具带有OracleDataAdapter,用于填充数据网格(WinForms)中显示的数据集。起初,我使用.NET类型(DateTime、decimal、string等),但在某些情况下,由于Oracle中的精度较高(NUMBER(30,10)),我会遇到溢出异常。因此,我必须在OracleDataAdapter中设置属性ReturnProviderSpecificTypes=true,因此现在它使用OracleClient(Ora
NUMBER(30,10)
),我会遇到溢出异常。因此,我必须在OracleDataAdapter中设置属性ReturnProviderSpecificTypes=true
,因此现在它使用OracleClient(OracleNumber、OracleBoolean、OracleString等)类型
问题是当我在nl BE区域(我们使用逗号作为十进制分隔符,点作为千位分隔符)时,所有内容总是本地化(在屏幕上和CSV输出期间)为en US格式。CSV中的列分隔符是分号,所以十进制数字中的逗号不受干扰
那么,有没有一种方法可以以某种方式覆盖这些类型的ToString方法呢?某种形式的格式化引擎
谢谢
33.33336667
增加:
private si As OracleGlobalization;
si.DateFormat = "YYYY-MM-DD";
conn.SetSessionInfo(si);
有关可能的参数,请参阅。您可以使用
更改会话集NLS…
。看:
有一个示例说明了它如何使用点和小数点以及空格作为千位分隔符(另请注意datetime设置):
似乎没有好的通用方法来做到这一点。对于CSV输出,我找到了一个解决方法,但对于屏幕上的输出,我没有找到 在输出期间,我必须测试OracleNumber类型的每个值(无论如何,我必须测试INullable),并相应地强制转换它。然后有两种选择:
// Replace: not clean and could be a heavy operation
writer.Write(myOracleNumber.ToString().Replace('.', ','));
或
对于屏幕上的输出,我们可以使用类似的技术,从OracleDataAdapter填充的数据表中加载一个新的数据表,然后加载.NET CLR类型,但由于结果集可能非常大,这可能是一个危险的重把戏,所以我们将只使用英文符号…这是一个查询工具。用户可以输入任何查询。我根本无法控制查询……从常见问题解答中可以看出:最重要的是,诚实。如果您看到错误信息,请否决它。OracleGlobalization类是Oracle数据访问提供程序的一部分(我不喜欢使用它)。无论如何,它都不会有帮助,因为它将执行与第一次发送命令“alter session set NLS_NUMERIC_CHARACTERS=','”相同的操作,但我已经测试过……在Oracle SQL developer中工作,但不是从代码中工作。我尝试在实际语句之前将其作为单独的命令发送,但它不会影响任何内容。数据仍然包装在那些Oracle特定的类型中,它们的ToString方法也完全相同……对我来说,它与ODBC一起工作(通过JDBC-ODBC桥从Delphi和Jython)。您使用什么技术连接到Oracle db?
alter session set NLS_NUMERIC_CHARACTERS='. '
alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS'
// 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);