Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Купить рекламу на форуме 15-35 тыс рублей в месяц

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

           Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
           И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - https://clck.ru/fCqwP

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2016, 11:39   #1
nibufep
Форумчанин
 
Регистрация: 02.08.2014
Сообщений: 476
По умолчанию SQLConnection

Добрый день!

Код:
var
  SQL: TSQLConnection;
Код:
procedure TForm1.FormShow(Sender: TObject);
begin
  SQL := TSQLConnection.Create(self);
  SQL.DriverName := 'Sqlite';
  SQL.Params.Values['Database'] := ExtractFilePath(Application.ExeName) + '/bd.db';
  SQL.Params.Values['FailIfMissing'] := 'False';
  SQL.Connected := true;
end;
Код:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  try
    SQL.Connected := false;
    FreeAndNil(sql);
  except
    on E: Exception do
      ShowMessage(E.ClassName + ' поднята ошибка, с сообщением : ' + E.Message);
  end;
end;
При закрытие программы получаю ошибку:

Цитата:
argument out of range
что не так?
nibufep вне форума Ответить с цитированием
Старый 09.08.2016, 13:46   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,260
По умолчанию

во-первых, почему на событие onShow подвесили создание SQL, разве на onCreate не логичнее?

во-вторых, если закомментировать весь код, что у Вас на onClose формы, ошибка будет?
потому как, думаю, что ошибка у Вас в другом месте, а не в том коде, что Вы тут привели.

в-третьих, попробуйте добавить проверку:
Код:
    if Assigned(SQL) then begin
       SQL.Connected := false;
       FreeAndNil(SQL);
    end;

Последний раз редактировалось Serge_Bliznykov; 09.08.2016 в 13:48.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.08.2016, 13:54   #3
nibufep
Форумчанин
 
Регистрация: 02.08.2014
Сообщений: 476
По умолчанию

а может ли быть ошибка из-за того что одновременно несколько запросов выполнялось в разных потоках ?
nibufep вне форума Ответить с цитированием
Старый 09.08.2016, 17:03   #4
nibufep
Форумчанин
 
Регистрация: 02.08.2014
Сообщений: 476
По умолчанию

Да видимо проблема в этом, сделал так

Код:
var
  SQLConnect: boolean = false;
И сделал вот так с каждым запросом:

Код:
  while SQLConnect = true do
  begin
    exit;
  end;
  SQLConnect := True;
  SQL.Execute('', nil, Results);
  SQLConnect := False;
Но выполняется только 1 запрос, это из-за exit? Чем его можно заметить если это так? Или вообще можно сделать просто вот так:

Код:
  while SQLConnect = true do
  begin
  end;
Прервет ли это выполнение кода? И слишком ли ужасное такое решение? Может можно как-то по другому сделать?
nibufep вне форума Ответить с цитированием
Старый 09.08.2016, 17:15   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,382
По умолчанию

О потоки!
А все потоки используют ОДИН и тот же объект SQL ?
не соединение (SQLConnect), а вот это
SQL.Execute (SQL - один и тот же ОБЩИЙ для всех потоков)?!
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 10.08.2016, 13:31   #6
nibufep
Форумчанин
 
Регистрация: 02.08.2014
Сообщений: 476
По умолчанию

Переменная SQL глобальная если вы об этом.
nibufep вне форума Ответить с цитированием
Старый 10.08.2016, 13:38   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

Ну если это те потоки и та глобальность, о которых думаю, то так нельзя. Для каждого потока - свой датасет.
Цитата:
Переменная SQL
вообще-то объект
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.08.2016, 16:40   #8
nibufep
Форумчанин
 
Регистрация: 02.08.2014
Сообщений: 476
По умолчанию

как тогда правильно будет сделать?
nibufep вне форума Ответить с цитированием
Старый 12.08.2016, 14:57   #9
nibufep
Форумчанин
 
Регистрация: 02.08.2014
Сообщений: 476
По умолчанию

в каждом потоке
Код:
 SQL := TSQLConnection.Create(self);
надо делать?
nibufep вне форума Ответить с цитированием
Старый 12.08.2016, 15:55   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

SQLConnect это одно, а SQL.Execute это другое. Или у тебя все SQL называется?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ

           Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
           Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
sqlconnection шифровка Madmaxisss Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 14 13.05.2013 21:33
Отключение SQLConnection Cyworc БД в Delphi 4 19.03.2012 04:46
Где SQLConnection хранит имя и пароль? IceExecutioner БД в Delphi 5 09.03.2011 08:09
SqlConnection D.O.G Общие вопросы Delphi 0 04.10.2010 09:57