Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Обработка ошибок при работе с базами данными

6.0K
08 июля 2008 года
Tramp
71 / / 25.07.2006
Подскажите как это делать правильно, я это делаю следующим образом:
Код:
Query->Close();
Query->SQL->Clear();
Query->SQL->Add( "SELECT [id] FROM Table1" );
 try
 {
  Query->Open();
 }
 catch(...)
 {
  ShowMessage("Ошибка!");
 }

Городить такие конструкции неудобно и не красиво.
Может это можно сделать через обработку событий?
9.5K
08 июля 2008 года
ROLpogo
80 / / 22.08.2006
Может так?
Код:
bool OpenQuery(TQuery *pQuery, AnsiString ErrorMsg)
{
  try
  {
    pQuery->Open();
  }
  catch(...)
  {
    ShowMessage(ErrorMsg.c_str());
    return false;
  }
  return true;
}

 
Код:
Query->Close();
Query->SQL->Clear();
Query->SQL->Add( "SELECT [id] FROM Table1" );
OpenQuery(Query, "Ошибка!")
6.0K
09 июля 2008 года
Tramp
71 / / 25.07.2006
ROLpogo спасибо :)
246
09 июля 2008 года
GIZMO
1.8K / / 30.07.2004
Цитата: ROLpogo
Может так?
Код:
bool OpenQuery(TQuery *pQuery, AnsiString ErrorMsg)
{
  try
  {
    pQuery->Open();
  }
  catch(...)
  {
    ShowMessage(ErrorMsg.c_str());
    return false;
  }
  return true;
}

 
Код:
Query->Close();
Query->SQL->Clear();
Query->SQL->Add( "SELECT [id] FROM Table1" );
OpenQuery(Query, "Ошибка!")



а что не судьба указать в catch() какой тип исключений перехватывать? например EDBEngineError...
а так код бессмысленный получается, что не случись "Ошибка"

6.0K
09 июля 2008 года
Tramp
71 / / 25.07.2006
А разве нельзя обрабатывать все ошибки вот тут
 
Код:
void __fastcall TMain::QueryEditError(TDataSet *DataSet,
      EDatabaseError *E, TDataAction &Action)
{

}


?
332
09 июля 2008 года
Valiant
416 / / 27.09.2004
и ещё хорошо бы добавить
Query->ExecSQL();
Код:
bool OpenQuery(TQuery *pQuery, AnsiString ErrorMsg)
{
  try
  {
    pQuery->Open();
  }
  catch(EDBEngineError)
  {
    try
    {
       Query->ExecSQL();
    }catch(EDBEngineError)
    {
     ShowMessage(ErrorMsg.c_str());
     return false;
    }
  }
  return true;
}

примерно так. Мог где то ошибиться
246
10 июля 2008 года
GIZMO
1.8K / / 30.07.2004
Цитата: Tramp
А разве нельзя обрабатывать все ошибки вот тут
 
Код:
void __fastcall TMain::QueryEditError(TDataSet *DataSet,
      EDatabaseError *E, TDataAction &Action)
{

}

?


Все нельзя, т.к. - Write an OnEditError event handler to handle exceptions that occur when an attempt to edit a record fails.

1. Обычно все библиотеки или компонеты определяют класс исключения (обычно определяют) где предусматривается № ошибки, сообщения о ошибке и т.п. полезная информация.
2. В "узких" местах (типа TQuery::Open) если вдруг, что не так - заявляется это исключение/исключения
3. В catch() - указывается какой тип исключеения ловить, а там можно вывести информацию о причине исключения

т.е. д.б. примерно так:

Код:
void OpenQuery(TQuery *pQuery)
{
  try
  {
    pQuery->Open();
  }
  catch(EDBEngineError& e)
  {
     ShowMessage(e.Message); // сообщение о ошибке
   }

}


ЗЫ: а если catch(...), то хватаются исключения любого типа
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог