C# Oracle ManagedDataAccess GetDecimal指定的强制转换无效

C# Oracle ManagedDataAccess GetDecimal指定的强制转换无效,c#,oracle,entity-framework,entity-framework-6,oracle-manageddataaccess,C#,Oracle,Entity Framework,Entity Framework 6,Oracle Manageddataaccess,我使用的是EF6 Oracle.ManagedDataAccess v18.3.0,数据库优先概念(edmx)。问题在于Oracle表存储的数字精度较高(38位),这是Oracle数字映射到的默认十进制C#数据类型。小数的精度最大为28-29位。由于OracleManagedDataAccess提供程序抛出以下exeption: 位于Oracle.ManagedDataAccess.Client.OracleDataReader.GetDecimal(Int32 i) 位于System.Data

我使用的是EF6 Oracle.ManagedDataAccess v18.3.0,数据库优先概念(edmx)。问题在于Oracle表存储的数字精度较高(38位),这是Oracle数字映射到的默认十进制C#数据类型。小数的精度最大为28-29位。由于OracleManagedDataAccess提供程序抛出以下exeption:

位于Oracle.ManagedDataAccess.Client.OracleDataReader.GetDecimal(Int32 i) 位于System.Data.Entity.Core.Objects.Internal.ShapedBufferedDataRecord.ReadDecimal(DbDataReader,Int32序号) 位于System.Data.Entity.Core.Objects.Internal.ShapedBufferedDataRecord.Initialize(DbDataReader、DBPatialDataReader、spatialDataReader、Type[]columnTypes、Boolean[]nullableColumns) 位于System.Data.Entity.Core.Objects.Internal.ShapedBufferedDataRecord.Initialize(String providerManifestToken、DbProviderServices providerServices、DbDataReader reader、Type[]columnTypes、Boolean[]nullableColumns) 位于System.Data.Entity.Core.Objects.Internal.BufferedDataReader.Initialize(String providerManifestToken、DbProviderServices providerServices、Type[]columnTypes、Boolean[]nullableColumns) 位于System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext上下文,ObjectParameterCollection parameterValues) 在System.Data.Entity.Core.Objects.ObjectQuery
1.c__DisplayClassb.b__a()中
在System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func
1 Func,IDbExecutionStrategy executionStrategy,Boolean startLocalTransaction,Boolean releaseConnectionOnSuccess) 在System.Data.Entity.Core.Objects.ObjectQuery
1.c__DisplayClassb.b__9()中
在System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute[TResult](Func
1操作)中 位于System.Data.Entity.Core.Objects.ObjectQuery
1.GetResults(Nullable
1 forMergeOption) 在System.Data.Entity.Core.Objects.ObjectQuery
1.b_u0()中
在System.Lazy
1.CreateValue()处 在System.Lazy
1.LazyInitValue()处
在System.Lazy中
1.get_Value() 在System.Data.Entity.Internal.LazyEnumerator
1.MoveNext()中
在System.Linq.Enumerable.First[TSource](IEnumerable
1 source) 位于System.Data.Entity.Core.Objects.elink.ObjectQueryProvider.b__0[TResult](IEnumerable
1序列)
在System.Data.Entity.Core.Objects.Elink.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable
1查询,表达式queryRoot) 位于System.Data.Entity.Core.Objects.Elink.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[TResult](表达式) 在System.Data.Entity.Internal.Linq.DbQueryProvider.Execute[TResult](表达式)处 在System.Linq.Queryable.First[TSource](IQueryable`1 source)处 在C:\Users\sl0gas\Desktop\JiraRepo\Proizvodnja\transportnicericertifikatigots\transakcijskicertifikatts\transakcijskicertifikatts\Program.cs中的transakcijskicertifikatts.Program.Main(字符串[]args)处:第34行

是否有已知的解决此问题的方法?到目前为止,我已经尝试过这个:

  • 将导致edmx文件中出现问题的特定成员的精度设置为28
  • 将App.config更改为以下配置并尝试不同的选项

      <edmMappings>
    <edmNumberMapping>
      <add NETType="bool" MinPrecision="1" MaxPrecision="1" DBType="Number" />
      <add NETType="int16" MinPrecision="2" MaxPrecision="5" DBType="Number" />
      <add NETType="int32" MinPrecision="6" MaxPrecision="10" DBType="Number" />
      <add NETType="int64" MinPrecision="11" MaxPrecision="19" DBType="Number" />
      <add NETType="Decimal" MinPrecision="20" MaxPrecision="28" DBType="Number" />
      <add NETType="String" MinPrecision="29" MaxPrecision="38" DBType="Number" />
    </edmNumberMapping>
    
    
    

  • 将默认强制转换从Decimal更改为string,这样我就可以手动转换为Decimal或double,但是提供程序抛出无效强制转换异常


  • 我正在使用LINQ语法查询数据库

    我有一个函数调用和一个表的问题。对于表列,我将.NET类型更改为double并处理了转换-到目前为止,我还没有遇到任何精度问题

    我对函数调用的解决方法如下:

    var command = "some_oracle_function(:first_parameter)";
    
    var xx = context.Database.SqlQuery<string>(command, firstParameter).SingleOrDefault();
    var oracleDecimal = new OracleDecimal(xx);
    return oracleDecimal.IsNull ? 0 : OracleDecimal.SetPrecision(oracleDecimal, 28).Value
    
    var命令=“某些函数(:第一个参数)”;
    var xx=context.Database.SqlQuery(command,firstParameter).SingleOrDefault();
    var oracleDecimal=新的oracleDecimal(xx);
    返回oracleDecimal.IsNull?0:OracleDecimal.SetPrecision(OracleDecimal,28).Value
    

    我强制响应为字符串并生成一个新的OracleDecimal(这允许大量溢出的十进制数),然后在.NET framework中将其转换为可处理的大小,并返回有效的十进制值。这对我来说已经有一段时间没有问题了。

    问题是我正在使用Linq查询从数据库中获取数据。正如我看到的,您以字符串格式使用SQL,然后将其传递给ManagedProvider。当然,我可以切换到这种方法,但Linq有一些我在这种情况下需要的优点。尝试在中使用double作为列类型。如果我这样做,则它会抛出此类错误“error 2019:指定的成员映射无效。类型“”中的成员“”的类型Edm.double[Nullable=True,DefaultValue=]。。。与OracleEFProcider.number不兼容[Nullable=True,DefaultValue=,精度=38,刻度=0]