Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET代码在Oracle DB中存储了1或3个小数位数的数字后添加一个尾随0_.net_Oracle_Ado.net_Oledb_Odp.net - Fatal编程技术网

.NET代码在Oracle DB中存储了1或3个小数位数的数字后添加一个尾随0

.NET代码在Oracle DB中存储了1或3个小数位数的数字后添加一个尾随0,.net,oracle,ado.net,oledb,odp.net,.net,Oracle,Ado.net,Oledb,Odp.net,我在.NET(使用OracleDataAdapter)和SQL Developer中运行SELECT查询。结果集略有不同: SQL开发人员返回: 。净回报率: 如您所见,在点后有1或3位数字的值的末尾有一个额外的0。这个问题的根本原因是什么?如何预防 我们可以很容易地删除代码中额外的0,但我们希望通过修复底层问题来防止它。谢谢 更新(2018年1月29日): Oracle中的数据类型: 这是获取数据的.NET代码: OracleConnection conn = new OracleCon

我在.NET(使用OracleDataAdapter)和SQL Developer中运行SELECT查询。结果集略有不同:

SQL开发人员返回:

。净回报率:

如您所见,在点后有1或3位数字的值的末尾有一个额外的0。这个问题的根本原因是什么?如何预防

我们可以很容易地删除代码中额外的0,但我们希望通过修复底层问题来防止它。谢谢

更新(2018年1月29日):

Oracle中的数据类型:

这是获取数据的.NET代码:

OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);

if (conn.State != ConnectionState.Open)
    conn.Open();

DataSet hereDataSet = new DataSet();

try
{
    using (OracleCommand oCmd = new OracleCommand())
    {
        oCmd.Connection = conn;
        oCmd.CommandText = "select V_COLUMN from T_TABLE where V_COLUMN='123'"; 

        OracleDataAdapter oDataAdapter = new OracleDataAdapter(oCmd);

        oDataAdapter.SelectCommand = oCmd;
        oDataAdapter.Fill(hereDataSet);
    }
}
catch (Exception ex)
{
    // exception logic
}
finally
{
    if (conn.State == ConnectionState.Open)
    { conn.Close(); }
}

根据MSDN文件:

如果format为null或空字符串,则使用通用数字格式说明符(G)格式化此实例的返回值

我想你想做的是:

var asExpected = oracleDataReader.GetDecimal(0).ToString("G0");

Oracle以不同的方式存储数字。例如,您确定在转到.net decimal时从oracle返回的数字不是33641.700000000001吗。您可能希望使用调试器将一行放入一个正则变量中,并将鼠标悬停在该行上(而不是ToString)以找出…如果是这样,您的解决方案是,因为您只需要3位小数,所以将显式四舍五入到3位。我以前必须这样做。

我创建了一个到Oracle的支持票证。他们告诉我这是个BUG

你确定这是个问题吗?小数点后的尾随零没有数学意义。您在Oracle中使用什么数据类型?您在.Net中使用什么数据类型?你是如何看待结果的?(可能像错误的字符串格式一样简单…)我添加了有关数据类型和.NET代码的信息。我在gridView中显示结果。当我调试它时,我在数据集中看到尾随的零,因此它与gridView或我如何显示数据无关。。。是的,这是一个问题,因为我的业务用户不希望看到额外的零,即使它们没有数学意义。我们希望通过找出根本原因来消除这些零,而不是在中消除它们。我自己也是一个SQL Server人员,oracle数据类型对我来说意义不大。另一方面,.Net数据类型很有趣。如果是a,它会解释为什么你会看到尾随的零。什么是PNG,POL,SEN&TUN?如果它们是另一列的值,那么您没有显示选择它的位置,这导致我认为发布的代码与您使用的代码不对应。另外,您是否尝试在数据网格视图列中放置格式字符串?您没有。它就是这样格式化的。那么你认为这个问题是由ODP.NET的隐式转换过程引起的吗?因为我们没有显式地将小数转换为字符串,正如您在代码中看到的那样。。。有很多方法可以去除这些尾随的零,正如你提到的其中一个,我们想找到根本原因,抱歉花了5个月的时间回复你。我刚刚为我管理的一个应用程序添加了ODP.Net支持,它的DAL使用工厂模式,这是一个31年前的应用程序。所以我添加了odbc,然后是OleDb,现在是ODP.net,每次都有这样的细微差别。这总是与十进制有关,因为MS和Oracle使用不同的类型。这个问题首先出现在.NET1.1中,在.NET2中有一些小的修正。尽管使用ODP.net比OleDB宽容得多,但我将所有数字(9)转换为字符串,然后返回到十进制。我在源代码中记下了这一点,我将在周一发布链接。这是一个很好的观点,但在我的情况下并非如此。我在调试模式下将鼠标悬停在hereDataSet上检查了这些值(我问题中的屏幕截图来自hereDataSet)。此外,我在SQL Developer中查询了DB,并确认了值。感谢您确认。