OracleDataAdapter.Fill在发出DROP COLUMN后给出错误

时间:2019-01-15 14:11:08

标签: c# oracle odp.net

我正在使用ODP.NET(Oracle.ManagedDataAccess)在具有可插入数据库的Oracle 12.2.0.1.0数据库上运行查询。在删除列后立即使用OracleDataAdapter时遇到错误。错误为“ ORA-01007:变量不在选择列表中”。

该问题仅在以下情况下发生:

  1. 创建并使用OracleDataAdapter(选择*)
  2. 从表中删除一列
  3. 创建并使用另一个OracleAdapter(选择*)

这就像是在缓存列(我在命令中使用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
}

1 个答案:

答案 0 :(得分:0)

因此,我认为它可能与Implicit Statement Caching有关。我在ALTER之后添加了对PurgeStatementCache的调用,这似乎可以解决该问题:

con.PurgeStatementCache();

我只能假定这是服务器端,因为即使为第二个select *打开新连接也没有用。

或者是基于时间的事情,而该调用只是在服务器上浪费了一些时间。