在Oracle DB中存储.NET double值

时间:2010-09-22 15:02:34

标签: oracle types double sqldatatypes

我正在使用ODP.NET从C#.NET访问Oracle DB。 请参阅以下代码:

  OracleConnection con = new OracleConnection();
  con.ConnectionString = "User Id=user;Password=pass;Data Source=localhost/orcl";
  con.Open();

  /* create table */
  DbCommand command = con.CreateCommand();
  command.CommandType = CommandType.Text;

  try
  {
    command.CommandText = "DROP TABLE TEST";
    command.ExecuteNonQuery();
  }
  catch
  {
  }

  //command.CommandText = "CREATE TABLE TEST (VALUE BINARY_DOUBLE)";
  command.CommandText = "CREATE TABLE TEST (VALUE FLOAT(126))";
  command.ExecuteNonQuery();

  /* now insert something */
  double val = 0.8414709848078965;
  command.CommandText = "INSERT INTO TEST VALUES (" + val.ToString(System.Globalization.CultureInfo.InvariantCulture) + ")";
  command.ExecuteNonQuery();

  /* and now read inserted value */
  command.CommandText = "SELECT * FROM TEST";
  DbDataReader reader = command.ExecuteReader();

  reader.Read();
  double res = (double) (decimal)reader[0];

  Console.WriteLine("Inserted " + val + " selected " + res);

此输出始终为: 已插入0,841470984807897选择0,841470984807897

但是看看调试器下的变量值 val == 0.8414709848078965 res == 0,841470984807897

为什么res被四舍五入?

我查看了数据库,并且存储了舍入值。

另一方面,我使用Oracle SQL Developer来修改这个值,我能在数据库中存储0.8414709848078965吗?

我尝试了类型NUMBER,FLOAT(126),BINARY_DOUBLE ...总是相同的结果。

为什么使用ODP.NET会出现问题?

2 个答案:

答案 0 :(得分:1)

好的,我发现如果参数类型为OracleDbType.BinaryDouble,它会起作用。但它导致我的代码依赖于ODP.NET。我想使用ADO.NET类型(DbType)来实现我的代码独立性。

答案 1 :(得分:0)

实际上,Oracle的数字精度高于.net!
我在直接的Oracle中尝试了这个并且它工作正常,我建议更改为使用参数

e.g。

-- CREATE TABLE TEST (VALUE NUMBER(38,38)); (initial test)

INSERT INTO TEST VALUES (0.8414709848078965);

SELECT * FROM TEST;
VALUE                  
---------------------- 
0.8414709848078965 

(recommendation)
OracleParameter param = cmd.CreateParameter();  
param.ParameterName = "NUMBERVALUE";  
param.Direction = ParameterDirection.Input;  
param.OracleDbType = OracleDbType.Decimal;  
param.Value = "0.8414709848078965";  
command.Parameters.Add(param);