Работа с SQLite3

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

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

EvelRus
новенький
Сообщения: 17
Зарегистрирован: 25.01.2013 14:53:53

Работа с SQLite3

Сообщение EvelRus »

Всем добры день!
Помогите с SQLite3.
Создал проект, добавил элементы для работы с sqlite:
SQLite3Connection1
SQLTransaction1
SQLQuery1
Datasource1

На кнопку добавил

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
begin
     SQLite3Connection1.Connected:=False;
     if SQLQuery1.Active then
        SQLQuery1.Active:=False;
        SQLQuery1.SQL.Clear;

     sqlite3connection1.Connected:=true;
     sqlquery1.SQL.Add('select max(ID) from soft_config');
end;


а что делать дальше я хз :(
Как загнать данные в поле? И как их потом обновить/добавить в БД

И как добавить массив значений в поле? Например в выпадающий список

Заранее спасибо
Frolik
постоялец
Сообщения: 275
Зарегистрирован: 18.08.2011 11:52:32

Сообщение Frolik »

В общих чертах здесь:
http://wiki.freepascal.org/SQLdb_Tutorial1#SQLite_2
EvelRus
новенький
Сообщения: 17
Зарегистрирован: 25.01.2013 14:53:53

Сообщение EvelRus »

Так ни черта и не понял :(
Помогите, пожалуйста, поправьте проект. Надо в форму ввести значение из sql запроса max(id)
На этом примере я потом попробую разобраться
И можно ли работать с БД без гринда или как она там зовется, таблица в которую данные грузятся
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

Почитайте вот эту статью. Принцип работы тот же самый
EvelRus
новенький
Сообщения: 17
Зарегистрирован: 25.01.2013 14:53:53

Сообщение EvelRus »

Сделал ))

Код: Выделить всё

begin
       try
// Подключение БД
    sqlite3.Connected:=true;
  except
    ShowMessage(' Не могу подключиться к базе данных');
    exit;
  end;
// Подключение транзакций
  try
    SQLTransaction1.Active:=true;
  except
    ShowMessage(' Не могу создать транзакцию');
  exit;
  end;
// Подача запроса в БД
  try
     SQLQuery1.Active:=false;
     SQLQuery1.SQL.Clear;
     SQLQuery1.SQL.Add('select * from table');
     SQLQuery1.ExecSQL;
     SQLQuery1.Open;
     FormUserLogin.Text:=SQLQuery1.FieldByName('login').AsString;
     FormSound.Checked:=SQLQuery1.FieldByName('sound').AsBoolean;
  except
    ShowMessage('Ошибка загрузки конфигурации. Перезапустите программу');
  exit;
  end;
end;
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

для выполнения выборки данных с помощью select метод ExecSQL не нужен, достаточно только Open.
EvelRus
новенький
Сообщения: 17
Зарегистрирован: 25.01.2013 14:53:53

Сообщение EvelRus »

А обновление тогда как сделать? Делал

Код: Выделить всё

 SQLQuery1.Edit;
SQLQuery1.FieldByName('user_login').AsString:=   FormUserLogin.Text;
SQLQuery1.Post;
SQLQuery1.ApplyUpdates(0);
SQLQuery1.Open;
showmessage('Сохранено');

и снова получаю ошибку http://clip2net.com/s/2Oykz
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

Как по мне, то работа с таблицей через Edit и Post это дурной тон, если изменения вносятся не в сам грид. Я бы делал через SQL-функции, т.е.

Код: Выделить всё

SQLQuery2.SQL.Text = 'update tablename set user_login=:usr_lgn where id=:id';
SQLQuery2.Params.ParamByName('usr_lgn').AsString = FormUserLogin.Text;
SQLQuery2.Params.ParamByName('id').AsInteger = aID;
SQLQuery2.ExecSQL;
SQLQuery1.Refresh;


И еще один момент... Возьмите за правило для одной таблицы cоздавать 2 компонента TSQLQuery (на выборку данных и на вставку/изменение). В дальнейшшем TSQLQuery для вставки/изменения данных можно создавать в runtime
EvelRus
новенький
Сообщения: 17
Зарегистрирован: 25.01.2013 14:53:53

Сообщение EvelRus »

unit3.pas(109,69) Error: Incompatible type for arg no. 1: Got "Constant String", expected "TStringList"

Это на адейте...

Код: Выделить всё

SQLQuery2.SQL:= 'update user_config set user_login=1 where id=1';
без переменных для проверки работы, а на двойные кавычки ругается
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

EvelRus, прошу прощения. Последнее время все больше на си++ приходится писать. Пост исправил.
EvelRus
новенький
Сообщения: 17
Зарегистрирован: 25.01.2013 14:53:53

Сообщение EvelRus »

Тогда еще вопрос, а почему там знаки "="? Разве присвоение не ":="?
Это поправил, но ошибка все равно как выше - не обновляет, но пишет что сохранено

Код: Выделить всё

SQLQuery2.SQL.Text:= 'update user_config set user_login=1 where user_id=1'; 

если добавляю открытие sql

Код: Выделить всё

SQLQuery2.SQL.Clear;
     SQLQuery2.SQL.Text:= 'update user_config set user_login=1 where user_id=1';
     SQLQuery2.ExecSQL;
     SQLQuery2.Open;
     showmessage('Сохранено');

то получаю ошибку
http://clip2net.com/s/2OCqh
Аватара пользователя
Little_Roo
энтузиаст
Сообщения: 639
Зарегистрирован: 27.02.2009 18:56:36
Откуда: Санкт-Петербург

Сообщение Little_Roo »

EvelRus писал(а):SQLQuery2.SQL.Clear;


И ЧТО после этого Вы хотите апдейтить?
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

Код: Выделить всё

SQLQuery2.Open;

Эта строка не нужна, либо добавьте перед ней строку с select-запросом.
EvelRus
новенький
Сообщения: 17
Зарегистрирован: 25.01.2013 14:53:53

Сообщение EvelRus »

Все равно не сохраняет = (
Jargar
новенький
Сообщения: 21
Зарегистрирован: 06.11.2007 13:42:24

Сообщение Jargar »

Код: Выделить всё

SQLTransaction1.Commit;

надо сделать чтобы данные сохранились.
Ответить