[A]Oracle.ManagedDataAccess.Client.OracleParameter不能强制转换为[B]Oracle.ManagedDataAccess.Client.OracleParameter

bxjv4tth  于 2023-03-29  发布在  Oracle
关注(0)|答案(2)|浏览(162)

I'm the below error while running my code to get data from Oracle DB.
[A]Oracle.ManagedDataAccess.Client.OracleParameter cannot be cast to [B]Oracle.ManagedDataAccess.Client.OracleParameter. Type A originates from 'Oracle.ManagedDataAccess, Version=4.122.18.3, Culture=neutral, PublicKeyToken=89b483f429c47342' in the context 'LoadFrom' at location 'd:\Users\mukadfar\AppData\Local\Temp\Temporary ASP.NET Files\vs\02d43168\78988466\assembly\dl3\95159e45\00d2c436_a83bd401\Oracle.ManagedDataAccess.dll'. Type B originates from 'Oracle.ManagedDataAccess, Version=4.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342' in the context 'Default' at location 'd:\Users\mukadfar\AppData\Local\Temp\Temporary ASP.NET Files\vs\02d43168\78988466\assembly\dl3\0b972c52\00ac59cd_7dd5d201\Oracle.ManagedDataAccess.dll'.
Here is my code for the same:

var param1 = "K60";
                var param2 = "2018.09.14";
                var param3 = "2018.09.14";
                var param4 = string.Empty;
                var param5 = string.Empty;
                var param6 = string.Empty;
                var param7 = string.Empty;
                var param8 = string.Empty;
                var param9 = string.Empty;
                var param10 = string.Empty;
                var param11 = string.Empty;
                var param12 = string.Empty;
                var param13 = string.Empty;
                var param14 = string.Empty;
                var param15 = string.Empty;
                var param16 = string.Empty;
                var param17 = string.Empty;
                var param18 = string.Empty;
                var parameters = new[]
                {
                    new OracleParameter("wr_proccode_PM_cmb_C179", OracleDbType.Varchar2, 100, param1 != null ? (object)param1 : DBNull.Value, ParameterDirection.Input),
                    new OracleParameter("wr_start_day_C179", OracleDbType.Varchar2, 100, param2 != null ? (object)param2 : DBNull.Value, ParameterDirection.Input),
                    new OracleParameter("wr_end_day_C179", OracleDbType.Varchar2, 100, param1 != null ? (object)param3 : DBNull.Value, ParameterDirection.Input),
                    new OracleParameter("wr_operating_efficiency_total", OracleDbType.Decimal, 4000, param4 != null ? (object)param4 : DBNull.Value, ParameterDirection.InputOutput),
                    new OracleParameter("wr_time_efficiency", OracleDbType.Decimal, 4000, param5 != null ? (object)param5 : DBNull.Value, ParameterDirection.InputOutput),
                    new OracleParameter("wr_tons_efficiency_total", OracleDbType.Decimal, 4000, param6 != null ? (object)param6 : DBNull.Value, ParameterDirection.InputOutput),
                    new OracleParameter("wr_pope_gross", OracleDbType.Decimal, 4000, param7 != null ? (object)param7 : DBNull.Value, ParameterDirection.InputOutput),
                    new OracleParameter("wr_packed_net_prod", OracleDbType.Decimal, 4000, param8 != null ? (object)param8 : DBNull.Value, ParameterDirection.InputOutput),
                    new OracleParameter("wr_bottom_waste", OracleDbType.Decimal, 4000, param9 != null ? (object)param9 : DBNull.Value, ParameterDirection.InputOutput),
                    new OracleParameter("wr_avg_gm2", OracleDbType.Decimal, 4000, param10 != null ? (object)param10 : DBNull.Value, ParameterDirection.InputOutput),
                    new OracleParameter("wr_unplanned_shutdown_pcs", OracleDbType.Int32, 4000, param11 != null ? (object)param11 : DBNull.Value, ParameterDirection.InputOutput),
                    new OracleParameter("wr_grade_change_pcs", OracleDbType.Int32, 4000, param12 != null ? (object)param12 : DBNull.Value, ParameterDirection.InputOutput),
                    new OracleParameter("wr_break_pcs", OracleDbType.Int32, 4000, param13 != null ? (object)param13 : DBNull.Value, ParameterDirection.InputOutput),
                    new OracleParameter("wr_break_hr", OracleDbType.Varchar2, 4000, param14 != null ? (object)param14 : DBNull.Value, ParameterDirection.InputOutput),
                    new OracleParameter("wr_unplanned_shutdown_hr", OracleDbType.Varchar2, 4000, param15 != null ? (object)param15 : DBNull.Value, ParameterDirection.InputOutput),
                    new OracleParameter("wr_packed_net_prod_pcs", OracleDbType.Int32, 4000, param16 != null ? (object)param16 : DBNull.Value, ParameterDirection.InputOutput),
                    new OracleParameter("wr_rewinder_net_prod_pcs", OracleDbType.Decimal, 4000, param17 != null ? (object)param17 : DBNull.Value, ParameterDirection.InputOutput),
                    new OracleParameter("wr_warehouse_post_waste", OracleDbType.Decimal, 4000, param18 != null ? (object)param18 : DBNull.Value, ParameterDirection.InputOutput)
                };

                var procedure = $"Begin TP_BALELINE.getNextPlannedObjects(:wr_proccode_PM_cmb_C179, :wr_start_day_C179, :wr_end_day_C179, :wr_operating_efficiency_total, :wr_time_efficiency, :wr_tons_efficiency_total, :wr_pope_gross, :wr_packed_net_prod, :wr_bottom_waste, :wr_avg_gm2, :wr_unplanned_shutdown_pcs, :wr_grade_change_pcs, :wr_break_pcs, :wr_break_hr, :wr_unplanned_shutdown_hr, :wr_packed_net_prod_pcs, :wr_rewinder_net_prod_pcs, :wr_warehouse_post_waste); END;";

                this.databaseContext.ExecuteSqlCommand(
                procedure,
                parameters[0],
                parameters[1],
                parameters[2],
                parameters[3],
                parameters[4],
                parameters[5],
                parameters[6],
                parameters[7],
                parameters[8],
                parameters[9],
                parameters[10],
                parameters[11],
                parameters[12],

Getting the error on the line ExecuteSqlCommand.

cunj1qz1

cunj1qz11#

您需要的所有细节都在错误消息中,这里有一个简短和强调的版本:
[A]Oracle.ManagedDataAccess.Client.OracleParameter不能强制转换为[B] Oracle.ManagedDataAccess.Client.OracleParameter。类型A源自'Oracle.ManagedDataAccess,Version=4.122.18.3,(截取部分文本)类型B源自'Oracle.ManagedDataAccess,Version=4.122.1.0,Culture=neutral,(截取)
这里的问题是您有Oracle.ManagedDataAccess的两个不同的副本和版本,并且您混合了它们之间的类型。
类型的完全限定名不仅仅是文本的,它还包含包含它的程序集的完整版本和签名,因此即使这两个类型在源代码方面甚至在编译方面可能是100%相同的,但它们来自程序集的两个不同版本这一事实使它们不兼容。
你需要做的是找出这两个程序集被引用的位置,找出你想要使用的程序集,并纠正其他引用,以便它们都引用同一版本的程序集。
这应该会让错误消失。

kninwzqo

kninwzqo2#

我遇到了同样的问题,在我的例子中,我有两个版本的Oracle.DataAccess.dll

  • 版本2.111.7.20
  • 版本4.121.2.0

在我正在做的项目中,迁移到更高的框架版本包括这个dll。我没有安装4.x版本,而是在GAC上安装了2.x版本。
在尝试按如下方式更改Web.config后:

<runtime>
  <assemblyBinding appliesTo="v2.0.50727" xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342"/>
      <bindingRedirect oldVersion="2.111.7.20" newVersion="4.121.2.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

它加载4.x版本,但在加载所有dll结束时,它继续从GAC加载2.x版本-覆盖 loaded4.x版本。
我还尝试将编译设置从Any CPU更改为x86-如here所述,在引用dll的所有部分添加4.x版本,清理IIS缓存和临时文件,但是,这些尝试对我不起作用。
查看其他答案-如this one-其中提到在GAC * 中使用安装程序或修改注册表 * 进行安装,但我不能使用这些选项中的任何一个-我正在限制性环境中工作。
为了避免更多的问题,我不得不在所有引用dll的部分添加2.x版本,并在GAC中继续使用加载/安装的版本,现在,这个问题不再出现。

  • 旁注 *:也许,更好的版本是在你的环境中安装你需要的版本,并指定你想在你的项目中工作的版本-如果你有超过一个版本的相同的dll(s)。

相关问题