Какой самый сухой способ получить данные из моей базы данных? - PullRequest
0 голосов
/ 30 января 2009

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

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

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

mvAccount myAccount = new mvAccount(serverName, login);

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

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

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

myAccount.Logout();

У меня есть класс для каждого модуля, поэтому у меня могут быть счета-фактуры, PURCHASE_ORDER, RMA, REQ, SHIPMENT и т. Д. В рамках СЧЕТА мне может потребоваться доступ к нескольким таблицам, таким как ЗАКАЗЧИК, СЧЕТ, УСЛОВИЯ, SHIPVIA и т. Д.

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

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

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

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 30 января 2009

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

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

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

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

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

...