sqlitedbFileName-journal

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

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

sqlitedbFileName-journal

Сообщение record » 22.03.2009 15:19:09

Есть тренировочная таблица из двух полей, втрое PRIMARY KEY.
На форме SQLite3Connection, SQLTransaction, SQLQuery, DataSource, BDEdit, DBGrid. В DBGrid записи появляются. Изменяю значение текущего поля в BDEdit, нажимаю на кнопку, в которой есть Form1.SQLQuery1.ApplyUpdates; и появляется файл first.db-journal. По выходе из программы first.db-journal исчезает, изменений в поле нет.

Подскажите пожалуйста, как записать изменения в базу sqlite?

Я так понял, что вопрос имеет отношение к
http://www.sqlite.org/lockingv3.html

Как снять блокировку с использованием данных компонент.
Менял значения UpdateMode у SQLQuery , не помогло.

Lazarus 0.9.26
record
новенький
 
Сообщения: 29
Зарегистрирован: 11.02.2006 16:34:51

Re: sqlitedbFileName-journal

Сообщение Padre_Mortius » 22.03.2009 18:16:20

А можно пример увидеть. а то что-то с ходу не могу даже понять в чем может быть проблема.

P.S. Работаю с базой sqlite обычно через SQL-запросы + TSqlite3dataset + PPSqlite3
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: sqlitedbFileName-journal

Сообщение record » 22.03.2009 19:22:46

sqlite3.exe first.db
SQLite version 3.6.11
sqlite> create table tbl1(one varchar(10), two smallint PRIMARY KEY);
sqlite> insert into tbl1 values('hello!',10);
sqlite> insert into tbl1 values('goodbye', 20);
sqlite> select * from tbl1;
hello!|10
goodbye|20
sqlite> .q

Программирования никакого и нет. Набросал компоненты на форму. Отображать отображает, обновить (через dbedit) не хочет. Я могу и в командной строке работать, типа,
update tbl1 set one='HI!' WHERE one like 'hello!'; Но хотелось бы гуй. Был бы очень благодарен, если бы какое-нибудь понятное how-to по sqlite в лазарус.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
record
новенький
 
Сообщения: 29
Зарегистрирован: 11.02.2006 16:34:51

Re: sqlitedbFileName-journal

Сообщение alexmai » 23.03.2009 13:19:11

record писал(а):sqlite3.exe first.db
SQLite version 3.6.11
sqlite> create table tbl1(one varchar(10), two smallint PRIMARY KEY);
sqlite> insert into tbl1 values('hello!',10);
sqlite> insert into tbl1 values('goodbye', 20);
sqlite> select * from tbl1;
hello!|10
goodbye|20
sqlite> .q

Программирования никакого и нет. Набросал компоненты на форму. Отображать отображает, обновить (через dbedit) не хочет. Я могу и в командной строке работать, типа,
update tbl1 set one='HI!' WHERE one like 'hello!'; Но хотелось бы гуй. Был бы очень благодарен, если бы какое-нибудь понятное how-to по sqlite в лазарус.

Мне кажется нужно просто в свойствах TSQLQuery
правильно прописать запрос на метод updatesql и выбрать нужный метод updatemode
тоже самое касается вставки записи ,там нужен запрос на insertSQL
alexmai
постоялец
 
Сообщения: 106
Зарегистрирован: 02.02.2009 14:58:42

Re: sqlitedbFileName-journal

Сообщение record » 24.03.2009 10:00:13

Нашел для себя удобный вариант:
Код: Выделить всё
New:=Form1.Edit1.Text;Old:=Form1.Edit2.Text;
S := fpsystem
('sqlite3 first.db "UPDATE tbl1 set one=''' + New +  ''' WHERE one LIKE ''' + Old + ''';"' );
if S<>0
then  begin
           showmessage('Error: '+inttostr(S));
           exit
        end;           

Думаю, что бд-компонеты в моем случае можно не использовать совсем. Можно полностью обрабатывать данные в консоле, а в ГУЙ выводить только данные. Мне так проще, по крайней мере, это все понятно, как работает:
Код: Выделить всё
if not fileexists('second.db')
  then   begin
    S := fpsystem ('sqlite3 first.db ".dump" | sqlite3 second.db ;');
...
S := fpsystem ('mv second.db first.db');

или вот:
Код: Выделить всё
S := fpsystem  ('sqlite3 -header first.db ''SELECT * FROM tbl1'' > first.txt '); 

Тем более, что бд-компонетны не установлены на другой машине.(генту)

Добавлено спустя 1 час 10 минут 21 секунду:
Padre_Mortius писал(а):P.S. Работаю с базой sqlite обычно через SQL-запросы + TSqlite3dataset + PPSqlite3


За TSqlite3dataset спасибо, буду использовать для отображения (+dbgrid) наборов данных.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
record
новенький
 
Сообщения: 29
Зарегистрирован: 11.02.2006 16:34:51

Re: sqlitedbFileName-journal

Сообщение alexmai » 24.03.2009 11:14:30

record писал(а):Нашел для себя удобный вариант:
Код: Выделить всё
New:=Form1.Edit1.Text;Old:=Form1.Edit2.Text;
S := fpsystem
('sqlite3 first.db "UPDATE tbl1 set one=''' + New +  ''' WHERE one LIKE ''' + Old + ''';"' );
if S<>0
then  begin
           showmessage('Error: '+inttostr(S));
           exit
        end;           

Думаю, что бд-компонеты в моем случае можно не использовать совсем. Можно полностью обрабатывать данные в консоле, а в ГУЙ выводить только данные. Мне так проще, по крайней мере, это все понятно, как работает:
Код: Выделить всё
if not fileexists('second.db')
  then   begin
    S := fpsystem ('sqlite3 first.db ".dump" | sqlite3 second.db ;');
...
S := fpsystem ('mv second.db first.db');

или вот:
Код: Выделить всё
S := fpsystem  ('sqlite3 -header first.db ''SELECT * FROM tbl1'' > first.txt '); 

Тем более, что бд-компонетны не установлены на другой машине.(генту)

Извращения оправданы когда получается значительный выиграш в скорости.
Я например вместо обновления базы через сервер баз через TCP, тупо скачиваю подготовленную запакованную базу через ftp, а потом уже ее разворачиваю, все это при 400 тыс записей происходит максимум за 1-20 сек, а обновление через TCP может длится часами, особенно SQLITE
alexmai
постоялец
 
Сообщения: 106
Зарегистрирован: 02.02.2009 14:58:42

Re: sqlitedbFileName-journal

Сообщение record » 24.03.2009 12:01:01

Код: Выделить всё
S := fpsystem ('sqlite3 first.db ".dump" | sqlite3 second.db ;');

проще
Код: Выделить всё
S := fpsystem ('cp first.db second.db');

:oops: :lol:

Добавлено спустя 14 минут 22 секунды:
Извращения оправданы когда получается значительный выиграш в скорости.


Не могу согласиться с терминологией. Ведь практически используются средства самой sqlite, использование которой ясно и четко изложено в том же мане. Практически ничего лишнего. Думаю использовать несколько текстовых файлов для хранения запросов и скармливать их sqlite. Промежуточные вычисления проводить, естественно, на паскале, а отображать результаты в dbgrid. Спасибо за советы. :)
record
новенький
 
Сообщения: 29
Зарегистрирован: 11.02.2006 16:34:51

Re: sqlitedbFileName-journal

Сообщение record » 06.04.2009 15:56:23

Отвечаю сам.
Все проще, чем я думал.

Чтобы данные сохранились, ApplyUpdates для SQLQuery недостаточно.
Нужно вызвать CommitRetaining или Commit для SQLTransaction .


Вообще-то я уже bash-скрипт написал, вполне рабочий, но true и false исправлять в логических полях руками утомительно, решил еще раз разобраться с SQLdb.

Для начинающих, вроде меня, лучше бы дополнили этим фактом статью "Использование SQLdb в Lazarus: основы работы с базами данных"
http://freepascal.ru/article//lazarus/20090311201519/
record
новенький
 
Сообщения: 29
Зарегистрирован: 11.02.2006 16:34:51

Re: sqlitedbFileName-journal

Сообщение record » 08.04.2009 12:49:23

Все-таки после ряда экспериментов по ряду причин остановился на Sqlite3Dataset.
record
новенький
 
Сообщения: 29
Зарегистрирован: 11.02.2006 16:34:51

Re: sqlitedbFileName-journal

Сообщение Padre_Mortius » 09.04.2009 19:34:19

TSqlite3Dataset удобно использовать для показа данных, но вот для вставки, изменения данных и обработки ошибок мне удобнее пользоваться PPSqlite3.
Пример ипользования:
Код: Выделить всё
procedure Create_tbl_UserStatusList(sqlite : PPsqlite3);
var
  aSql   : String;
  rc     : integer;
  ErrMsg : PChar;
begin
  aSql := 'BEGIN TRANSACTION; ';
  aSql := aSql + 'CREATE TABLE tbl_UserStatusList ('
        + 'StatusID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, '
        + 'StatusName VARCHAR(20) NOT NULL UNIQUE);';
  aSql := aSql + 'COMMIT TRANSACTION;';
  rc := sqlite3_exec(sqlite, PChar(ASql), @MyCallback, nil, @ErrMsg);
  if rc <> SQLITE_OK then
    MessageDlg('Database Error', 'Can''t create table tbl_UserStatusList.'
              + #10 + #13 + StrPas(ErrMsg), mtError, [mbOK], 0);

  aSql := 'BEGIN TRANSACTION;';
  aSQL := aSql + 'INSERT INTO tbl_UserStatusList VALUES (1, ''действует'');';
  aSql := aSql + 'INSERT INTO tbl_UserStatusList VALUES (2, ''заблокирован'');';
  aSql := aSql + 'COMMIT TRANSACTION;';
  rc := sqlite3_exec(sqlite, PChar(ASql), @MyCallback, nil, @ErrMsg);
  if rc <> SQLITE_OK then
    MessageDlg('Database Error', 'Can''t insert row into the table tbl_UserStatusList.'
              + #10 + #13 + StrPas(ErrMsg), mtError, [mbOK], 0);
end;
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru