Страницы

Поиск по вопросам

воскресенье, 7 июля 2019 г.

Delphi 10 Seattle & DB SQlite основы - Ввод и Ввывод информации из БД

Столкнулся с тем что нужно сохранять данные в базе данных sqlite, научился лишь создавать файл *.db пробую к нему подключиться и сделать запись выдаёт ошибку
[dcc32 Error] E2010 Incompatible types: 'TFDCustomConnection' and 'TSQLConnection'
А вот код:
FDConnection1:=TFDConnection.Create(self); FDConnection1.DriverName:='Sqlite'; FDConnection1.Params.Add('Database=D:\db.db'); FDConnection1.Params.Add('FailIfMissing=False'); FDConnection1.DriverName := 'SQLite'; FDConnection1.Connected := True;
// link Local SQL to SQLite connection FDLocalSQL1.Connection := FDConnection1; FDLocalSQL1.Active := True;
// execute SELECT query on above datasets FDQuery1.Connection := FDConnection1; FDQuery1.SQL.Text:='insert into test (test_id, test_text) VALUES (10,''1'')'; FDQuery1.Active := True;
Ошибка идёт на эту строку FDLocalSQL1.Connection := FDConnection1; а если ее удалить то на вот эту FDQuery1.Connection := FDConnection1; Почему оно не хочет конектиться? Пример брал отсюда docwiki.embarcadero.com/RADStudio/Tokyo/en/Local_SQL_(FireDAC) Если кто нибудь знает напишите простой пример как правильно нужно подключаться, записывать/считывать данные, отключаться, мне всего нужно записать, порядковый_номер и длинный_текст
Приведите пожалуйста рабочий пример на TFDConnection или на TSQLConnection, на TSQLConnection у меня получилось создать файл и записать в него данные, но прочитать его никак не получается и подскажите стоит ли вообще использовать SQlite для хранения и обработки данных под 10 Гбайт?


Ответ

Если вы используете конструкцию FDLocalSQL1.Active := True, то должны вначале использовать FDLocalSQL1.Active :=false. Я предпочитаю другой подход, через Clear и в зависимости от того, ждёте ли вы выборку или нет, - ExecSQL или Open
Пример работы с таблицей SQLIte через VCL-компоненты:
type TForm2 = class(TForm) DBServer: TSQLConnection; SQLQuery1: TSQLQuery; Button1: TButton; procedure Button1Click(Sender: TObject); <...> procedure InitBase(SQLConn: TSQLConnection; FileName: string); // мне так проще, я часто использую TSQLConnection в связке с TSQLQuery вне форм, но в этом случае создавать объекты надо вручную end;
procedure TForm2.InitBase(SQLConn: TSQLConnection; FileName: string); begin SQLConn.ConnectionName := 'SQLITECONNECTION'; SQLConn.DriverName:='Sqlite'; SQLConn.LoginPrompt:= false; SQLConn.Params.Values['Host']:='localhost'; // это не обязательно, дань привычке SQLConn.Params.Values['FailIfMissing']:='False'; SQLConn.Params.Values['ColumnMetaDataSupported']:='False'; // несмотря на то, что для Windows должно бы быть TRUE, у меня почему-то не работает, False решает все проблемы SQLConn.Params.Values['Database']:=FileName; SQLConn.Open; end;
procedure TForm2.Button1Click(Sender: TObject); var s:string; count:integer; begin InitBase(DBServer, 'P:\SQLLite_DBs
ew_base1.sdb'); // подключим файл базы SQLQuery1.SQLConnection := DBServer; s:= 'CREATE table `temp_pos` (`chr` varchar(16) NOT NULL, `pos` bigint(20) NOT NULL, `count` int(11) NOT NULL); '; SQLQuery1.SQL.Clear; SQLQuery1.SQL.Add(s); SQLQuery1.ExecSQL; // вы создаете таблицу, поэтому ExecSQL s:= 'INSERT into `temp_pos`(`chr`, `pos`, `count`) values ("1", 123, 2);'; SQLQuery1.SQL.Clear; SQLQuery1.SQL.Add(s); SQLQuery1.ExecSQL; s:='SELECT COUNT(1) FROM `temp_pos`'; SQLQuery1.SQL.Clear; SQLQuery1.SQL.Add(s); SQLQuery1.Open; // вы получаете данные, поэтому Open if SQLQuery1.RecordCount>0 then begin SQLQuery1.FindFirst; count:=SQLQuery1.Fields.Fields[0].AsInteger; end;
<...> // в конце не забываем
DBServer.Close;
end;
Про 10 гигабайт данных ничего не могу сказать: даже полгигабайта таблицы не достигали. В скорости SQLite уступает MySQL, особенно если использовать бездумно, но зато "всё свое ношу с собой" :)

Комментариев нет:

Отправить комментарий