Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Поблема с кэшированием ODP.NET после ALTER TABLE  [new]
-KSV-
Member

Откуда:
Сообщений: 4
Кажется я обнаружил баг с кэшированием запросов в ODP.NET. Помогите плиз его обойти.

После того как я добавляю колонку с помощью ALTER TABLE при перезачитке таблицы с помощью запроса SELECT * новая колонка не отображается в результатах запроса.

Вот пример:
using System.Data;
using Oracle.DataAccess.Client;
…

    OracleDataAdapter FAdapter;
    OracleCommandBuilder FBuilder;
    DataSet FDataSet;
    DataTable FDBTable;

    // Соединяемся с базой
    OracleConnection FOracleConnection = new OracleConnection("user id=MyUser;password=MyPass;data source=localhost:1521/XE");
    FOracleConnection.Open();

    // Читаем записи первый раз
    FAdapter = new OracleDataAdapter("SELECT * FROM MyTable", FOracleConnection);
    FBuilder = new OracleCommandBuilder(FAdapter);
    FDataSet = new DataSet("MyDataSet");
    FAdapter.Fill(FDataSet, "Data");
    FDBTable = FDataSet.Tables["Data"];
    foreach (DataColumn Col in FDBTable.Columns)
        Console.WriteLine(Col);

    // Добавляем колонку в таблицу
    OracleCommand FCommand = new OracleCommand("ALTER TABLE MyTable ADD MyColumn VARCHAR2 (4000)", FOracleConnection);
    FCommand.Prepare();
    FCommand.ExecuteNonQuery();
    FCommand.Dispose();

    // Читаем записи второй раз
    FAdapter = new OracleDataAdapter("SELECT * FROM MyTable", FOracleConnection);
    FBuilder = new OracleCommandBuilder(FAdapter);
    FDataSet = new DataSet("MyDataSet");
    FAdapter.Fill(FDataSet, "Data");
    FDBTable = FDataSet.Tables["Data"];
    foreach (DataColumn Col in FDBTable.Columns) 
        Console.WriteLine(Col);
Сейчас FDBTable содержит только колонки, которые в ней были до вызова ALTER TABLE. Колонки ‘MyColumn’ нету в FDBTable.
Замечу, что если удалить кусок кода, который читает таблицу в 1й раз, то 2й раз читаются все колонки, включая только что добавленную.

Даже радикальные меры вроде закрытия OracleConnection и открытия заново не помогают. Помогает только полная остановка приложения и запуск снова.
15 мар 06, 12:55    [2450498]     Ответить | Цитировать Сообщить модератору
 Re: Поблема с кэшированием ODP.NET после ALTER TABLE  [new]
-KSV-
Member

Откуда:
Сообщений: 4
Небольшое добавление...

Если писать вот так:
FAdapter = new OracleDataAdapter("SELECT MyColumn FROM MyTable", FOracleConnection);

то колонку видит.
но даже если после этого вызвать SELECT *, то новой колонки в результатах запроса не будет
15 мар 06, 14:49    [2451253]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Поблема с кэшированием ODP.NET после ALTER TABLE  [new]
prog72
Guest
Столкнулся с этой же проблемой. + к тому что описано: после удаления колонки при повторном SELECT-е вылазит ошибка ORA-01007 Variable not in select list. Если установить у объекта OracleCommand AddToStatementCache = false, что по идее должно отключить кеширование команды, ошибка для OracleDataReader исчезает, но список полей остается старый.
using (OracleCommand cmd = m_con.CreateCommand())
{
    cmd.AddToStatementCache = false;
    cmd.CommandText = "SELECT * FROM \"TEST_CACHE\" WHERE 1=0";
    OracleDataReader rdr = cmd.ExecuteReader();
    for (int i = 0; i < rdr.FieldCount; i++)
    {
        listBox1.Items.Add(rdr.GetName(i));
    }
    rdr.Dispose();
}
Для OracleDataAdapter ошибка ORA-01007 все равно остается.
 using (OracleCommand cmd = m_con.CreateCommand())
 {
    DataTable dt = new DataTable();
    cmd.AddToStatementCache = false;
    cmd.CommandText = "SELECT * FROM \"TEST_CACHE\"";
    OracleDataAdapter da = new OracleDataAdapter(cmd);
    da.Fill(dt);
    dataGridView1.DataSource = dt;
}
Может кто нибудь знает как обойти эту ошибку ODP.NET
В клиенте Oracle от Microsoft такой ошибки нет, но они отказались от поддержки этого клиента, да и много кода уже написано с клиентом от Oracle.
8 сен 10, 15:34    [9405062]     Ответить | Цитировать Сообщить модератору
 Re: Поблема с кэшированием ODP.NET после ALTER TABLE  [new]
trashcan
Member [заблокирован]

Откуда:
Сообщений: 144
а вам точно надо на ходу колонки удалять? встречал что то подобное когда в PL/SQL когда в одном BEGIN END добавлял столбец и дальше в EXECUTE IMMEDIATE пытался его прочитать
8 сен 10, 15:45    [9405129]     Ответить | Цитировать Сообщить модератору
 Re: Поблема с кэшированием ODP.NET после ALTER TABLE  [new]
prog72
Guest
Мне нужно отделять атрибутику от основной информации. Да и при пересоздании таблицы с другой структурой выдается старая структура.
Мне нужно узнать имена колонок таблицы для создания view, нашел способ решения:
SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME='...'
9 сен 10, 09:19    [9408432]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить