Последняя версия DataExpress 3 beta от 18 июля 2020 года.
Изображение Скачать | Изображение Что нового?
См. также: Энциклопедия DX | Форум на develop-soft | Расширения
ИзображениеИзображениеИзображение

Lazarus и SQLite

Все вопросы, связанные с написанием скриптов и SQL-запросов.
Виталий1990
Опытный
Сообщения: 295
Зарегистрирован: Сб июл 15, 2017 3:08 pm
Откуда: Санкт-Петербург
Поблагодарили: 2 раза

Lazarus и SQLite

Сообщение Виталий1990 » Вт апр 30, 2019 8:29 pm

Изучаю Лазарус. После опыта работы с DataExpress возник вопрос: если файл с данными лежит не где-то на стороннем сервере, а на самом компьютере, так ли уж нужно добавлять элементы SQL?

Аватара пользователя
admin
Разработчик
Сообщения: 5038
Зарегистрирован: Пн мар 14, 2016 11:32 am
Откуда: Ленинградская
Благодарил (а): 39 раз
Поблагодарили: 304 раза

Re: Lazarus и SQLite

Сообщение admin » Вт апр 30, 2019 8:42 pm

Смотря какой файл.

Аватара пользователя
Develop-Soft
Сообщения: 1638
Зарегистрирован: Вт мар 05, 2019 6:09 pm
Благодарил (а): 122 раза
Поблагодарили: 444 раза
Контактная информация:

Re: Lazarus и SQLite

Сообщение Develop-Soft » Ср май 01, 2019 12:51 am

Первый результат в поисковике: https://devlaz.ru/lazarus_sqlite/
Если же вопрос: "можно ли открыть базу данных и работать с ней в режиме sql, не используя специальных компонентов или библиотек (как с обычным файлом)?" - нет, так нельзя.

Виталий1990
Опытный
Сообщения: 295
Зарегистрирован: Сб июл 15, 2017 3:08 pm
Откуда: Санкт-Петербург
Поблагодарили: 2 раза

Re: Lazarus и SQLite

Сообщение Виталий1990 » Чт май 02, 2019 6:49 pm

В общем и целом настройку выполнил. Однако лазарус не видит созданную в БД таблицу. Даже после пересоздания файла базы.

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

unit Main;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Sqlite3DS, sqldb, sqlite3conn, db, Forms, Controls,
  Graphics, Dialogs, DBGrids, StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    ButtonFIND: TButton;
    ButtonADD: TButton;
    ButtonDEL: TButton;
    DataSource: TDataSource;
    DBGrid1: TDBGrid;
    EditID: TEdit;
    EditFIO: TEdit;
    EditTEL: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    SQLite3Connection: TSQLConnector;
    Sqlite3Dataset: TSqlite3Dataset;
    SQLQuery: TSQLQuery;
    SQLTransaction: TSQLTransaction;
    procedure ButtonADDClick(Sender: TObject);
    procedure ButtonDELClick(Sender: TObject);
    procedure ButtonFINDClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
 
  public
 
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
  procedure TForm1.FormCreate(Sender: TObject);
  begin
    {Параметры компонентов работы с базой
    Можно выставить в опциях у каждого компонента.}
    //*******************************
    SQLite3Dataset.FileName:='devlaz.db';
    SQLite3Dataset.TableName:='kartoteka';
    DataSource.DataSet:=SQLite3Dataset;
    SQLite3Connection.DatabaseName:='kartoteka.db';
    SQLite3Connection.Transaction:=SQLTransaction;
    SQLTransaction.DataBase:=SQLite3Connection;
    SQLQuery.DataBase:=SQLite3Connection;
    SQLQuery.Transaction:=SQLTransaction;
    //*******************************
 
    try
       SQLite3Dataset.Open;
       SQLite3Connection.Connected:=True;
    except
       On E:Exception do
          ShowMessage('Ошибка открытия базы: '+ E.Message);
    end;
  end;
 
procedure TForm1.ButtonADDClick(Sender: TObject);
begin
  SQLite3Dataset.Close;
 
  with SQLQuery do
  begin
    SQL.Clear;
    SQL.Add('INSERT INTO kartoteka(fio, tel) VALUES(:FIO,:TEL)');
    ParamByName('FIO').Text:=EditFIO.Text;
    ParamByName('TEL').Text:=EditTEL.Text;
    ExecSQL;
    SQLTransaction.Commit;
    Close;
  end;
 
  SQLite3Dataset.Open;
end;
 
procedure TForm1.ButtonDELClick(Sender: TObject);
begin
  SQLite3Dataset.Close;
 
  with SQLQuery do
  begin
    SQL.Clear;
    SQL.Add('DELETE FROM kartoteka where id=:ID');
    ParamByName('ID').Text:=EditID.Text;
    ExecSQL;
    SQLTransaction.Commit;
    Close;
  end;
 
  SQLite3Dataset.Open;
end;
 
procedure TForm1.ButtonFINDClick(Sender: TObject);
begin
  with SQLQuery do
  begin
    SQL.Clear;
    SQL.Add('SELECT * FROM kartoteka where id = :id');
    ParamByName('id').Text:=EditID.Text;
    Open;
  end;
 
  ShowMessage(SQLQuery.FieldByName('fio').AsString);
  SQLQuery.Close;
end;
 
end.
Вложения
Ошибка в таблице.png
Ошибка в таблице.png (22.76 КБ) 1108 просмотров

Виталий1990
Опытный
Сообщения: 295
Зарегистрирован: Сб июл 15, 2017 3:08 pm
Откуда: Санкт-Петербург
Поблагодарили: 2 раза

Re: Lazarus и SQLite

Сообщение Виталий1990 » Пт май 03, 2019 9:01 am

admin, можете подсказать, пожалуйста, при создании оболочки в лазарусе компонентами какой БД пользовались? И как завязали создание таблиц БД на программу? Прошу прощения за "зелёные" вопросы.

Аватара пользователя
Develop-Soft
Сообщения: 1638
Зарегистрирован: Вт мар 05, 2019 6:09 pm
Благодарил (а): 122 раза
Поблагодарили: 444 раза
Контактная информация:

Re: Lazarus и SQLite

Сообщение Develop-Soft » Пт май 03, 2019 9:35 am

А какова итоговая цель в работе с базой SQLite (если не считать изучения Lazarus)?

Может быть вам нужен Z?

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

var SQLiteObject,SQLiteRS:variant;

function SQLiteInit(DataBase:string):boolean;
var SQLiteConnectionString:string;
begin
    SQLiteObject := CreateOleObject('ADODB.Connection');
    SQLiteConnectionString := 'DRIVER=SQLite3 ODBC Driver;Database=' + DataBase + ';';
    try
        SQLiteObject.Open(SQLiteConnectionString);
    except
      debug('Невозможно подключится к драйверу SQLite. Возможно файл ['
      + DataBase + '] открыт другим пользователем или программой!');
      result:=false;
    end;
    result :=true;
end;

function SQLiteQuery(QueryString:string):variant;
  begin
    SQLiteRS := CreateOleObject('ADODB.Recordset');
  try
   SQLiteRS := SQLiteObject.Execute(QueryString);
  except
    debug('Невозможно выполнить SQL запрос: ' +#13#10+ ExceptionParam);
    result := false;
  end;
    result := SQLiteRS;
end;

procedure TestSQL(Sender: TObject);
var strTable,strRow:string;
i:integer;
begin
if not SQLiteInit('D:\1.db') then exit;
// SQLiteQuery('CREATE TABLE table1 (name,tel);')
//SQLiteQuery('INSERT INTO table1(name, tel) VALUES(''Иванов'',''11111'');');
//SQLiteQuery('INSERT INTO table1(name, tel) VALUES(''Петров'',''22222'');');
//SQLiteQuery('INSERT INTO table1(name, tel) VALUES(''Сидоров'',''33333'');');
SQLiteQuery('select * from table1;');

while  SQLiteRS.EOF = 0 do
  begin
    strRow:='';
      For i:=0 To SQLiteRS.Fields.Count-1 do
      begin
        strRow:=strRow+VarToStr(SQLiteRS.Fields(i).Value)+#9;
        //...
      end;
    strTable:=strTable+strRow+#13#10;
    SQLiteRS.MoveNext;
  end;
debug(strTable);
SQLiteRS.Close;
SQLiteRS := Unassigned;
SQLiteObject  := Unassigned; 
end;

procedure Form_Create;
begin
 dxButton1.OnClick := @TestSQL;
end;     
Изображение

Виталий1990
Опытный
Сообщения: 295
Зарегистрирован: Сб июл 15, 2017 3:08 pm
Откуда: Санкт-Петербург
Поблагодарили: 2 раза

Re: Lazarus и SQLite

Сообщение Виталий1990 » Пт май 03, 2019 10:29 am

Develop-Soft писал(а):А какова итоговая цель в работе с базой SQLite (если не считать изучения Lazarus)?


Цель работы с базой по сути та же, что и с конструктором: перевод архивных записей в электронный вариант.

Виталий1990
Опытный
Сообщения: 295
Зарегистрирован: Сб июл 15, 2017 3:08 pm
Откуда: Санкт-Петербург
Поблагодарили: 2 раза

Re: Lazarus и SQLite

Сообщение Виталий1990 » Пт май 03, 2019 10:31 am

Develop-Soft писал(а):Может быть вам нужен Z?

В чём суть этого драйвера?

Аватара пользователя
Develop-Soft
Сообщения: 1638
Зарегистрирован: Вт мар 05, 2019 6:09 pm
Благодарил (а): 122 раза
Поблагодарили: 444 раза
Контактная информация:

Re: Lazarus и SQLite

Сообщение Develop-Soft » Пт май 03, 2019 10:38 am

Виталий1990 писал(а):В чём суть этого драйвера?

Прописывает внутри системы класс для работы с SQLite из любого приложения с помощью OLE. Рабочий пример кода привел из DataExpress.

Виталий1990
Опытный
Сообщения: 295
Зарегистрирован: Сб июл 15, 2017 3:08 pm
Откуда: Санкт-Петербург
Поблагодарили: 2 раза

Re: Lazarus и SQLite

Сообщение Виталий1990 » Пт май 03, 2019 10:41 am

Develop-Soft писал(а):
Виталий1990 писал(а):В чём суть этого драйвера?

Прописывает внутри системы класс для работы с SQLite из любого приложения с помощью OLE. Рабочий пример кода привел из DataExpress.

Правильно ли я понимаю, что при наличии этого драйвера можно спокойно работать с SQLite практически из любой программы? Прошу прощения за глупый вопрос.


Вернуться в «Программирование в DataExpress»