Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как устранить ошибку подключения к базе данных? [D7, XP]


Сергей ©   (2012-03-06 18:42:00) 

Использую dbExpress Через TSimpleDataSet подключаюсь к Oracle. Подключение осуществлялось. По непонятным пока причинам начала выдавать ошибку
DbExpressError: insufficient memory for operation.
Через SQLNovigator подключаюсь и работаю нормально.

Функция подключения

Function  TfrmMain.LoadTable(NameTable:String; RecShowCount:String; SqlStringFilter:String): boolean;
var
ADOConnection:TADOConnection;
ADOQuery:TADOQuery;
ConnectString: String;
SqlString:String;
RecordCount: Integer;
ListNameCol: TStrings;
ListIndex: Integer;
SqlStringCol,SqlStringData,NOMER,SqlStrRecShow,RowIndMax: String;
begin
 try
   //Screen.Cursor := crSQLWait;
   result:=false;
   ListNameCol:=TStringList.Create;
   //  загружаю поля основной таблицы
   SqlString:='SELECT * FROM ' +NameTable + ' ORDER BY NOMER DESC';
   sdsBase.Active := false;
   sdsBase.DataSet.Active := false;
   sdsBase.DataSet.CommandText := SqlString;
    sdsBase.DataSet.Active := true;  // ЗДЕСЬ ВЫДАЕТ ОШИБКУ
   sdsBase.Active := true;
   sdsBase.Fields.GetFieldNames(ListNameCol);
   // Готовлю фильтр отбора записей по коилеству
   sdsBase.First;
   RowIndMax:=sdsBase.FieldByName('NOMER').AsString;
   SqlStrRecShow:=SqlRecShow('NOMER', RowIndMax, RecShowCount);
   sdsBase.Active := false;
   sdsBase.DataSet.Active := false;
   SqlStringCol:= '';
   SqlStringData:='';
   // фомирую последовательность колонок для sgl запроса
   For ListIndex:=0 to  ListNameCol.Count-2 do
     begin
     SqlStringCol:= SqlStringCol+ ' '+ ListNameCol.Strings[ListIndex]+ ',';
     end;
   SqlStringCol:=AnsiMidStr(SqlStringCol,1, Length(SqlStringCol)-1);
   // конечный запрос к базе данных
   SqlString:='SELECT' +SqlStringCol+' FROM ' +NameTable+ ' WHERE ' + SqlStrRecShow+SqlStringFilter;
   sdsBase.Active := false;
   sdsBase.DataSet.Active := false;
   sdsBase.DataSet.CommandText := SqlString;
   sdsBase.DataSet.Active := true;
   sdsBase.Active := true;
   FillGridFromSQLOracle (stgrTask, sdsBase, GlobParam.gColWith);
   ListNameCol.Free;
   result:=true;
 except on E:Exception do
  begin
  ListNameCol.Free;
  end;
 end;

end;


Loginov Dmitry   (2012-03-06 23:32:00) [1]

За гарантированное освобождение занятых ресурсов отвечает оператор TRY...FINALLY. Можете о нем почитать:
http://www.loginovprojects.ru/index.php?page=tryfinally

TRY...EXCEPT выполняет другие задачи: позволяет перехватить исключение (ошибку), организовать действия по его обработке. Если не знаете, то лучше TRY...EXCEPT не используйте.


sniknik   (2012-03-06 21:01:00) [2]

да все.


Anatoly Podgoretsky   (2012-03-06 21:00:00) [3]

Утечка памяти


Сергей   (2012-03-06 20:14:00) [4]

Что в ней не правильно?


sniknik   (2012-03-06 19:52:00) [5]

убрать все лишнее, не используемые переменные, дублирующиеся запросы, дублирующиеся операции... и главное идиотскую "обработку" ексепта.


Наверх

Титульная страница Поиск, карта сайта Написать письмо