我正在使用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会出现问题?
答案 0 :(得分:1)
好的,我发现如果参数类型为OracleDbType.BinaryDouble
,它会起作用。但它导致我的代码依赖于ODP.NET。我想使用ADO.NET类型(DbType)来实现我的代码独立性。
答案 1 :(得分:0)
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);