Простая БД на SQLite

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

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

Простая БД на SQLite

Сообщение EatMyShorts » 09.10.2009 17:36:52

Уважаемые форумчане, помогите разобраться с sqlite в lazarus.
На форме DBGrid, DataSource, Sql3Dataset.
Пытаюсь выполнить такой код:
Код: Выделить всё
  Sqlite3Dataset1.SQL:='INSERT INTO pers (name, surname) VALUES("ivan", "ivanov") ';
  Sqlite3Dataset1.SQL:='SELECT * FROM pers';
// Sqlite3Dataset1.ExecSQL;
  Sqlite3dataset1.ApplyUpdates;         

Вылетает ошибка: 'External: SIGSEGV'.
Использую компонет Sqlite4fpc.
Может кто подкинет простой рабочий примерчик, в котором бы были показаны азы работы с БД?
Заранее благодарен.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
EatMyShorts
новенький
 
Сообщения: 30
Зарегистрирован: 06.10.2009 19:48:19

Re: Простая БД на SQLite

Сообщение Vadim » 09.10.2009 18:21:55

В Sqlite3Dataset1 сотрите значение MasterSource.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Простая БД на SQLite

Сообщение EatMyShorts » 09.10.2009 18:31:11

Vadim писал(а):В Sqlite3Dataset1 сотрите значение MasterSource.

Стёр, ошибка осталась.
EatMyShorts
новенький
 
Сообщения: 30
Зарегистрирован: 06.10.2009 19:48:19

Re: Простая БД на SQLite

Сообщение Vadim » 09.10.2009 18:52:47

EatMyShorts
Вот здесь
http://wiki.lazarus.freepascal.org/Lazarus_Database_Tutorial/ru#Lazarus_.D0.B8_SQLite
есть простейший пример по работе с Sqlite3Dataset.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Простая БД на SQLite

Сообщение EatMyShorts » 09.10.2009 19:13:27

Vadim писал(а):EatMyShorts
Вот здесь
http://wiki.lazarus.freepascal.org/Lazarus_Database_Tutorial/ru#Lazarus_.D0.B8_SQLite
есть простейший пример по работе с Sqlite3Dataset.

Я это читал, но больно там уж все расплывчато.

Ошибку вроде победил, выставив Sqlite3Dataset.PrimariKey = 'id'.
Но теперь с этим полем проблема. В Sqlite3Dataset поле id имеет тип AutoInc. но при добавлении данных:
Код: Выделить всё
  Sqlite3Dataset1.SQL:='INSERT INTO pers (name, surname) VALUES("ivan", "ivanov") ';
  Sqlite3Dataset1.ExecSQL;
  Sqlite3Dataset1.SQL:='INSERT INTO pers (name, surname) VALUES("petr", "petrov") ';
  Sqlite3Dataset1.ExecSQL;
  Sqlite3Dataset1.SQL:='SELECT * FROM pers';
  Sqlite3Dataset1.ExecSQL;
  Sqlite3dataset1.ApplyUpdates;

в таблице ячейки поля id остаются пустыми.
EatMyShorts
новенький
 
Сообщения: 30
Зарегистрирован: 06.10.2009 19:48:19

Re: Простая БД на SQLite

Сообщение wofs » 09.10.2009 21:02:12

В Sqlite3Dataset поле id имеет тип AutoInc.

наводит на мысль, что есть еще поле id, котjрое автоинкриментное, тогда:
Код: Выделить всё
Sqlite3Dataset1.SQL:='INSERT INTO pers (id,name, surname) VALUES("","ivan", "ivanov") ';
  Sqlite3Dataset1.ExecSQL;
  Sqlite3Dataset1.SQL:='INSERT INTO pers (id,name, surname) VALUES("","petr", "petrov") ';
  Sqlite3Dataset1.ExecSQL;


Код: Выделить всё
  Sqlite3Dataset1.SQL:='SELECT * FROM pers';
  Sqlite3Dataset1.ExecSQL;

ExecSQL используется только для выполнения ничего не возвращающих запросов (такое как добавление данных, апдейт и т.п.)
для выборки данных используется
Код: Выделить всё
Sqlite3Dataset1.Open;


в таблице ячейки поля id остаются пустыми.

уточнение, а в самой БД в таблице поле id указано как автоинкриментное (простите, сужу по аналогии с MySQL с SQLLite не знаком)
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Простая БД на SQLite

Сообщение EatMyShorts » 09.10.2009 23:13:18

wofs писал(а):
В Sqlite3Dataset поле id имеет тип AutoInc.

наводит на мысль, что есть еще поле id, котjрое автоинкриментное


Нет, поле id одно.

Сейчас сделал таким образом:
Код: Выделить всё
     Sqlite3Dataset1.FileName:='test1.db3';
     Sqlite3Dataset1.ExecSQL( 'CREATE TABLE pers(id INTEGER PRIMARY KEY, name VARCHAR, surname VARCHAR);');
     Sqlite3Dataset1.ExecSQL ( 'INSERT INTO pers(name, surname) VALUES("ivan", "ivanov")');
     Sqlite3Dataset1.ExecSQL('INSERT INTO pers(name, surname) VALUES("petr", "петров")');
     Sqlite3Dataset1.SQL:='SELECT * FROM pers';
     Sqlite3Dataset1.Open;   


Вроде работает как надо.
Спасибо всем откликнувшимся!
EatMyShorts
новенький
 
Сообщения: 30
Зарегистрирован: 06.10.2009 19:48:19

Re: Простая БД на SQLite

Сообщение Padre_Mortius » 10.10.2009 00:02:40

Код: Выделить всё
Sqlite3Dataset1.ExecSQL( 'CREATE TABLE pers(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name VARCHAR, surname VARCHAR);');

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

Re: Простая БД на SQLite

Сообщение Vadim » 10.10.2009 06:01:00

EatMyShorts писал(а):Ошибку вроде победил, выставив Sqlite3Dataset.PrimariKey = 'id'.

Так у Вас же оно уже было выставлено? По крайней мере в test.zip, что Вы выложили, оно стоит.
Видимо в первый раз при создании таблицы, Вы это поле просто не задали как автоинкрементное и как "PRIMARY KEY". ;)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Простая БД на SQLite

Сообщение EatMyShorts » 10.10.2009 15:29:33

Дабы не плодить новых тем спрошу здесь:
Подскажите как организовать combobox в котором были бы всевозможные значения поля таблицы.
Нашел в компонентах TDBLookupCombobox, устанавливаю в нем
Код: Выделить всё
DataField := 'surname';
Datasource := Datasource1;
KeyField := id;

Также на форме TDBNavigator. При попытке добавить запись, поле surname не изменяется, да и сам combobox остается пустым.
EatMyShorts
новенький
 
Сообщения: 30
Зарегистрирован: 06.10.2009 19:48:19

Re: Простая БД на SQLite

Сообщение wofs » 10.10.2009 16:02:02

Я из визуальных компонент доступа к бд использую только DBGrid... поэтому могу только пососетовать для стандартного Combobox...
Код: Выделить всё
  with Query1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT DISTINCT surname FROM DBName'); //выбираем данные исключая повторы если повторы исключать не нужно, то запрос вида SELECT surname FROM DBName
    Open;
    First;
    ComboBox1.Items.BeginUpdate; //начинаем заполнение
    try
      ComboBox1.Clear;
      while not Eof do //пока не кончится таблица
      begin
        ComboBox1.Items.Add(FieldByName('surname').AsString); //из поля surname
        Next;
      end;
    finally
      ComboBox1.Items.EndUdate; //завершаем.
    end;
  end;

в свое время тоже искал...

Добавлено спустя 6 минут 47 секунд:
Код: Выделить всё
Также на форме TDBNavigator. При попытке добавить запись, поле surname не изменяется, да и сам combobox остается пустым.

не совсем понял это предложение если честно...
что пытаетесь и куда добавить, как компоненты связаны с датасет... код бы посмотреть...
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Простая БД на SQLite

Сообщение EatMyShorts » 10.10.2009 16:18:10

wofs
SQL.Add('SELECT DISTINCT surname FROM DBName');


Пришел к аналогичному решению. Бросил на форму TSqlQuerry, TSqlite3Connection.
Пытаюсь сделать так:
Код: Выделить всё
     Sqlite3Dataset1.ExecSql('SELECT * FROM pers');
     Sqlite3Dataset1.Open;
     sql.SQL.Clear;
     Sqlite3Dataset1.Close;

     sql.sql.add('SELECT DISTINCT name FROM pers');
     sql.open;
     sql.first;
     while not sql.EOF do
     begin
          writeln(sql.FieldByName('name').AsString);
          sql.next;
     end;   

Ругается на неустановленное свойство Transaction.
Подскажите пожалуйста правильную последовательность действий.
EatMyShorts
новенький
 
Сообщения: 30
Зарегистрирован: 06.10.2009 19:48:19

Re: Простая БД на SQLite

Сообщение wofs » 10.10.2009 16:36:56

немного не понятный код...
Код: Выделить всё
     Sqlite3Dataset1.ExecSql('SELECT * FROM pers');
     Sqlite3Dataset1.Open;
     sql.SQL.Clear;
     Sqlite3Dataset1.Close;

не понятно, зачем сперва открывать датасет, потом следом его закрывать...
--
я в лазарус совсем не давно, но по аналогии с бдMySQL я бы делал через компоненты
SQLite3Connection1
SQLTransaction1 в поле Database установить SQLite3Connection1
SQLQuery1 в поле Database установить SQLite3Connection1
Datasource1 в поле Dataset установить SQLQuery1
DBGrid1 в поле DataSource установить Datasource1

потом перед запросом:
SQLTransaction1.Active:=True;
{Сам запрос}
SQLTransaction1.Commit;
Старожилы - поправьте меня, если ошибаюсь...
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Простая БД на SQLite

Сообщение EatMyShorts » 10.10.2009 16:52:34

wofs
Спасибо, сейчас попробую.

Добавлено спустя 27 минут 1 секунду:
Вот вроде бы сделал по пунктам:
Код: Выделить всё
try
     SQLite3Connection1.DatabaseName:='c:\test\test.db3';
     SQLite3Connection1.Open;
     SQLTransaction1.Active:=true;
     sql.sql.add('SELECT DISTINCT name FROM pers');
     sql.ExecSQL;
     SQLTransaction1.Commit;
     sql.open;
     sql.first;
     while not sql.EOF do
     begin
          writeln(sql.FieldByName('name').AsString);
          sql.next;
     end;

     except
       on E: Exception do
        writeln('error: '+E.message);
       end;               


Выводит ошибку: Unable to open file "'test.db3'"
По ходу это связано со свойством Connection.DatabaseName, не пойму как его задать?
EatMyShorts
новенький
 
Сообщения: 30
Зарегистрирован: 06.10.2009 19:48:19

Re: Простая БД на SQLite

Сообщение wofs » 10.10.2009 17:27:59

а приаттач этот самый файлик сюда(test.db3) - попробою исправить ошибку.
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru