代码之家  ›  专栏  ›  技术社区  ›  Matteo Umili

DbCommand.set_DbConnection上从“OracleConnection”到“OracleConnection“的InvalidCastException

  •  0
  • Matteo Umili  · 技术社区  · 9 年前

    我有以下代码

                using (DbConnection conn = new Oracle.DataAccess.Client.OracleConnection(
                    @"<connectionString>"))
                {
                    conn.Open();
                    DbProviderFactory fact = GetFactory(conn);
                    using (DbCommand cmd = fact.CreateCommand())
                    {
                        cmd.CommandText = "SELECT * FROM TAB";
                        cmd.Connection = conn;
                        using (DbDataAdapter dda = fact.CreateDataAdapter())
                        {
                            dda.SelectCommand = cmd;
                            using (DataTable dt = new DataTable("TAB"))
                            {
                                dda.Fill(dt);
                            }
                        }
                    }
                }
    

    GetFactory方法是这样的(我必须编写这个实现,因为我使用的是.NET 3.5,它没有DbProviderFactories.GetFactory(DbConnection)):

        static DbProviderFactory GetFactory(DbConnection conn)
        {
            return DbProviderFactories.GetFactory(conn.GetType().Namespace);
        }
    

    在下一行,它将InvalidCastException从“Oracle.DataAccess.Client.OracleConnection”抛出到“Oracle.DDataAccess.Client.OracleConnection。”。

    cmd.Connection = conn;
    

    我很困惑。。。

    我引用的是Oracle.DataAccess版本2.121.2.0
    有人能告诉我我缺什么吗?

    编辑1------------------

    我遵循了SLaks的建议,我发现

    return DbProviderFactories.GetFactory(conn.GetType().Namespace);
    

    已加载另一版本的Oracle.DataAccess.dll(GAC上的版本)。具体版本为2.11.2.0。

    为什么不使用以前加载的版本?

    编辑2------------------

    正如SLaks在他的第二个建议中所说,我的machine.config有问题,就像:

    <add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description="Oracle Data Provider for .NET" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=2.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    

    所以我解决了编辑它:

    <add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description="Oracle Data Provider for .NET" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=2.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    

    并在GAC中安装Oracle.DataAccess.Client2.121.2.0(不需要,但我更喜欢这样做)

    谢谢

    1 回复  |  直到 9 年前
        1
  •  1
  •   SLaks    9 年前

    如果 <DbProviderFactories> Machine.config中的元素引用了不同版本的Oracle.DataAccess程序集。

    您可以更改任一版本以匹配,也可以添加 <bindingRedirect> 在App.config中。