Столкнулся с тем что нужно сохранять данные в базе данных 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, особенно если использовать бездумно, но зато "всё свое ношу с собой" :)
Комментариев нет:
Отправить комментарий