Каков самый СУХОЙ способ получить данные из моей базы данных?

Мне нужно написать приложение ASP.NET, которое подключается к нашей устаревшей базе данных IBM Universe, и мы используем продукт под названием mv.net, который позволяет нам подключаться, читать, писать, выбирать, запускать серверные программы и т. д.

Я хочу, чтобы код повторялся как можно меньше, но я также хочу, чтобы передача данных была как можно меньше.

Чтобы открыть соединение, мы должны сначала получить ссылку на учетную запись, используя такой код:

mvAccount myAccount = new mvAccount(serverName, login);

Затем мы можем прочитать элемент:

mvFile myInvoiceFile = myAccount.FileOpen("INVOICE");
mvItem myInvoiceRecord = myInvoiceFile.Read(invoiceID);

Тогда мы закончили:

myAccount.Logout();

У меня есть класс для каждого модуля, поэтому у меня может быть СЧЕТ, ЗАКАЗ НА ПОКУПКУ, RMA, ЗАПРОС, ОТПРАВКА и так далее. В INVOICE мне может понадобиться доступ к нескольким таблицам, таким как CUSTOMER, INVOICE, TERMS, SHIPVIA и т. д.

Что я планировал сделать, так это создать класс под названием TechDB, который является именем нашей базы данных, и поместить туда код, поэтому в моем классе INVOICE я могу просто сказать:

TechDB connection = new TechDB();
mvItem myInvoiceRecord = connection.Read("INVOICE", invoiceID)

Когда я это сделаю, мой класс TechDB откроет соединение, прочитает запись, а затем выйдет из системы за один шаг.

Я думаю, что иду по правильному пути, но, пожалуйста, дайте мне знать, если нет. Вот мои проблемы с этим:

  1. Как мне вернуть ошибки моего класса INVOICE? Например, ошибки могут возникать, если мы не можем подключиться к базе данных, не можем открыть файл, не можем прочитать запись.

  2. Что, если мне тогда нужно будет взять некоторые данные из моего СЧЕТА, а затем прочитать таблицу УСЛОВИЯ. Мне бы не хотелось открывать новое соединение с базой данных, когда я только что открыл его.

  3. Должен ли я вызывать метод Dispose для всех классов, у которых есть это? Например, у mvAccount есть метод Dispose. Ни в одной документации не говорится, что это нужно вызывать, но должен ли я после Logout()?

  4. Могу ли я создать метод Dispose в классе TechDB, который выполняет myAccount.Logout()? Таким образом, соединение останется открытым, и я смогу закрыть его из класса INVOICE, когда полностью закончу с ним?

Дайте мне несколько мнений о том, как лучше всего справиться с этим? Моя цель — надежное приложение, которое легко модифицировать и как можно меньше повторять код.


person Mike Roosa    schedule 30.01.2009    source источник


Ответы (2)


Я бы использовал замыкания, я думаю, что для С# у вас есть делегаты. Итак, что-то вроде:

MyAccount.loginAndDo(servername, login, delegate(account){
   invoice = account.read("INVOICE");
   .
   .
   .
});

В loginAndDo вы должны войти в систему, вызвать делегата, а затем закрыть учетную запись.

person airportyh    schedule 30.01.2009

  1. Пользовательские классы исключений
  2. Одной из идей было бы создание пакетных запросов (список делегатов).

согласно 3/4. В моем случае все мои объекты доступа к данным наследуются от класса, который содержит статическую ссылку на соединение. Я не решаюсь реализовать логику отключения в Dispose из-за возможности отключения питания, сбоя системы или чего-то еще, и это соединение не будет разорвано.

person Steven Evers    schedule 30.01.2009