簡體   English   中英

從DbCommand.set_DbConnection上的'OracleConnection'到'OracleConnection'的InvalidCastException

[英]InvalidCastException from 'OracleConnection' to 'OracleConnection' on DbCommand.set_DbConnection

我有以下代碼

            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(不是必需的,但我更願意這樣做)

謝謝!

如果Machine.config中的<DbProviderFactories>元素引用了不同版本的Oracle.DataAccess程序集,則會發生這種情況。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM