Замена адаптеров таблиц на Oracle.DataAccess.Client (ODP.NET)

У меня есть устаревший DAL с примерно 100 адаптерами таблиц (DataSet xsd), но поскольку у нас появились новые серверы с клиентом Oracle 12c, мне пришлось переключиться на Oracle.DataAccess.Client (ODP.NET) со старого устаревшего System.Data.OracleClient.

Единственная проблема, с которой я сейчас сталкиваюсь, заключается в том, что я всегда получаю сообщение об ошибке: ORA-01008: Не все переменные связаны при вызове адаптеров таблиц.

Я прочитал, что мне нужно установить BindByName в true в OracleCommand для каждого адаптера таблицы. Но как это сделать, если OracleCommand используется только в конструкторе самого TableAdapter?

Есть ли способ сделать это без расширения каждого адаптера таблицы, потому что у меня их около 100.


person Gaui    schedule 18.07.2014    source источник
comment
Итак, вы говорите, это дизайнер. Это означает, что на каждой вашей форме или элементе управления он есть? Как насчет использования некоторого уровня доступа к данным?   -  person T.S.    schedule 19.07.2014
comment
Как я уже сказал, это устаревшая кодовая база, которая вначале была не очень хорошо спроектирована. Существует DAL с адаптерами таблиц, затем есть BLL со службами WCF, которые возвращают эти адаптеры таблиц, поэтому все адаптеры таблиц идут полностью до пользовательского интерфейса. Но сейчас это не проблема, поскольку мы пытаемся двигаться по одному шагу, и на этот раз он переключается с устаревшего System.Data.OracleClient на новый Oracle.DataAccess.Client. Но это BindByName усложняет задачу, потому что у нас около 100 адаптеров таблиц.   -  person Gaui    schedule 19.07.2014
comment
Можете ли вы опубликовать фрагменты кода с точным кодом, приводящим к этой ошибке? Возможно, проблема не в том, где вы думаете. Я помню, что System.Data.OracleClient УЖАСНО управлял переменными связывания, хотя я не помню, отличался ли синтаксис от основного синтаксиса ODP.   -  person Hambone    schedule 19.07.2014
comment
Насколько я помню, BindByName - это свойство команды, а не адаптера. Таким образом, вы можете продолжать передавать свои адаптеры, как и раньше. И все, что вам нужно сделать при доступе к данным, - это заменить каждую команду командой, возвращающей метод, и в этом методе сделать только один раз для всей базы кода bindbyname   -  person T.S.    schedule 19.07.2014
comment
@ Т.С. OracleCommand встроен в каждый конструктор TableAdapter. Это создает проблему.   -  person Gaui    schedule 19.07.2014
comment
Но именно поэтому вы программист. Реорганизуйте вещь и сделайте ее многоразовой.   -  person T.S.    schedule 19.07.2014
comment
Да, я мог бы расширить каждый адаптер таблиц и добавить функцию, которая устанавливает BindByName=true для каждого элемента в CommandCollection, но мы говорим о более чем 100 адаптерах таблиц, поэтому я искал более простой и универсальный метод.   -  person Gaui    schedule 20.07.2014
comment
Я нашел этот ответ. Может ли это сработать?   -  person Gaui    schedule 21.07.2014


Ответы (1)


Что я сделал, так это расширил каждый адаптер таблиц и создал новый метод SetBindByName(), в котором принудительно использовал BindByName = true коллекцию OracleCommand.

Вот так...

public partial class V_CUSTOMER_GLOBALTableAdapter
{
    public void SetBindByName(bool value = true)
    {
        foreach (Oracle.DataAccess.Client.OracleCommand cmd in this.CommandCollection)
        {
            cmd.BindByName = value;
        }
    }
}

Затем, когда я создал экземпляр TableAdapter, я вызвал новый метод SetBindByName().

V_CUSTOMER_GLOBALTableAdapter ta = new V_CUSTOMER_GLOBALTableAdapter();
ta.SetBindByName(true);
person Gaui    schedule 30.08.2015