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

时间:2015-03-12 13:40:49

标签: c# .net oracle odp.net

我有以下代码

            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);
    }

在下一行中,它会将“Oracle.DataAccess.Client.OracleConnection”中的InvalidCastException抛出到“Oracle.DataAccess.Client.OracleConnection”。

cmd.Connection = conn;

我很困惑......

我正在引用Oracle.DataAccess版本2.121.2.0
有人可以解释一下我缺少的东西吗?

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

我按照SLaks给出的建议,我发现

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

执行另一个版本的Oracle.DataAccess.dll加载(GAC上的那个)。具体版本为2.112.3.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.Client 2.121.2.0(不是必需的,但我更喜欢这样做)

谢谢!

1 个答案:

答案 0 :(得分:1)

如果Machine.config中的<DbProviderFactories>元素引用了不同版本的Oracle.DataAccess程序集,则会发生这种情况。

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

相关问题