最近一次使用DELPHI作項目是使用DELPHI2009,爲了訪問本地數據庫方便,使用ACCESS數據庫,不須要安裝驅動,(WINDOWS自帶),可是ACCESS數據庫的性能確實很糟糕,經過ADO鏈接,INSERT 1000條數據平均在1.5秒以上。html
面前面臨一個新的項目,本地數據庫是繼續用ADO,仍是其餘,成了一個問題。sql
近期比較流行的本地數據庫是SQLite,想測試下SQLite的性能,和方便程度。數據庫
1.ide
DELPHI 和 SQLITE在度娘上提的最多的是經過ASQLite3DB組件進行鏈接。工具
http://www.2cto.com/kf/201010/76781.html性能
這套組件TSQLiteDatabase類和TSQLiteTable類,經過幾個DLL訪問SQLITE數據,研究發現TSQLiteTable類和DELPHI原生的TDataSet類徹底無關,實在太原始了,沒法和DELPHI原生的數據庫組件鏈接,使用起來可能會很麻煩。測試
無心中發現了一個很好的SQLITE工具:.net
D:\TEST\delphixe5Test\sqllite\數據庫工具\Personal 3orm
2.sqlite
有人提到可使用ADO經過ODBC鏈接,
http://blog.csdn.net/zyq5945/article/details/6457741
網上下載了ODBC驅動,見:D:\TEST\delphixe5Test\sqllitetest\odbc,配置好後,
procedure TForm1.Button3Click(Sender: TObject);
var
i: Integer;
b: Long;
begin
ADOConnection2.BeginTrans;
b := getTickCount();
for I := 0 to 1000 do
begin
adoquery2.SQL.Text := 'insert into a(a) values (''中' + Inttostr(i) + ''')';
adoQuery2.ExecSQL;
end;
ADOConnection2.CommitTrans;
Edit1.Text := IntToStr(getTickCount() - b);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ADOConnection2.ConnectionString := 'Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="Driver={SQLite3 ODBC Driver};Database=C:\Users\hl\Desktop\aa.db;NoWCHAR=1;"';
ADOConnection2.Open();
end;
運行效果還能夠,平均insert 1000條在0.5秒左右,比ACCESS提升了三倍以上。
可是使用ODBC存在一個問題,就是必須安裝ODBC驅動,網上沒有找到如何將驅動直接打在我本身的程序安裝包裏,而且有可能存在部分機器上裝不上ODBC致使沒法鏈接本地數據庫的問題,最後決定放棄ODBC鏈接。
3.
有人提到能夠經過DBEXPRESS進行鏈接,折騰了半天,一直提示沒法找到sqlite3.dll,找了好久也沒找到解決方法,放棄。
4.
正在絕望時,看到http://redboy136.blog.163.com/blog/static/10718843220139206951165/
提到Delphi XE5中的新特性中增長了FireDAC對sqlite的支持。開始研究一下FIREDAC
網上對FIREDAC的介紹很少,還好找到了DELPHI的幫助文件。
測試:
D:\TEST\delphixe5Test\sqllitetest\FireDAC
procedure TForm1.Button1Click(Sender: TObject);
begin
FDConnection1.Params.Clear;
FDConnection1.Params.Add('Database='+ ExtractFilePath(Application.Exename) +'aa.db');
FDConnection1.Params.Add('DriverID=SQLite');
FDConnection1.Connected := True;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i: Integer;
b: Long;
begin
FDConnection1.StartTransaction;
try
b := getTickCount();
for I := 0 to 1000 do
begin
FDQuery2.SQL.Text := 'insert into a(a) values (''' + Inttostr(i) + ''')';
FDQuery2.ExecSQL;
end;
FDConnection1.Commit;
except
FDConnection1.Rollback;
raise;
end;
Edit1.Text := IntToStr(getTickCount() - b);
end;
INSERT 1000條居然不到90毫秒,又無須安裝驅動。太完美了。