соединение с базой данных с помощью «попробуй наконец» - PullRequest
3 голосов
/ 07 июля 2011

Может ли кто-нибудь просветить меня по поводу обработки соединения с базой данных (и ошибок) с помощью try finally?Какова будет лучшая практика?Видел разные стили, но мне интересно, что будет лучшим подходом.Следует ли открывать таблицы в блоке TRY или только в основной строке соединения?Так как я обычно помещаю свою базу данных (абсолютная база данных, доступ ..) в мою exe-папку, я задавался вопросом о наилучшем подходе к этому ... Или сначала проверяю файл как ...

if (FileExists(sDatabasePath)) then begin
    ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+sDatabasePath+';Persist Security Info=False';
    try
        ADOConnection1.Connected:=True;
        ADOTable1.Open;
    except
        ShowMessage ('cant access the database !');
    end;
end;

??

Ответы [ 2 ]

2 голосов
/ 07 июля 2011

Комментарии:

  • Никогда не глотайте исключения, как вы, по сути, делаете в вашем ShowMessage случае. Код, вызывающий вашу процедуру, не сможет узнать, что что-то пошло не так. Обрабатывайте ошибки только в том случае, если вы можете их исправить или позволить всплыть в обработчике ошибок приложения, где они будут отображаться для пользователя.
  • В зависимости от того, как работает ваш код, вы можете захотеть защитить соединение с базой данных с помощью try-finally, поэтому после завершения работы вы отключаетесь. Я не делаю этого, я обычно оставляю соединение открытым в течение всего срока службы приложения.
  • В зависимости от того, что вы делаете с ADOTable1, вы можете убедиться, что он закроется, как только вы закончите, используя его с другим try-finally блоком. Я обычно делаю это, потому что я не использую DB-знающие элементы управления графическим интерфейсом и я фанат контроля. Я также обрабатываю транзакцию вручную (запуск транзакции / принятие / откат)
  • Не игнорируйте ошибки. если ваша база данных не существует (то есть: FileExists() возвращает false), код, вызывающий вашу процедуру, ничего не знает и пользователь не знает.

Вот как я бы переписал ваш код:

if (FileExists(sDatabasePath)) then 
  begin
      ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+sDatabasePath+';Persist Security Info=False';
      ADOConnection1.Connected:=True;
      try
        ADOTable1.Open;
        try
          // Do non-GUI database stuff here.
        finally ADOTabel1.Close;
        end;
      finally ADOConnection1.Connected := False;
      end;
  end
else
  raise Exception.Create('Database file not found');
1 голос
/ 07 июля 2011

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

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

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