SQLite
簡介
SQLite,是一款輕型的資料庫,是遵守ACID的關聯式資料庫管理系統,它的設計目标是嵌入式的,而且目前已經在很多嵌入式産品中使用了它,它占用資源非常的低,在嵌入式裝置中,可能隻需要幾百K的記憶體就夠了。它能夠支援Windows/Linux/Unix等等主流的作業系統,同時能夠跟很多程式語言相結合,比如Tcl、C#、PHP、Java等,還有ODBC接口,同樣比起Mysql、PostgreSQL這兩款開源世界著名的資料庫管理系統來講,它的處理速度比他們都快。SQLite第一個Alpha版本誕生于2000年5月。 至今已經有12個年頭,SQLite也迎來了一個版本SQLite3已經釋出。
SQLite的功能
SQLite雖然很小巧,但是支援的SQL語句不會遜色于其他開源資料庫,它支援的SQL包括:
ATTACH DATABASE
BEGIN TRANSACTION
comment
COMMIT TRANSACTION
COPY
CREATE INDEX
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
DELETE
DETACH DATABASE
DROP INDEX
DROP TABLE
DROP TRIGGER
DROP VIEW
END TRANSACTION
EXPLAIN
expression
INSERT
ON CONFLICT clause
PRAGMA
REPLACE
ROLLBACK TRANSACTION
SELECT
UPDATE
同時它還支援事務處理功能等等。也有人說它象Microsoft的Access,有時候真的覺得有點像,但是事實上它們差別很大。比如SQLite 支援跨平台,操作簡單,能夠使用很多語言直接建立資料庫,而不象Access一樣需要Office的支援。如果你是個很小型的應用,或者你想做嵌入式開發,沒有合适的資料庫系統,那麼現在你可以考慮使用SQLite。目前它的最新版本是3.7.8。它的官方網站是:http://www.sqlite.org或者http://www.sqlite .com .cn,能在上面獲得源代碼和文檔。同時因為資料庫結構簡單,系統源代碼也不是很多,也适合想研究資料庫系統開發的專業人士。
SQLite的特性
下面是通路SQLite官方網站: http://www.sqlite. org/ 時第一眼看到關于SQLite的特性.
1. ACID事務
2. 零配置 – 無需安裝和管理配置
3. 儲存在單一磁盤檔案中的一個完整的資料庫
4. 資料庫檔案可以在不同位元組順序的機器間自由的共享
5. 支援資料庫大小至2TB
6. 足夠小,大緻3萬行C代碼,250K
7. 比一些流行的資料庫在大部分普通資料庫操作要快
8. 簡單,輕松的API
9. 包含TCL綁定,同時通過Wrapper支援其他語言的綁定
10. 良好注釋的源代碼, 并且有着90%以上的測試覆寫率
11. 獨立: 沒有額外依賴
12. Source完全的Open,你可以用于任何用途,包括出售它
13. 支援多種開發語言,C、PHP、Perl、Java、C#、Python
SQLite類型
SQLite的資料類型
首先你會接觸到一個讓你驚訝的名詞:Typelessness(無類型).對! SQLite是無類型的.這意味着你可以儲存任何類型的資料到你所想要儲存的任何表的任何列中,無論這列聲明的資料類型是什麼(隻有在一種情況下不是, 稍後解釋).對于SQLite來說對字段不指定類型是完全有效的. 如:
Create Table ex1(a, b, c);
誠然SQLite允許忽略資料類型,但是仍然建議在你的Create Table語句中指定資料類型.因為資料類型對于你和其他的程式員交流,或者你準備換掉你的資料庫引擎時能起到一個提示或幫助的作用.SQLite支援常見的資料類型,如:
CREATE TABLE ex2(
a VARCHAR(10),
b NVARCHAR(15),
c TEXT,
d INTEGER,
e FLOAT,
f BOOLEAN,
g CLOB,
h BLOB,
i TIMESTAMP,
j NUMERIC(10,5)
k VARYING CHARACTER (24),
l NATIONAL VARYING CHARACTER(16)
);
前面提到在某種情況下,SQLite的字段并不是無類型的.即在字段類型為”Integer Primary Key”時.
如何連接配接SQLite?
用PHP操作sqlite資料庫
a、 如何連接配接sqlite資料庫?
if ($db = sqlite_open('mysqlitedb', 0666, $sqliteerror)) {
select * from sqlite_master;
echo "資料庫連接配接成功!n
";
} else {
die($sqliteerror);
}
b、 如何列出資料庫中所有的表?
if ($db = sqlite_open('mysqlitedb', 0666, $sqliteerror)) {
$result = sqlite_array_query($db, 'select * from sqlite_master;');
foreach ($result as $entry) {
echo 'talbe name='.$entry['name']."
n";
echo 'sql='.$entry['sql']."
n";
echo "
--------------------------------------------------------------------------------
";
}
sqlite_close($db);
} else {
die($sqliteerror);
}}
c、 對sqlite資料庫的查詢,以及結果集的顯示
if ($db = sqlite_open('mysqlitedb', 0666, $sqliteerror)) {
$result = sqlite_array_query($db, 'select name, email from user ', SQLITE_ASSOC);
echo "user表查詢結果:
n";
echo " n name email
n";
foreach ($result as $entry) {
echo ' '.$entry['name']." " $entry['email']."
n";
}
echo ' ';
sqlite_close($db);
} else {
die($sqliteerror);
}
d、 資料庫對象記錄的增加、删除、修改
sqlite_query($db, "INSERT INTO user VALUES('user".$i."'" ",'user".$i."@ hichina. com')");
sqlite_query($db, "delete from user where user=’user99’");
sqlite_query($db, 'UPDATE user SET email="lilz@ hichina .com" where name="user1"');
用JAVA操作SQLite
開發所需依賴
先下載下傳SQLite資料庫的驅動包
将下載下傳到的包解壓後得到jar包sqlitejdbc-v033-nested.jar放到%JAVA_HOME%\lib 下,并且将其添加到classpath系統環境變量中,我的classpath系統環境變量現在為:
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\sqlitejdbc-v033-nested.jar
在你的代碼中引用這個驅動:
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager.getConnection("jdbc:sqlite:filename");//filename為你的SQLite資料名稱
// ... use the database ...
conn.close();
或者在編寫代碼的時候進行外部jar包的導入。步驟:右擊工程->Build Path->Config Build Path->Libraries->Add External Jars選擇你要導入的SQLite的jar包
示例代碼
package wang.liang;
import java.sql.*;
public class TestSQLite {
public static void main(String[] args) {
try {
Class.forName("org.sqlite.JDBC");//連接配接SQLite的JDBC
//建立一個資料庫名testSQLite.db的連接配接,如果不存在就目錄下建立之
Connection conn =DriverManager.getConnection("jdbc:sqlite://E:/Program code/SQLite code/testSQLite.db");
Statement stat = conn.createStatement();
//建立一個表,兩列
stat.executeUpdate("create table table1(name varchar(20), salary int);");
//插入資料
stat.executeUpdate("insert into table1 values('ZhangSan',6000);"); stat.executeUpdate("insert into table1 values('LiSi',7800);");
stat.executeUpdate("insert into table1 values('WangWu',8800);");
stat.executeUpdate("insert into table1 values('ZhaoLiu',9000);");
ResultSet rs = stat.executeQuery("select * from table1;");//查詢資料
while(rs.next()){//将查詢到的資料列印出來
System.out.print("name = "+ rs.getString("name")+" ");//列屬性一
System.out.println("salary = "+ rs.getString("salary"));//列屬性二
}
rs.close();
conn.close();//結束資料庫的連接配接
}
catch(Exception e ) {
e.printStackTrace();
}
}
}
總結:本文介紹了嵌入式資料庫SQLite在Java中的應用,通過建立表、插入資料、查詢等操作介紹了在Java中對資料庫的操縱。
用C、C++操作SQLite
核心對象和接口
SQL資料庫引擎的最主要任務是解析SQL語句。為了達成這個目的,開發者需要了解兩個對象:
* 資料庫連接配接對象:sqlite3
* 預處理語句對象:sqlite3_stmt
嚴格來講,預處理語句對象并不是必須的,因為能夠使用sqlite_exec或者sqlite3_get_table這些便于使用的封裝接口,而這些接口封裝并隐藏了預處理語句對象。盡管如此,對預處理對象的了解有助于我們更充分的使用SQLite。
資料庫連接配接對象和預處理對象是由下列的一組C/C++接口調用操縱的:
* sqlite3_open()
* sqlite3_prepare()
* sqlite3_step()
* sqlite3_column()
* sqlite3_finalize()
* sqlite3_close()
這6個C/C++接口例程和上述的兩個對象構成了SQLite的核心功能。開發者對于它們的了解能夠更好的使用SQLite。
注意,這個接口例程清單更多是概念上的意義而不是實際的接口。許多這些接口都出現在各個版本之中。例如,上述清單中的sqlite3_open()例程實際上有三個不同的接口以略微不同的方式實作相同的功能:slqite3_open(),sqlite3_open16()和sqlite3_open_v2()。清單中的實際上并不存在sqlite3_column()這個接口。顯示在清單中的“sqlite3_column()”僅僅是一個占位,表示一整套用于從表中查詢出各種資料類型的列記錄接口。
這裡說明下核心接口的主要功能:
sqlite3_open() 該接口打開與一個SQLite資料庫檔案的連接配接并傳回一個資料庫連接配接對象。這通常是應用程式調用的第一個SQLite API接口而且也是調用其他SQLite API接口前需要調用的接口。許多SQLite接口需要一個指向資料庫連接配接對象的指針作為它們的第一個參數,因而這些接口也可以了解成是資料庫連接配接對象的操作接口。該接口就是建立了這樣一個資料庫連接配接對象。
sqlite3_prepare() 該接口把一個SQL語句文本轉換成一個預處理語句對象并傳回一個指向該對象的指針。這個接口需要一個由先前調用sqlite3_open()傳回的資料庫連接配接對象指針以及一個預處理的SQL語句文本字元串為參數。這個API并不實際解析SQL語句,僅僅是為後續的解析而對SQL語句進行的預處理。
注意:新的應用中不建議使用sqlite3_prepare(),應該使用另一個接口sqlite3_prepare_v2()。
sqlite3_step() 該接口用于解析一個由先前通過sqlite3_prepare()接口建立的預處理語句,直至傳回第一列結果為止。通過再次調用sqlite3_step()可以傳回下一列的結果,繼續不斷地調用sqlite3_step()直至整個語句完成為止。對于那些并不傳回結果的語句(例如:INSERT,UPDATE,DELETE語句)一次調用sqlite3_step()就完成了語句的處理。
sqlite3_column() 該接口傳回一個由sqlite3_step()解析的預處理語句結果集中目前行某一列資料。每次執行sqlite3_step()都傳回一個新結果集中的一行。可以多次調用sqlite3_column()接口傳回那一行中所有列的資料。就像上面所說的那樣,SQLite API中并沒有sqlite3_column()這樣的接口。取而代之的是一組用于從結果集中查詢出各個列項各種資料類型資料的函數接口。在這組函數接口中,有些接口傳回結果集的大小,有些傳回結果集的列數。
*sqlite3_column_blob()
*sqlite3_column_bytes()
*sqlite3_column_bytes16()
*sqlite3_column_count()
*sqlite3_column_double()
*sqlite3_column_int()
*sqlite3_column_int64()
*sqlite3_column_text()
*sqlite3_column_text16()
*sqlite3_column_type()
*sqlite3_column_value()
sqlite3_finalize() 該接口銷毀之前調用sqlite3_prepare()建立的預處理語句。每一個預處理語句都必須調用這個接口進行銷毀以避免記憶體洩漏。
sqlite3_close() 該接口關閉一個由之前調用sqlite3_open()建立的資料庫連接配接。所有與該連接配接相關的預處理語句都必須在關閉連接配接之前銷毀。
開發所需依賴
下載下傳位址:http://www.sqlite.org/download.html
在該頁面上下載下傳Source Code中的sqlite-amalgamation-3071300.zip,該包有含有兩個頭檔案,兩個實作檔案。
下載下傳Precompiled Binaries For Windows中的sqlite-dll-win32-x86-3071300.zip,該包中含有一個def檔案,一個dll檔案。
建立一個win32控制台應用程式sqlite,選擇空項目。
方法一:将所得dll、sqlite3.h、sqlite3.lib檔案拷貝到../工程/sqlite/下,點選頭檔案,選擇添加現有項,選擇拷貝的sqlite.h檔案,選擇工程->屬性->連結器->輸入->附加依賴項,填寫sqlite3.lib,再在原檔案中編寫自己的主程式。
方法二:将sqlite3.h、sqlite3.c、sqlite3.lib檔案拷貝../工程/sqlite/下,點選頭檔案,選擇添加現有項,選擇拷貝的sqlite3.h檔案。點選源檔案添加現有項,選擇拷貝的sqlite3.c檔案,選擇工程->屬性->連結器->輸入->附加依賴項,填寫sqlite3.lib,然後便攜自己的主程式。
示例代碼
示例代碼一:
#include
#include "sqlite3.h"
using namespace std;
int main( )
{
sqlite3 *db=NULL; //定義SQLite的連接配接
const char *zErrMsg = 0;//錯誤資訊
int rc;
rc = sqlite3_open("E:/Program code/SQLite code/testSQLite.db", &db);
if(rc != SQLITE_OK) //如果打開資料庫失敗
{
zErrMsg = sqlite3_errmsg(db); //擷取錯誤資訊
cout<<zErrMsg<<endl;
sqlite3_close(db); //關閉資料庫連接配接
return -1;
}
cout<<"open testSQLite.db successfully!"<<endl;
sqlite3_close(db);
return 0;
}
示例代碼二:
頭檔案:my_db.h、sqlite3.h
源檔案:sqlitedb.cpp、main.cpp
My_db.h代碼:
#ifndef MY_DB_H
#define MY_DB_H
int open_db();
int create_table();
int drop_table();
int insert_data(int id,char *name,int age);
int search_data(int id);
int search_data(char *name);
int delete_data(int age);
#endif
Sqlitedb.cpp代碼:
#include "sqlite3.h"
#include "my_db.h"
#include
using namespace std;
sqlite3 *db = NULL; //定義資料庫連接配接
const char *errMsg = 0; //定義錯誤資訊
char *zerrMsg = 0; //定義錯誤資訊
//打開資料庫
int open_db()
{
int rc = sqlite3_open("E:/Program code/SQLite code/sqlitejdbc.db",&db); //打開資料庫
if(rc != SQLITE_OK) //資料庫打開失敗
{
errMsg = sqlite3_errmsg(db); //擷取錯誤資訊
cout<<errMsg<<endl;
sqlite3_close(db); //關閉資料庫連接配接
return -1;
}
cout<<"open database successfully!"<<endl;
return 0;
}
//建立表
int create_table()
{
if(open_db() != 0)
{
open_db();
}
char *sql = "create table tab(id int primary key ,name varchar(20) ,age int)";
int rc = sqlite3_exec(db,sql,NULL,NULL,&zerrMsg);
if(rc != SQLITE_OK)
{
errMsg = sqlite3_errmsg(db);
cout<<errMsg<<endl; // cout<<zerrMsg<<endl;
sqlite3_close(db);
return -1;
}
cout<<"建立表成功!"<<endl;
return 0;
}
//删除表
int drop_table()
{
if(open_db() != 0)
{
open_db();
}
char *sql = "drop table tab";
int rc = sqlite3_exec(db,sql,NULL,NULL,&zerrMsg);
if(rc != SQLITE_OK)
{
errMsg = sqlite3_errmsg(db);
cout<<errMsg<<endl; // cout<<zerrMsg<<endl;
sqlite3_close(db);
return -1;
}
cout<<"删除表成功"<<endl;
return 0;
}
//資料添加
int insert_data(int id,char *name,int age)
{
if(open_db() != 0)
{
open_db();
}
sqlite3_stmt *stmt = NULL; //準備語句對象
char *sql = "insert into tab(id,name,age) values(?,?,?)";
int rc = sqlite3_prepare_v2(db,sql,strlen(sql),&stmt,NULL);
if(rc != SQLITE_OK)
{
errMsg = sqlite3_errmsg(db);
cout<<errMsg<<endl;
if(stmt)
{
sqlite3_finalize(stmt);
}
sqlite3_close(db);
return -1;
}
sqlite3_bind_int(stmt,1,id);
//參數一:準備語句對象參數二:序号(從開始)參數三:字元串值參數四:字元串長度參數五:函數指針,SQLITE3執行完操作後回調此函數,通常用于釋放字元串占用的記憶體。(這個函數指針參數具體怎麼使用,我現在還不清楚
sqlite3_bind_text(stmt,2,name,strlen(name),NULL);
sqlite3_bind_int(stmt,3,age);
if(sqlite3_step(stmt) != SQLITE_DONE)
{
sqlite3_finalize(stmt);
sqlite3_close(db);
return -1;
}
cout<<"資料插入成功!"<<endl;
sqlite3_reset(stmt);
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
//資料查詢根據id唯一性查詢
int search_data(int id)
{
if(open_db() != 0)
{
open_db();
}
char *sql = "select * from tab where id = ?";
sqlite3_stmt *stmt = NULL;
int rc = sqlite3_prepare_v2(db,sql,strlen(sql),&stmt,NULL);
if(rc != SQLITE_OK)
{
errMsg = sqlite3_errmsg(db);
cout<<errMsg<<endl;
if(stmt)
{
sqlite3_finalize(stmt);
}
sqlite3_close(db);
return -1;
}
sqlite3_bind_int(stmt,1,id);
int nColumn = sqlite3_column_count(stmt); //擷取資料庫表的列數
int type; //表字段所對應的類型
rc = sqlite3_step(stmt);
if(rc == SQLITE_ROW)
{
for(int i=0;i
{
type = sqlite3_column_type(stmt,i);
if(type == SQLITE_INTEGER)
{
cout<<sqlite3_column_name(stmt,i)<<"\t"<<sqlite3_column_int(stmt,i)<<endl;
}
if(type == SQLITE_TEXT)
{
cout<<sqlite3_column_name(stmt,i)<<"\t"<<sqlite3_column_text(stmt,i)<<endl;
}
else if(type == SQLITE_NULL)
{
cout<<"no value"<<endl;
}
}
}
else if(rc == SQLITE_DONE)
{
cout<<"select finish!"<<endl;
}
else
{
cout<<"select fail"<<endl;
sqlite3_finalize(stmt);
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
//資料查詢根據姓名批量查詢
int search_data(char *name)
{
if(open_db() != 0)
{
open_db();
}
char *sql = "select * from tab where name = ?";
sqlite3_stmt *stmt = NULL;
int rc = sqlite3_prepare_v2(db,sql,strlen(sql),&stmt,NULL);
if(rc != SQLITE_OK)
{
errMsg = sqlite3_errmsg(db);
cout<<errMsg<<endl;
if(stmt)
{
sqlite3_finalize(stmt);
}
sqlite3_close(db);
return -1;
}
sqlite3_bind_text(stmt,1,name,strlen(name),NULL);
int nColumn = sqlite3_column_count(stmt);
int type;
rc = sqlite3_step(stmt);//如果是select語句,且有還有記錄,則應該傳回SQLITE_ROW
while(true) {
if(rc == SQLITE_ROW)
{
cout<<"--------------"<<endl;
for(int i=0;i
{
type = sqlite3_column_type(stmt,i);
if(type == SQLITE_INTEGER)
{
cout<<sqlite3_column_name(stmt,i)<<"\t"<< sqlite3_column_int(stmt,i)<<endl;
}
if(type == SQLITE_TEXT)
{
cout<<sqlite3_column_name(stmt,i)<<"\t"<< sqlite3_column_text(stmt,i)<<endl;
}
else if(type == SQLITE_NULL)
{
cout<<"no value"<<endl;
}
}
}
else if(rc == SQLITE_DONE)
{
cout<<"select finish!"<<endl;
}
else
{
cout<<"select fail"<<endl;
sqlite3_finalize(stmt);
}
if (sqlite3_step(stmt) != SQLITE_ROW)
break;
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
//删除資料
int delete_data(int age)
{
if(open_db() != 0)
{
open_db();
}
char *sql = "delete from tab where age = ?";
sqlite3_stmt *stmt = NULL;
int rc = sqlite3_prepare_v2(db,sql,strlen(sql),&stmt,NULL);
if(rc != SQLITE_OK)
{
errMsg = sqlite3_errmsg(db);
cout<<errMsg<<endl;
if(stmt)
{
sqlite3_finalize(stmt);
}
sqlite3_close(db);
return -1;
}
sqlite3_bind_int(stmt,1,age);
rc = sqlite3_step(stmt);//如果是update, delete, insert等語句,正常應該傳回SQLITE_DONE
if(rc == SQLITE_DONE)//SQLITE_DONE意味着已成功完成執行該語句
{
cout<<"删除資料成功"<<endl;
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
main.cpp代碼:
#include "my_db.h"
#include
using namespace std;
int main()
{
//open_db();
//create_table();
//drop_table();
//insert_data(3,"wang",25);
//search_data(1);
//search_data("wang");
//delete_data(28);
return 0;
}
SQLite加密解密
對資料庫而言,加密無非是必不可少了一個環節,如何才能讓自己更安全更放心的使用SQLite呢?加密!但是在這裡還是很不好意思的說,如果是面向公衆開放的開源性SQLite,他是不能實作加密的,當然,除非你付款。此前我也很想研究下加密部分,當看到資料上存在可以加密、解密的方法時,很興奮的試了試,結果卻很讓人很糾結。
進入sqlite3.h頭檔案當中,搜尋sqlite3_key(sqlite3 *db,const void *pKey,int nKey)加密方法、sqlite3_rekey(sqlite3 *db,const void *pKey,int nKey)解密方法時,可以看到主要的注釋——The code to implement this API is not available in the public release of SQLite.
雖然加密解密方法對于開源使用者來說不能使用,但是我們畢竟也了解到SQLite本身是提供加密、解密方法的。是以先了解一下加密、解密方法的使用吧。
加密:
給一個未加密的資料庫添加密碼:如果想要添加密碼,則可以在打開資料庫檔案之後,關閉資料庫檔案之前的任何時刻調用sqlite3_key函數即可,
該函數有三個參數,其中參數一:資料庫對象 參數二:要設定的密碼 參數三:密碼的長度。例:sqlite3_key(db,"123456",6);
解密:
sqlite3_rekey是變更密碼或給沒有加密的資料庫添加密碼或清空密碼,變更密碼或清空密碼前必須先正确執行sqlite3_key。
在正确執行sqlite3_rekey之後在sqlite3_close關閉資料庫之前可以正常操作資料庫,不需要再執行sqlite3_key。
sqlite3_rekey( sqlite3 *db, const void *pKey, int nKey),參數同上。清空密鑰為sqlite3_rekey( db, NULL, 0)。
如果實在是想進行加密解密的話,那麼我也不妨提出自己的兩個建議吧!
建議一:掏錢購買吧!沒什麼可說的。
建議二:自己實作加密解密方法。對即将存入資料庫的資料進行加密之後再進行儲存,取資料的時候先進行解密再進行擷取。
SQLite的管理
管理工具也有不少,這裡介紹幾款:
1、SQLite Manager是開放源代碼的SQLite管理工具,用來管理本地電腦上的SQLite資料庫,可以獨立運作(以XULRunner方式),也可以作為Firefox、Thunderbird、Seamonkey、Songbird、Komodo、Gecko等的插件。
2、SQLite Administrator是一個用來管理 SQLite 資料庫檔案的圖形化工具,可進行建立、設計和管理操作。提供代碼編輯器具有自動完成和文法着色,支援中文,适合初學者。
3、SQLite Database browser是一個 SQLite 資料庫的輕量級GUI用戶端,基于Qt庫開發,界面清潔,操作簡單,主要是為非技術使用者建立、修改和編輯SQLite資料庫的工具,使用向導方式實作。
QtSql子產品提供了與平台以及資料庫種類無關的通路SQL資料庫的接口,這個接口由利用Qt的模型視圖結構将資料庫與使用者界面內建的一套類來支援。
QSqlDatabase對象象征了資料庫的關聯。Qt使用驅動程式與各種資料庫的應用程式設計接口進行通信。Qt的桌面版(Desktop Edition)包括如下一些驅動程式:
驅動程式 | 資料庫 |
QDB2 | IBM DB2 7.1版以及更新的版本 |
QIBASE | Borland InterBase |
QMYSQL | MySql |
QOCI | 甲骨文公司(Oracle Call Interface) |
QODBC | ODBC(包括微軟公司的QSL服務) |
QPSQL | PostgreSQL的7.3版以及更高版本 |
QSQLITE | QSLite第3版 |
QSQLITE2 | QSLite第2版 |
QTDS | Qybase自适應伺服器 |
由于授權的許可限制,Qt的開源版本無法提供所有的驅動程式,當配置Qt時,即可以選擇Qt本身包含的SQL驅動程式,也可以以查件的形式建立驅動程式,公共領域中不斷發展的SQLite資料庫将向Qt提供支援。 如下讨論關于Qt進行SQLite的基本操作。 代碼如下:
1 //添加資料庫驅動、設定資料庫名稱、資料庫登入使用者名、密碼
2 QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE");
3 database.setDatabaseName("database.db");
4 database.setUserName("root");
5 database.setPassword("123456");
6
7 //打開資料庫
8 if(!database.open())
9 {
10 qDebug()<<database.lastError();
11 qFatal("failed to connect.") ;
12 }
13 else
14 {
15 //QSqlQuery類提供執行和操作的SQL語句的方法。
16 //可以用來執行DML(資料操作語言)語句,如SELECT、INSERT、UPDATE、DELETE,
17 //以及DDL(資料定義語言)語句,例如CREATE TABLE。
18 //也可以用來執行那些不是标準的SQL的資料庫特定的指令。
19 QSqlQuery sql_query;
20
21 QString create_sql = "create table student (id int primary key, name varchar(30), age int)";
22 QString select_max_sql = "select max(id) from student";
23 QString insert_sql = "insert into student values (?, ?, ?)";
24 QString update_sql = "update student set name = :name where id = :id";
25 QString select_sql = "select id, name from student";
26 QString select_all_sql = "select * from student";
27 QString delete_sql = "delete from student where id = ?";
28 QString clear_sql = "delete from student";
29
30 sql_query.prepare(create_sql);
31 if(!sql_query.exec())
32 {
33 qDebug()<<sql_query.lastError();
34 }
35 else
36 {
37 qDebug()<<"table created!";
38 }
39
40 //查詢最大id
41 int max_id = 0;
42 sql_query.prepare(select_max_sql);
43 if(!sql_query.exec())
44 {
45 qDebug()<<sql_query.lastError();
46 }
47 else
48 {
49 while(sql_query.next())
50 {
51 max_id = sql_query.value(0).toInt();
52 qDebug()<<QString("max id:%1").arg(max_id);
53 }
54 }
55 //插入資料
56 sql_query.prepare(insert_sql);
57 sql_query.addBindValue(max_id+1);
58 sql_query.addBindValue("name");
59 sql_query.addBindValue(25);
60 if(!sql_query.exec())
61 {
62 qDebug()<<sql_query.lastError();
63 }
64 else
65 {
66 qDebug()<<"inserted!";
67 }
68
69 //更新資料
70 sql_query.prepare(update_sql);
71 sql_query.bindValue(":name", "Qt");
72 sql_query.bindValue(":id", 1);
73 if(!sql_query.exec())
74 {
75 qDebug()<<sql_query.lastError();
76 }
77 else
78 {
79 qDebug()<<"updated!";
80 }
81
82 //查詢部分資料
83 if(!sql_query.exec(select_sql))
84 {
85 qDebug()<<sql_query.lastError();
86 }
87 else
88 {
89 while(sql_query.next())
90 {
91 int id = sql_query.value("id").toInt();
92 QString name = sql_query.value("name").toString();
93
94 qDebug()<<QString("id:%1 name:%2").arg(id).arg(name);
95 }
96 }
97
98 //查詢所有資料
99 sql_query.prepare(select_all_sql);
100 if(!sql_query.exec())
101 {
102 qDebug()<<sql_query.lastError();
103 }
104 else
105 {
106 while(sql_query.next())
107 {
108 int id = sql_query.value(0).toInt();
109 QString name = sql_query.value(1).toString();
110 int age = sql_query.value(2).toInt();
111
112 qDebug()<<QString("id:%1 name:%2 age:%3").arg(id).arg(name).arg(age);
113 }
114 }
115
116 //删除資料
117 sql_query.prepare(delete_sql);
118 sql_query.addBindValue(max_id);
119 if(!sql_query.exec())
120 {
121 qDebug()<<sql_query.lastError();
122 }
123 else
124 {
125 qDebug()<<"deleted!";
126 }
127
128 //清空表
129 sql_query.prepare(clear_sql);
130 if(!sql_query.exec())
131 {
132 qDebug()<<sql_query.lastError();
133 }
134 else
135 {
136 qDebug()<<"cleared";
137 }
138 }
139
140 //關閉資料庫
141 database.close();
142
143 //删除資料庫
144 QFile::remove("database.db");
可以通過一些工具對SQLite進行管理,如下:

SQLite的管理 管理工具挺多的,這裡簡單介紹幾款:
- SQLite Manager:開放源代碼的SQLite管理工具,用來管理本地電腦上的SQLite資料庫,可以獨立運作(以XULRunner方式),也可以作為Firefox、Thunderbird、Seamonkey、Songbird、Komodo、Gecko等的插件。
- SQLite Administrator:一個用來管理SQLite資料庫檔案的圖形化工具,可進行建立、設計和管理操作。提供代碼編輯器具有自動完成和文法着色,支援中文,适合初學者。
- SQLite Database browser:一個SQLite資料庫的輕量級GUI用戶端,基于Qt庫開發,界面清潔,操作簡單,主要是為非技術使用者建立、修改和編輯SQLite資料庫的工具,使用向導方式實作。