Хранение двойного значения .NET в БД Oracle - PullRequest
0 голосов
/ 22 сентября 2010

Я использую ODP.NET для доступа к БД Oracle из C # .NET. Пожалуйста, смотрите следующий код:

  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 ]

1 голос
/ 23 сентября 2010

ОК, я обнаружил, что это работает, если тип параметра OracleDbType.BinaryDouble. Но это заставляет мой код зависеть от ODP.NET. Я хотел использовать типы ADO.NET (DbType) для достижения моей независимости кода.

0 голосов
/ 22 сентября 2010

Oracle на самом деле имеет более высокую точность своих чисел, чем .net!
Я пробовал это в прямой Oracle, и она отлично работает, я рекомендую изменить для использования параметра

, например

-- 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); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...