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' 到 'Oracle.DataAccess.Client.OracleConnection'.
抛出一个 InvalidCastException
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>
。
我有以下代码
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' 到 'Oracle.DataAccess.Client.OracleConnection'.
抛出一个 InvalidCastExceptioncmd.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>
。