Проблема с сохранением данных в SQlite

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Проблема с сохранением данных в SQlite

Сообщение Teodorih » 06.01.2014 15:46:10

В общем, такая проблема. Данные после ввода с формы Unit2 попадают в таблицу и отлично отображаются в DBGrid. Но в базу данных Sqlite3 не сохраняются. Хотя при закрытие формы прописано и upplayupdates и commit. Всё, что закоммениторовано - попытки найти ошибки. Во всех случая выдаёт ошибку о том, что БД закрыта(или readonly, например). При компиляции кода, который я скинул ниже, ошибок нету. Но, тем не менее, данные в БД не сохраняются. Версия Лазаруса 1.0.12 (32 бита). Версия БД - SQlite3 Expert Personal. Версия ОС - WinXp 32.

В одном из SQL запросов(конкретно в SQLQuery1) фигурирует подключения двух ранее созданных view (Создавал их в том же файле БД при помощи SQLite). Наткнулся вот на такую штуку на вики в пункте "примечание" http://wiki.freepascal.org/Lazarus_Database_Tutorial/ru

Также возможно применение сложных операторов SQL, используя псевдонимы, объединения, представления из нескольких таблиц (помните, что они должны постоянно находится в том же файле данных), но в этом случае ApplyUpdates не будет работать. Если кто-то хочет использовать сложные запросы и применить обновления файла данных, сообщите мне по почте и я дам некоторые советы, как это сделать


После чего расстроился окончательно =)

Unit1
Код: Выделить всё
procedure TForm1.FormCreate(Sender: TObject);
begin
//form1.SQLite3Connection1.Connected:=true;
  SQLite3Connection1.Open;
form1.SQLTransaction1.Active:=true;
form1.SQLQuery1.Active:=true;
form1.SQLQuery2.Active:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  form2.Show;
end;

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin

  SQLQuery1.ApplyUpdates;
  SQLQuery2.ApplyUpdates;
  form1.SQLTransaction1.Active:=false;
  //form1.SQLQuery1.Active:=false;
  //form1.SQLQuery2.Active:=false;
  form1.SQLTransaction1.Commit;


end;                       



Unit2
Код: Выделить всё
procedure TForm2.Button1Click(Sender: TObject);
  datestr1,year1,month1,day1,datestr2,year2,month2,day2:string;
  q:TSQLQuery;
begin
// Здесь работа с датой:, преобразование даты из вида, который нравится лазарусу в вид для sqlite
     datestr1:=datetostr(DateEdit1.Date);
     day1:=copy(datestr1,1,2);
     month1:=copy(datestr1,4,2);
     year1:=copy(datestr1,7,4);
     datestr1:=year1+'-'+month1+'-'+day1;
     datestr2:=datetostr(DateEdit3.Date);
     day2:=copy(datestr2,1,2);
     month2:=copy(datestr2,4,2);
     year2:=copy(datestr2,7,4);
     datestr2:=year2+'-'+month2+'-'+day2;
     
q := TSQLQuery.Create(self);
      q.DataBase := Form1.SQLite3Connection1;
      q.Transaction := Form1.SQLTransaction1;



    form1.SQLQuery1.Active:=false;
     form1.SQLQuery2.Active:=false;
    // form1.SQLQuery1.edit;
    // form1.SQLQuery2.edit;
     q.SQL.Add('INSERT INTO magazine(DateJoin, FIO, Place, DateBurn, Dep, matherial, Dia, desc, Answer, Date, FIODoc) VALUES("'+datestr1+'","'+edit1.text+'","'+edit2.Text+'","'+inttostr(Spinedit3.Value)+'","'+inttostr(spinedit4.Value)+'","'+memo1.Text+'","'+memo2.Text+'","'+memo3.Text+'","'+memo4.Text+'","'+datestr2+'","'+edit3.text+'");');
     q.ExecSQL;
   //  form1.SQLQuery1.Post;
   //  form1.SQLQuery2.Post;
     form1.SQLQuery1.Active:=true;
     form1.SQLQuery2.Active:=true;
     form1.SQLQuery1.ApplyUpdates;
     form1.SQLQuery2.ApplyUpdates;
    // q.ApplyUpdates;

end;                     
Teodorih
новенький
 
Сообщения: 10
Зарегистрирован: 06.01.2014 15:25:00

Re: Проблема с сохранением данных в SQlite

Сообщение Снег Север » 06.01.2014 21:52:54

После insert'а вызовите
Код: Выделить всё
SQLTransaction1.CommitRetaining;

У меня так работает.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3053
Зарегистрирован: 27.11.2007 16:14:47

Re: Проблема с сохранением данных в SQlite

Сообщение Teodorih » 06.01.2014 23:45:51

Снег Север писал(а):У меня так работает.

Нет, никакой реакции. Если вставлять сразу после инстерта, то перестаёт даже в таблицу в лазарусе заносить новую запись. В другие места тоже не особо. Такое чувство, что у меня какая-то настройка в транзакции неправильная или какая-то другая мелочь.
Teodorih
новенький
 
Сообщения: 10
Зарегистрирован: 06.01.2014 15:25:00

Re: Проблема с сохранением данных в SQlite

Сообщение VirusFree » 07.01.2014 02:56:09

Teodorih писал(а):
Unit1
Код: Выделить всё
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin

  SQLQuery1.ApplyUpdates;
  SQLQuery2.ApplyUpdates;
  form1.SQLTransaction1.Active:=false;
  //form1.SQLQuery1.Active:=false;
  //form1.SQLQuery2.Active:=false;
  form1.SQLTransaction1.Commit;


end;                       


В обработчике FormClose ты деактивируешь транзакцию, а потом её подтверждаешь. Сначала нужно подтвердить транзакцию (Commit).
Поменяй последовательность или вообще убери form1.SQLTransaction1.Active:=false;
VirusFree
новенький
 
Сообщения: 11
Зарегистрирован: 22.07.2011 03:11:56

Re: Проблема с сохранением данных в SQlite

Сообщение Снег Север » 07.01.2014 09:11:10

Вот кусок из работающей тестовой программы:
Код: Выделить всё
procedure TForm1.Button2Click(Sender: TObject);
begin
  If SQLite3Connection1.Connected then
  begin
       SQLQuery2.SQL.Clear;
       //Function Format: to pass values like parameters
       SQLQuery2.SQL.Add(Format('insert into tb_address (phone, name) values ("%s", "%s")',[Edit1.Text,Edit2.Text]));
       SQLQuery2.ExecSQL;
       //Use CommitRetainig to commit/save data on transaction and maintain connection open
       SQLTransaction1.CommitRetaining;
       //Refresh the Grid with new data
       SQLQuery1.Refresh;
  end
  else
  begin
    //Try to connect/warning message
  end;
end; 

CommitRetaining надо вызывать сразу после insert/update а не где-то непонятно где.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3053
Зарегистрирован: 27.11.2007 16:14:47

Re: Проблема с сохранением данных в SQlite

Сообщение Teodorih » 07.01.2014 12:09:43

Спасибо ребят, про диактивацию транзакций - это видимо от бессилия написал, чтобы убрать ошибку.
Косяк заключался в том, что в св-вах активности транзакции стояло "caNone"
Teodorih
новенький
 
Сообщения: 10
Зарегистрирован: 06.01.2014 15:25:00


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 237

Рейтинг@Mail.ru