OracleDataAdapter.Fill выдает ошибку после выдачи DROP COLUMN - PullRequest
0 голосов
/ 15 января 2019

Я использую 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 голосов
/ 16 января 2019

Так что я думаю, что это может быть связано с неявным кэшированием операторов . Я добавил вызов PurgeStatementCache после ALTER, и это, похоже, исправило это:

con.PurgeStatementCache();

Я могу только предположить, что это удерживается на стороне сервера, так как даже открытие нового соединения для второго выбора * не сработало.

Либо так, либо это основано на времени, и вызов просто убивает время на сервере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...