Последняя версия DataExpress 3 beta от 15 ноября 2020 года.

Изображение Скачать | Изображение Что нового?



Объявление:

Если вам понравилась программа и вы ее интенсивно используете - замолвите словечко о ней на вашем сайте (блоге, форуме, твитере, краской на подъезде, ютуб-канале и т.д.) с активной (по-возможности) ссылкой на сайт программы/форум. Тем самым вы можете внести небольшой вклад в seo-карму проекта в виде входящих ссылок.
Спасибо! Администрация :)


>> Обсудить <<


Внимание! Кража данных


Lazarus и SQLite

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

Lazarus и SQLite

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

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

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

Re: Lazarus и SQLite

Сообщение admin » 30 апр 2019, 20:42

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

Аватара пользователя
Develop-Soft
Сообщения: 1940
Зарегистрирован: 05 мар 2019, 18:09
Благодарил (а): 123 раза
Поблагодарили: 540 раз
Контактная информация:

Re: Lazarus и SQLite

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

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

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

Re: Lazarus и SQLite

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

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

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

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 КБ) 1299 просмотров

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

Re: Lazarus и SQLite

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

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

Аватара пользователя
Develop-Soft
Сообщения: 1940
Зарегистрирован: 05 мар 2019, 18:09
Благодарил (а): 123 раза
Поблагодарили: 540 раз
Контактная информация:

Re: Lazarus и SQLite

Сообщение Develop-Soft » 03 май 2019, 09:35

А какова итоговая цель в работе с базой 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
Опытный
Сообщения: 297
Зарегистрирован: 15 июл 2017, 15:08
Откуда: Санкт-Петербург
Благодарил (а): 1 раз
Поблагодарили: 2 раза

Re: Lazarus и SQLite

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

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


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

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

Re: Lazarus и SQLite

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

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

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

Аватара пользователя
Develop-Soft
Сообщения: 1940
Зарегистрирован: 05 мар 2019, 18:09
Благодарил (а): 123 раза
Поблагодарили: 540 раз
Контактная информация:

Re: Lazarus и SQLite

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

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

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

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

Re: Lazarus и SQLite

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

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

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

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


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