我正在使用ODP.NET(Oracle.ManagedDataAccess)在具有可插入数据库的Oracle 12.2.0.1.0数据库上运行查询。在删除列后立即使用OracleDataAdapter时遇到错误。错误为“ ORA-01007:变量不在选择列表中”。
该问题仅在以下情况下发生:
这就像是在缓存列(我在命令中使用select *)。有谁知道ODP.net驱动程序是否进行这种内部缓存以及是否可以清除它?
DataTable dt1 = new DataTable();
DataTable dt2 = new DataTable();
using(var con = new OracleConnection(TestConnectionStrings[DatabaseType.Oracle]))
{
con.Open();
//OracleCommand drop = new OracleCommand("DROP TABLE RaceTable2", con);
//drop.ExecuteNonQuery();
OracleCommand create = new OracleCommand("CREATE TABLE RaceTable2 ( A int NOT NULL, B int NOT NULL, C int NOT NULL, D int NOT NULL, E int NOT NULL)",con);
create.ExecuteNonQuery();
var da = new OracleDataAdapter("select * from RaceTable2",con);
da.Fill(dt1);
OracleCommand dropCol = new OracleCommand("ALTER TABLE RaceTable2 DROP COLUMN E", con);
dropCol.ExecuteNonQuery();
var da2 = new OracleDataAdapter("select * from RaceTable2", con);
da2.Fill(dt2); //crashes on this line
}
答案 0 :(得分:0)
因此,我认为它可能与Implicit Statement Caching有关。我在ALTER之后添加了对PurgeStatementCache的调用,这似乎可以解决该问题:
con.PurgeStatementCache();
我只能假定这是服务器端,因为即使为第二个select *打开新连接也没有用。
或者是基于时间的事情,而该调用只是在服务器上浪费了一些时间。