Работа с базой данных SQLite (помогите пожалуйста)

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

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

Работа с базой данных SQLite (помогите пожалуйста)

Сообщение midisa » 16.06.2013 10:26:39

Добрый день уважаемые программисты.
Помогите пожалуйста разобраться с работой базы данных.

Как я понял есть два способа внести изменения в базу данных (но в каждом случае у меня что то не получается):
1. первый способ такой:

DataModule1.SQLQuery1.Edit;
DataModule1.SQLQuery1.FieldByName('DESCR').AsString:='hello mir';
DataModule1.SQLQuery1.Post;

Данный способ работает без ошибок, НО как только я закрываю базу данных все изменения пропадают. Как я понимаю нужно дать команду физической записи в базу, типа такой:
DataModule1.SQLTransaction1.CommitRetaining;
или
DataModule1.SQLTransaction1.Commit;
но все равно не помогает если я вызываю комит, то данные из окна программы исчезают, а запись все равно не отображается.
Я стал думать дальше, может я не открыл транзакцию?
Хотя она у меня завязана с элементами управления, значит она уже открыта. Или ее нужно как то хитро создать?

Второй вариант:

DataModule1.SQLQuery1.Close; (в документации которую я читаю, написано Опен, но если мы открыли (хотя он у нас уже открыт и все записи отображены в гриде), то вторая строка выдает ошибку)
DataModule1.SQLQuery1.SQL.Text := 'update "spr_domain" set "DESCR" = "hello mir" where "IDSITE" = 4';
DataModule1.SQLQuery1.ExecSQL;

В общем тоже не получается.... пробовал с транзакциями и без них ... бьюсь уже кучу времени ... не получается.
В качестве учебного материала использую этот:
http://wiki.freepascal.org/Lazarus_Database_Overview

Помогите сделать мне сразу оба варианта. Подскажите как правильно написать?

Добавлено спустя 24 минуты 8 секунд:
Попробовал еще так:

DataModule1.SQLQuery1.Close;
DataModule1.SQLQuery1.SQL.Text := 'update "spr_domain" set "DESCR" = "hello mir" where "IDSITE" = 4';
DataModule1.SQLQuery1.ExecSQL;
DataModule1.SQLQuery1.SQL.Text:='select * from "spr_domain" where "IDSITE" = 4';
DataModule1.SQLQuery1.Open;
DataModule1.SQLQuery1.ApplyUpdates;

Не вносит в базу изменения, хотя в приложении изменения видны.
P.S. Используется компонент SQLite3Connection1 база SQLite .
Последний раз редактировалось midisa 17.06.2013 06:27:14, всего редактировалось 1 раз.
midisa
новенький
 
Сообщения: 95
Зарегистрирован: 13.06.2013 18:27:53
Откуда: Omsk

Re: Работа с базой данных (помогите пожалуйста)

Сообщение mig-31 » 16.06.2013 20:18:42

В Firebird
Transaction.Commit;
SQLQeury.Open;

В SQLLite должно быть так же.
mig-31
постоялец
 
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48

Re: Работа с базой данных (помогите пожалуйста)

Сообщение midisa » 16.06.2013 21:35:57

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

думаю, что косяк не в моем коде, а косяк в компоненте (или его настройках).

уже выбился из сил. что то упускаю, а что не могу понять ...

Показывал человеку, который пишет много лет на делфи, говорит, что вроде все нормально написано. Он лазарус не знает, по этому разводит руками.

Посмотрите пожалуйста мои настройки, может где то настройки не правильно указаны?.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
midisa
новенький
 
Сообщения: 95
Зарегистрирован: 13.06.2013 18:27:53
Откуда: Omsk

Re: Работа с базой данных SQLite (помогите пожалуйста)

Сообщение SeZuka » 17.06.2013 08:00:09

midisa писал(а):DataModule1.SQLQuery1.Edit;
DataModule1.SQLQuery1.FieldByName('DESCR').AsString:='hello mir';
DataModule1.SQLQuery1.Post;

Для того чтобы это работало, необходимо в свойстве UpdateSQL написать скрипт, который будет вносить изменения в базу.
midisa писал(а):DataModule1.SQLQuery1.SQL.Text := 'update "spr_domain" set "DESCR" = "hello mir" where "IDSITE" = 4';
DataModule1.SQLQuery1.ExecSQL;

А тут вместо TSQLQuery используй TSQLScript
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Работа с базой данных SQLite (помогите пожалуйста)

Сообщение midisa » 17.06.2013 08:06:42

как должен выглядеть этот скрипт?

Добавлено спустя 2 минуты 22 секунды:
так?
Код: Выделить всё
update spr_domain
set descr = :descr
where idsite = :idsite


Добавлено спустя 1 минуту 39 секунд:
если так, то это написано именно там, где вы и сказали.
суть в том, что данные не обновляются даже кода идет изменение через грид.
в гриде есть записи, я их меняю. визуально вижу изменения, а как только закрываю программу, то изменения не сохраняются.

Добавлено спустя 4 часа 48 минут 34 секунды:
спасибо всем вопрос снят ... причину нашли ...
midisa
новенький
 
Сообщения: 95
Зарегистрирован: 13.06.2013 18:27:53
Откуда: Omsk

Re: Работа с базой данных SQLite (помогите пожалуйста)

Сообщение Vadim » 17.06.2013 14:53:12

midisa
Расскажите, в чём была причина?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Работа с базой данных SQLite (помогите пожалуйста)

Сообщение midisa » 17.06.2013 18:28:47

С такой проблемой сталкивался еще на сях, когда редактор обрабатывает обьектные файлы, которые не заменены.
В таком случае я использовал всегда Rebuild в Visual Studio. Пересобирает весь проект, но зато надежно.

А сегодня просидев пару часов с Алексеем (низкий ему поклон за помощь), когда вместе выбились из сил воевать над моим "чудо" проектом, он сказал:
- архивируй свой проект и шли мне.
Я спросил:
- директория lib нужна?
Он:
- нет.

Я удаляю с винта директорию lib и вспоминаю, что при попытке очистить проект из редактора он выдавал ошибку. Дай думаю соберу проект на последок, проверить.
Собрал и все сразу встало на свои места.

Самое интересное, что я неоднократно (за последние два дня) давал команду Собрать (Как мне сказали Делфисты, это одно и тоже что и Rebuild в сях). Но видимо данные не удалялись из lib директории.
Замечаний по не правильным установленным правам я не наблюдал на своей машине. Едиственное могу сказать, что у меня стоит не жесткий диск, а SSD, может это как то влияет ...
Может лазарь работает в много поточном режиме и он не успевает очистить папку lib до сборки ...

В общем взял этот момент на вооружение. Мне не трудно руками эту папку удалять, когда нужно пересобрать проект.

Добавлено спустя 14 минут 55 секунд:
Еще один косяк меня немного раздражает, когда из редактора запускаешь проект, он отображает сообщение примерно такого содержания:
ОЙ! что топошло не так, сохраните свой проект чтобы не пропал и нажмите кнопку ОК.
Два три раза ткеншь, запускается нормально. Программа из директории тоже запускается хорошо, а из редактора ОЙ да Ой. Иногда закрывать редактор нужно чтобы он не Ойкал а мог запустить программу.
По ходу автор приколоться решил ...
midisa
новенький
 
Сообщения: 95
Зарегистрирован: 13.06.2013 18:27:53
Откуда: Omsk

Re: Работа с базой данных SQLite (помогите пожалуйста)

Сообщение debi12345 » 17.06.2013 19:23:05

Не самые новые версии SQLITE3 не поддерживают вложенные транзакции. Если подключать БД через компонент T*Connection и назначать ему транзакцию, то автоматом открывает неявная транзакция. Если в ее ходе произойдет хоть малейшая ошибка которая по какой-то причине (глюк в SQLITE3 API) не будет перехвачена, и код не зайдет в ветку с COMMIT (например через "try..finally.. end"), то автоматом делается откат всей работы. Я столкунлся с такой бякой, когда один из отделов терял всю дневную работу из-за какой-то необнаруживаемой (SQLITE3-API) фигни при распечатке отчета. Пришлось попросить Мартина отрубить эту автотранзакцию при открытии соединения (tao_fake), и далее стал вызывать BEGIN и COMMIT/ABORT явным образом. Проблема ушла. Новый SQLITE3 вроде бы поддрживает вложенные транзакции, но компоненты должны под это подстраиваться, если это не сделано, то жди гадостей.

Добавлено спустя 5 минут 50 секунд:
Да, перехват БД-исключений (как фишка - например проверка уникальности не через предварительную выборку, а через нарушение уникального индекса при реальной записи) при авто-транзакции смерти подобен - прога-то их отловит, а вот БД втихаря откатит всю работу.

Добавлено спустя 1 час 12 минут 58 секунд:
Для того чтобы это работало, необходимо в свойстве UpdateSQL написать скрипт, который будет вносить изменения в базу.

Если выборка была из одной таблицы, то запросы на запись изменений должны генерироваться автоматом - про условии что в пропертях выборки назначено ключевое поле (определяющене строку, куда писать изменения).
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Работа с базой данных SQLite (помогите пожалуйста)

Сообщение anonim » 22.06.2013 20:30:55

Я тоже с этим сталкивался. Пришлос читать инструкции. Надо вызывать ApplyUpdates напр., при закрытии формы. несмотря на то, что данные вроде уже сохранены. Вот так:
Код: Выделить всё
procedure TfrmSettings.btnSaveClick(Sender: TObject);
var
  f: boolean;
begin
  f:=false;
  with dmData do begin
    if (quSourceObj.Active) then begin
      quSourceObj.ApplyUpdates(0);
      f:=true;
    end;
    if quSettings.Active then begin
      quSettings.ApplyUpdates(0);
      f:=true;
    end;
    if (quItems.Active) then begin
      quItems.ApplyUpdates(0);
      f:=true;
    end;
    if (f) then begin
      SQLTransaction1.CommitRetaining;
    end;
  end;
end;

У меня здесь на одной форме 3 грида. Дополнительно надо поставить у ключевого поля pfInKey:=True в ProviderFlags и может быть pfInUpdate:=True, чтоб запросы UpdateSQL автоматом генерировались.
anonim
незнакомец
 
Сообщения: 1
Зарегистрирован: 22.06.2013 20:20:41


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru