我有以下代码
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(不需要,但我更喜欢这样做)
谢谢