一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Ubuntu下安裝SQLite3 (轉(zhuǎn))

 其實我真是李剛 2013-03-05

1.介紹:sqlite3是linux上的小巧的數(shù)據(jù)庫,一個文件就是一個數(shù)據(jù)庫。
2.安裝:
  要安裝sqlite3,可以在終端提示符后運行下列命令:
  sudo apt-get install sqlite3
  檢查版本
  sqlite3 -version
3.測試
  當前目錄下建立test.db測試數(shù)據(jù)庫文件
  sqlite3 test.db
  查詢信息
  .database
  退出
  .exit
4.圖形界面
   可以選擇sqlitebrowser程式(qt3)
   sudo apt-get install sqlitebrowser
   啟動圖形界面可以在終端提示符后輸入sqlitebrowser
5.編程
 PHP:sudo apt-get install php5-sqlite
 Python:sudo apt-get install python-pysqlite2
 Ruby:sudo apt-get install libsqlite3-ruby


比較有用的命令:

.tables 顯示數(shù)據(jù)庫中所有的表.

.schema 顯示所有的表的創(chuàng)建語句.

.schema tableX 顯示表tableX的創(chuàng)建語句.

.quit 退出

SQLite庫包含一個名字叫做sqlite3的命令行,它可以讓用戶手工輸入并執(zhí)行面向SQLite數(shù)據(jù)庫的SQL命令。本文檔提供一個樣使用sqlite3的簡要說明。

開始

      啟動sqlite3程序,僅僅需要敲入帶有SQLite數(shù)據(jù)庫名字的"sqlite3"命令即可。如果文件不存在,則創(chuàng)建一個新的(數(shù)據(jù)庫)文件。然后 sqlite3程序?qū)⑻崾灸爿斎隨QL。敲入SQL語句(以分號“;”結(jié)束),敲回車鍵之后,SQL語句就會執(zhí)行。

        例如,創(chuàng)建一個包含一個表"tb11"名字為"ex1"的SQLite數(shù)據(jù)庫,你可以這樣做:

$sqlite3 ex1

SQLite version 3.3.17

Enter ".help" for instructions

sqlite> create table tbl1(one varchar(10), two smallint);

sqlite> insert into tbl1 values('hello!', 10);

sqlite> insert into tbl1 values('goodbye', 20);

sqlite> select * from tbl1;

hello!|10

goodbye|20

sqlite>

        你可以通過敲你所用系統(tǒng)的文件結(jié)束符(通常是Ctrl + D)或者中斷字符(通常是Ctrl + C)。來終止sqlite3程序。確定你在每個SQL語句結(jié)束敲入分號!sqlite3程序通過查找分號來決定一個SQL語句的結(jié)束。如果你省略分 號,sqlite3將給你一個連續(xù)的命令提示符并等你給當前的SQL命令添加更多的文字。這個特點讓你輸入多行的多個SQL語句,例如:

sqlite> create table tbl2(

   ...> f1 varchar(30) primary key,

   ...> f2 text,

   ...> f3 real

   ...> );

sqlite>

題外話:查詢SQLITE_MASTER表

    SQLite數(shù)據(jù)庫的框架被保存在一個名叫"sqlite_master"的特殊的表中。你可以像查詢其它表一樣通過執(zhí)行“SELECT”查詢這個特殊的表。例如:

$ sqlite3 ex1

SQlite vresion 3.3.10

Enter ".help" for instructions

sqlite> select * from sqlite_master;

     type = table

     name = tbl1

tbl_name = tbl1

rootpage = 3

      sql = create table tbl1(one varchar(10), two smallint)

sqlite>

    但你不能在sqlite_master表中執(zhí)行諸如DROP TABLE, UPDATE, INSERT 或者DELETE命令。sqlite_master表在你創(chuàng)建、刪除和索引數(shù)據(jù)庫時自動更新這個表。你不能手工更改sqlite_master表。

    TEMPORARY表的結(jié)構(gòu)沒有存儲在"sqlite_master"表中,由于TEMPORARY表對應(yīng)用是不可見的,而不是應(yīng)用程序創(chuàng)建這個表。 TEMPORARY表結(jié)構(gòu)被存儲在另外一個名叫"sqlite_temp_master"的特定的表中。"sqlite_temp_master"表是臨 時表自身。

sqlite3的特殊命令

   大多數(shù)候,sqlite3讀入輸入行,并把它們傳遞到SQLite庫中去運行。但是如果輸入行以一個點(“.”)開始,那么這行將被sqlite3程序自 己截取并解釋。這些“點命令”通常被用來改變查詢輸出的格式,或者執(zhí)行鞭個預(yù)封包(預(yù)定義prepackaged)的查詢語句。

你可以在任何時候輸入“.help”,列出可用的點命令。例如

sqlite> .help

.bail ON|OFF            Stop after hitting an error.   Default OFF

.databases              List names and files of attached databases

.dump ?TABLE? ...       Dump the database in an SQL text format

.echo ON|OFF            Turn command echo on or off

.exit                   Exit this program

.explain ON|OFF         Turn output mode suitable for EXPLAIN on or off.

.header(s) ON|OFF       Turn display of headers on or off

.help                   Show this message

.import FILE TABLE      Import data from FILE into TABLE

.indices TABLE          Show names of all indices on TABLE

.load FILE ?ENTRY?      Load an extension library

.mode MODE ?TABLE?      Set output mode where MODE is one of:

                          csv       Comma-separated values

                          column    Left-aligned columns.   (See .width)

                          html      HTML <table> code

                          insert    SQL insert statements for TABLE

                          line      One value per line

                          list      Values delimited by .separator string

                          tabs      Tab-separated values

                          tcl       TCL list elements

.nullvalue STRING       Print STRING in place of NULL values

.output FILENAME        Send output to FILENAME

.output stdout          Send output to the screen

.prompt MAIN CONTINUE   Replace the standard prompts

.quit                   Exit this program

.read FILENAME          Execute SQL in FILENAME

.schema ?TABLE?         Show the CREATE statements

.separator STRING       Change separator used by output mode and .import

.show                   Show the current values for various settings

.tables ?PATTERN?       List names of tables matching a LIKE pattern

.timeout MS             Try opening locked tables for MS milliseconds

.width NUM NUM ...      Set column widths for "column" mode

sqlite>

改變輸出格式

    sqlite3程序可以以八種不同的格式顯示一個查詢的結(jié)果:"csv", "列", "html", "插入", "行", "制表"和"tcl"。你可以用".mode"點命令在這些輸出格式之間切換。

    默認的輸出格式是“列表”。在列表模式下,每條查詢結(jié)果記錄被寫在一行中并且每列之間以一個字符串分割符隔開。默認的分隔符是一個管道符號(“|”)。列表符號在當你輸出查詢結(jié)果到另外一個符加處理的程序(如AWK)中去是尤為有用。

sqlite> .mode list

sqlite> select * from tbl1;

hello|10

goodbye|20

sqlite>

    你可以用“.separator”點命令來改變分界符。例如,為了把分割符改為一個逗號和一個空格,你可以這樣做:

sqlite> .separator ", "

sqlite> select * from tbl1;

hello, 10

goodbye, 20

sqlite>

    在“l(fā)ine"模式下,每一個位于條記錄中的列在它自己那行顯示。每行由列名、一個等號和列數(shù)據(jù)組成。下一條記錄以一個空行隔開。這是一個行模式輸出的例子:

sqlite> .mode line

sqlite> select * from tbl1;

one = hello

two = 10

one = goodbye

two = 20

sqlite>

    在列模式下,每條記錄在一個單獨的行中以數(shù)據(jù)列對齊的方式顯示。列如:

sqlite> .mode column

sqlite> select * from tbl1;

one          two      

----------   ----------

hello        10       

goodbye      20       

sqlite>

        在默認的情況下,每列至少10個字符寬。太寬的數(shù)據(jù)將被截取。你可以用“.width”命令來調(diào)整列寬。如下所示:

sqlite> .width 12 6

sqlite> select * from tbl1;

one            two  

------------   ------

hello          10   

goodbye        20   

sqlite>

     上面例子中".width"命令設(shè)置第一列寬為12第二列寬為6。其它的列寬不變。你可以指定與你查詢結(jié)果需要的列數(shù)一樣多的“.width”參數(shù)。

    如果你指定一列寬為0,那么這個列寬將自動以下面三個數(shù)字中的最大值做為列寬:10、表頭寬度和最寬的數(shù)據(jù)列的寬度。這可以讓列自動調(diào)整寬度。每列的默認設(shè)置為自動調(diào)整的0值。

    出現(xiàn)在輸出開頭兩行的列標示可以用".header"點命令關(guān)閉。在上面的例子中,列標示是打開的。可以用下面的方法關(guān)閉列標示:

sqlite> .header off

sqlite> select * from tbl1;

hello          10   

goodbye        20   

sqlite>

    另外一個有用的輸出模式是"insert"。在插入模式下,被子格式化為看起來像SQL INSERT語句的樣式。你可以用插入模式來產(chǎn)生文件(便于)以后用于不同數(shù)據(jù)庫的輸入。

    當指定插入模式時,你必須給定一個特定參數(shù)就是要插入的表名。例如:

sqlite> .mode insert new_table

sqlite> select * from tbl1;

INSERT INTO 'new_table' VALUES('hello',10);

INSERT INTO 'new_table' VALUES('goodbye',20);

sqlite>

    最新的輸出格式是“html”。在這種模式下,sqlite3把查詢的結(jié)果寫做XHTML表。開始的<TABLE>和結(jié)束 的</TABLE>(標記)沒有寫出,但有<TR>、<TH>和<TD>等分界符。html輸出對 CGI來說是相當有用地。

把結(jié)果寫到文件中

    默認情況下,sqlte3把結(jié)送到標準輸出。你可以用“.output”命令改變它。只須把輸出文件名做為.output命令的輸出參數(shù)然后所有后續(xù)查詢結(jié)果將被寫到那個文件中。用“.output stdout”再一次改為標準輸出。例如:

sqlite> .mode list

sqlite> .separator |

sqlite> .output test_file_1.txt

sqlite> select * from tbl1;

sqlite> .exit

$ cat test_file_1.txt

hello|10

goodbye|20

$

查詢數(shù)據(jù)庫結(jié)構(gòu)

     sqlite3程序提供幾個有用的用于查詢數(shù)據(jù)庫結(jié)構(gòu)的快捷命令。這些不是不可以用別的方式來實現(xiàn)。這些命令僅僅是一個快捷方式而已。

    例如,為了查看數(shù)據(jù)庫的表列表,你可以敲入“.tables”。

sqlite> .tables

tbl1

tbl2

sqlite>

    “.tables”命令相似于設(shè)置列表模式然后執(zhí)行接下來的查詢:

SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'UNION ALL SELECT name FROM sqlite_temp_master WHERE type IN ('table','view') ORDER BY 1sqlite> .schema

create table tbl1(one varchar(10), two smallint)

CREATE TABLE tbl2 (

   f1 varchar(30) primary key,

   f2 text,

   f3 real

)

sqlite> .schema tbl2

CREATE TABLE tbl2 (

   f1 varchar(30) primary key,

   f2 text,

   f3 real

)

sqlite>

事實上,你可以查看sqlite3的源代碼(可以在源文件樹的src/shell.c中),你可找到上面的具體的查詢。

“.indices”命令作用類似的方 式是列出特定表的所有的索引?!?indics”命令須一個參數(shù)即所要索引表的表名。最后,但不是至少,是“.schema”命令。不帶任何參 數(shù),“.schema”命令顯示原始的用于創(chuàng)建當前數(shù)據(jù)庫的CREATE TABLE和CREATE INDEX語句。如果你給".schema"命令一個表名,它顯示原始的創(chuàng)建該表和它所有索引的CREATE語句。我們可以:

".schema"命令可以用設(shè)置列表然后執(zhí)行以下查詢來實現(xiàn):

SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master)WHERE type!='meta'ORDER BY tbl_name, type DESC, name

或者,如果你給".schema"命令一個參數(shù),由于你只想得到一個表的結(jié)構(gòu),查詢可以是這樣:

SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master)WHERE type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'ORDER BY substr(type,2,1), name

你可以擔供一個參數(shù)給.schema命令。如果這橛,查詢可以是這樣的:

SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master)WHERE tbl_name LIKE '%s' AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'ORDER BY substr(type,2,1), name

在查詢中“%S“為你的參數(shù)所取代。這使你可以詢數(shù)據(jù)庫結(jié)構(gòu)的某個子集。

sqlite> .schema %abc%

與這些一起,“.table”命令也接受一個模式作為他的參數(shù)。如果你給“.table”一個參數(shù),“%”將被前后擴展并且一個LIKE子句被附加到查詢上。這讓你可以列出只與特定模式相匹配的的表。

“.datebasae”命令顯示所有 當前連接打開的數(shù)據(jù)庫的一個列表。將允許一次到少兩個。第一個是“main”,最初打開的那個數(shù)據(jù)庫。第二個是"temp",用于臨時表的數(shù)據(jù)庫。對于用 ATTACH語句附加的數(shù)據(jù)也許有附加數(shù)據(jù)庫列表。輸出的第一列與之相聯(lián)的數(shù)據(jù)庫名,第二列是外部文件名。

sqlite> .databases

將整個數(shù)據(jù)庫轉(zhuǎn)換為ASCII文本文件

".dump"命令成一個單一的ASCII文本文件。這個文件可以被用作管道傳遞給sqlite3命令來轉(zhuǎn)換回數(shù)據(jù)庫。

一個最好的制作一個數(shù)據(jù)庫檔案拷貝的命令是:

$ echo '.dump' | sqlite3 ex1 | gzip -c >ex1.dump.gz

它產(chǎn)生一個一個名為ex1.dump.gz的文件,它包含了你以后或在其它機器上重構(gòu)數(shù)據(jù)庫的所有的信息。要重構(gòu)數(shù)據(jù)庫,只須敲入:

$ zcat ex1.dump.gz | sqlite3 ex2

這個文本格式是純粹的SQL語句所以你可以用.dump命令來導出一個SQLite數(shù)據(jù)庫到另一個常用的SQL數(shù)據(jù)庫引擎。比如:

$ createdb ex2

$ sqlite3 ex1 .dump | psql ex2

其它的點命令

".explain"命令可以被用來設(shè) 置輸出格式為“column” 并設(shè)置列寬為EXPLAIN命令看起來比較合理的寬度。EXPLAIN命令是SQLite特有的SQL擴展,它是對調(diào)試有用。如果任何常規(guī)的SQL被 EXPLAIN執(zhí)行,那么SQL命令被分解并分析但并不執(zhí)行。取而代之的是,虛擬機指令序列將被用于執(zhí)行SQL命令并返回一個類似的查詢結(jié)果。如:

sqlite> .explain

sqlite> explain delete from tbl1 where two<20;

addr   opcode         p1      p2      p3         

----   ------------   -----   -----   -------------------------------------  

0      ListOpen       0       0                 

1      Open           0       1       tbl1       

2      Next           0       9                 

3      Field          0       1                 

4      Integer        20      0                 

5      Ge             0       2                 

6      Key            0       0                 

7      ListWrite      0       0                 

8      Goto           0       2                 

9      Noop           0       0                 

10     ListRewind     0       0                 

11     ListRead       0       14                

12     Delete         0       0                 

13     Goto           0       11                

14     ListClose      0       0

“.timeout”命令設(shè)置sqlite3等待一個試圖存儲文件鎖定請除直到錯誤返回的總時間。默認的超時值是0因此如果任何需要的數(shù)據(jù)庫表或序列列被鎖定時它將立即返回一個錯誤。

最后,我們提到“.exit”命令它交導致sqlite3退出。

在命令和腳本中使用sqlite3

一個在腳本命令中使用 sqlite3的方式是用“echo”或“cat”來產(chǎn)生一個命令序列在一個文件中,然后當從一個產(chǎn)生的命令行中重定向輸入時調(diào)用sqlite3。它有用 并且適應(yīng)許多環(huán)境。但作為一附加的便利是,sqlite3允許一個單一的SQL語句在命令行中作為數(shù)據(jù)庫名后的第二個參數(shù)輸入。當sqlite3程序帶著 兩個參數(shù)啟動時,第二個參數(shù)被傳遞給SQLite庫處理,查詢以列表模式打印到標準輸出,然后程序退出。這個機制被設(shè)計用于讓sqlite3容易于用于連 接諸如"AWK"的程序。例如:

$ sqlite3 ex1 'select * from tbl1' |

> awk '{printf "<tr><td>%s<td>%s/n",$1,$2 }'

<tr><td>hello<td>10

<tr><td>goodbye<td>20

$

結(jié)束命令行命令

SQLite命令通常以一個分 號結(jié)束。在一個命令行中你也可以用“GO”單詞(大小寫敏感)或者一個“/”斜線在它所在好行結(jié)束一個命令。這常被SQL Server和Oracle使用。這些將不在sqlite3_exec()中有用,因為命令行在傳遞它們到函數(shù)之前把這些翻譯為分號。

從源文件中編譯sqlite3

sqlite3程序當你編譯SQLite庫時自動被建立。只須取得一個源文件樹的拷貝,運行“configure"然后"make"即可。

 

C/C++下SQLite編程

參考文件:A introduction to the sqlite c/c++ interface

找到安裝SQLite的路徑:

我們的sqlite3的庫文件目錄是:/usr/local/sqlite3/lib  //我的機子安裝目錄文件名是sqlite-3.3.6
可執(zhí)行文件 sqlite3 的目錄是: /usr/local/sqlite3/bin 
頭文件 sqlite3.h 的目錄是: /usr/local/sqlite3/include

編譯指南:現(xiàn)在編譯:[root@localhost dada]# gcc c3.c -o c3

opendbsqlite.c:11:21: sqlite3.h: 沒有那個文件或目錄
opendbsqlite.c: In function `main': 
opendbsqlite.c:19: `sqlite3' undeclared (first use in this function)  
//  這是由于沒有找到頭文件的原因

/tmp/ccTkItnN.o(.text+0x2b): In function `main': 
: undefined reference to `sqlite3_open' 
/tmp/ccTkItnN.o(.text+0x45): In function `main':          
    //  這是個沒有找到庫文件的問題。

可以在gcc語句后面加上如下

-lsqlite3  -L/usr/local/sqlite3/lib  -I/usr/local/sqlite3/include

指明用到的庫文件;為庫文件指定路徑;為頭文件指定路徑

繼續(xù)編譯:

出現(xiàn) "error while loading shared libraries" 等錯誤

我們可以這樣解決: 
方法一:靜態(tài)編譯 
在編譯時加上 -static 參數(shù),例如

[root@localhost temp]# gcc c3.c -o c3 -lsqlite3 -L/usr/local/sqlite3/lib -I/usr/local/sqlite3/include –static

靜態(tài)編譯后的文件相對動態(tài)編譯更大,很容易理解,靜態(tài)編譯把頭庫文件作為程序的一部分都包含進來了。

方法二:重新配置系統(tǒng)環(huán)境變量 LD_LIBRARY_PATH 
這時需要指定 libsqlite3.so.0 庫文件的路徑,也就是配置系統(tǒng)環(huán)境變量 LD_LIBRARY_PATH , 
使系統(tǒng)能夠找到 libsqlite3.so.0 。

好了,現(xiàn)在我們來指定系統(tǒng)環(huán)境變量 LD_LIBRARY_PATH 的值 
在shell下輸入: 
[root@localhost temp]# export LD_LIBRARY_PATH=/usr/local/sqlite3/lib:$LD_LIBRARY_PATH
看看現(xiàn)在系統(tǒng)環(huán)境設(shè)置: 
[root@localhost temp]#env

….

LD_LIBRARY_PATH=/usr/local/sqlite3/lib:

….. (看到了吧,LD_LIBRARY_PATH這一行開始就是sqlite3的庫文件路徑:)
去掉 -static ,再編譯: 
[root@localhost temp]# gcc c3.c -o c3 -lsqlite3 -L/usr/local/sqlite3/lib -I/usr/local/sqlite3/include

我們推薦使用動態(tài)編譯的方法。 
至此編譯就不會有什么問題了,另外一點:如果在程序中把#include <sqlite3.h>寫成#include<usr/local/sqlite-3.3.6/include /sqlite3.h>,這樣在編譯的時候就不需要-I/usr/local/sqlite3/include了。

 

常用函數(shù)

int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);
int sqlite3_close(sqlite3 *);
int sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void *,  char **errmsg );
這就是執(zhí)行一條 sql 語句的函數(shù)。
第1個參數(shù)不再說了,是前面open函數(shù)得到的指針。說了是關(guān)鍵數(shù)據(jù)結(jié)構(gòu)。
第2個參數(shù)const char *sql 是一條 sql 語句,以/0結(jié)尾。
第3個參數(shù)sqlite3_callback 是回調(diào),當這條語句執(zhí)行之后,sqlite3會去調(diào)用你提供的這個函數(shù)。
第4個參數(shù)void * 是你所提供的指針,你可以傳遞任何一個指針參數(shù)到這里,這個參數(shù)最終會傳到回調(diào)函數(shù)里面,這個指針比較重要,可以用來作參數(shù)的傳遞。如果不需要傳遞指針給回調(diào)函數(shù),可以填NULL。等下我們再看回調(diào)函數(shù)的寫法,以及這個參數(shù)的使用。
第5 個參數(shù)char ** errmsg 是錯誤信息。注意是指針的指針。sqlite3里面有很多固定的錯誤信息。執(zhí)行 sqlite3_exec 之后,執(zhí)行失敗時可以查閱這個指針(直接 printf(“%s/n”,errmsg))得到一串字符串信息,這串信息告訴你錯在什么地方。sqlite3_exec函數(shù)通過修改你傳入的指針的指針,把你提供的指針指向錯誤提示信息,這樣sqlite3_exec函數(shù)外面就可以通過這個 char*得到具體錯誤提示。
說明:通常, sqlite3_callback 和它后面的 void * 這兩個位置都可以填 NULL。填NULL表示你不需要回調(diào)。比如你做 insert 操作,做 delete 操作,就沒有必要使用回調(diào)。而當你做 select 時,就要使用回調(diào),因為 sqlite3 把數(shù)據(jù)查出來,得通過回調(diào)告訴你查出了什么數(shù)據(jù)。用select時也可以用sqlite3_get_table

查詢:

int sqlite3_get_table(
  sqlite3 *db,          /* An open database */
  const char *zSql,     /* SQL to be evaluated */
  char ***pazResult,    /* Results of the query */
  int *pnRow,           /* Number of result rows written here */
  int *pnColumn,        /* Number of result columns written here */
  char **pzErrmsg       /* Error msg written here */
);
void sqlite3_free_table(char **result);   //釋放內(nèi)存空間


 

一.使用流程

要使用sqlite,需要從sqlite官網(wǎng)下載到三個文件,分別為sqlite3.lib,sqlite3.dll,sqlite3.h,然后再在自己的工程中配置好頭文件和庫文件,同時將dll文件放到當前目錄下,就完成配置可以使用sqlite了。

使用的過程根據(jù)使用的函數(shù)大致分為如下幾個過程:

  • sqlite3_open()
  • sqlite3_prepare()
  • sqlite3_step()
  • sqlite3_column()
  • sqlite3_finalize()
  • sqlite3_close()

這幾個過程是概念上的說法,而不完全是程序運行的過程,如sqlite3_column()表示的是對查詢獲得一行里面的數(shù)據(jù)的列的各個操作統(tǒng)稱,實際上在sqlite中并不存在這個函數(shù)。

1.  sqlite3_open():打開數(shù)據(jù)庫

在操作數(shù)據(jù)庫之前,首先要打開數(shù)據(jù)庫。這個函數(shù)打開一個sqlite數(shù)據(jù)庫文件的連接并且返回一個數(shù)據(jù)庫連接對象。這個操作同時程序中的第一個調(diào)用 的sqlite函數(shù),同時也是其他sqlite api的先決條件。許多的sqlite接口函數(shù)都需要一個數(shù)據(jù)庫連接對象的指針作為它們的第一個參數(shù)。

函數(shù)定義

int sqlite3_open(

  const char *filename,   /* Database filename (UTF-8) */

  sqlite3 **ppDb          /* OUT: SQLite db handle */

);

int sqlite3_open16(

  const void *filename,   /* Database filename (UTF-16) */

  sqlite3 **ppDb          /* OUT: SQLite db handle */

);

int sqlite3_open_v2(

  const char *filename,   /* Database filename (UTF-8) */

  sqlite3 **ppDb,         /* OUT: SQLite db handle */

  int flags,              /* Flags */

  const char *zVfs        /* Name of VFS module to use */

);

 

說明:

假如這個要被打開的數(shù)據(jù)文件不存在,則一個同名的數(shù)據(jù)庫文件將被創(chuàng)建。如果使用sqlite3_open和sqlite3_open_v2的話,數(shù)據(jù)庫將采用UTF-8的編碼方式,sqlite3_open16采用UTF-16的編碼方式

返回值:

如果sqlite數(shù)據(jù)庫被成功打開(或創(chuàng)建),將會返回SQLITE_OK,否則將會返回錯誤碼。Sqlite3_errmsg()或者sqlite3_errmsg16可以用于獲得數(shù)據(jù)庫打開錯誤碼的英文描述,這兩個函數(shù)定義為:

const char *sqlite3_errmsg(sqlite3*);

const void *sqlite3_errmsg16(sqlite3*);

        

參數(shù)說明:

filename:需要被打開的數(shù)據(jù)庫文件的文件名,在sqlite3_open和sqlite3_open_v2中這個參數(shù)采用UTF-8編碼,而在sqlite3_open16中則采用UTF-16編碼

ppDb:一個數(shù)據(jù)庫連接句柄被返回到這個參數(shù),即使發(fā)生錯誤。唯一的一場是如果sqlite不能分配內(nèi)存來存放sqlite對象,ppDb將會被返回一個NULL值。

flags:作為數(shù)據(jù)庫連接的額外控制的參數(shù),可以是SQLITE_OPEN_READONLY,SQLITE_OPEN_READWRITE和 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE中的一個,用于控制數(shù)據(jù)庫的打開方式,可以和SQLITE_OPEN_NOMUTEXSQLITE_OPEN_FULLMUTEX, SQLITE_OPEN_SHAREDCACHE,以及SQLITE_OPEN_PRIVATECACHE結(jié)合使用,具體的詳細情況可以查閱文檔

 

 

 

 

2.  Sqlite3_prepare()

這個函數(shù)將sql文本轉(zhuǎn)換成一個準備語句(prepared statement)對象,同時返回這個對象的指針。這個接口需要一個數(shù)據(jù)庫連接指針以及一個要準備的包含SQL語句的文本。它實際上并不執(zhí)行(evaluate)這個SQL語句,它僅僅為執(zhí)行準備這個sql語句

函數(shù)定義(僅列出UTF-8的)

int sqlite3_prepare(

  sqlite3 *db,            /* Database handle */

  const char *zSql,       /* SQL statement, UTF-8 encoded */

  int nByte,              /* Maximum length of zSql in bytes. */

  sqlite3_stmt **ppStmt,  /* OUT: Statement handle */

  const char **pzTail     /* OUT: Pointer to unused portion of zSql */

);

int sqlite3_prepare_v2(

  sqlite3 *db,            /* Database handle */

  const char *zSql,       /* SQL statement, UTF-8 encoded */

  int nByte,              /* Maximum length of zSql in bytes. */

  sqlite3_stmt **ppStmt,  /* OUT: Statement handle */

  const char **pzTail     /* OUT: Pointer to unused portion of zSql */

);

 

參數(shù):

db:數(shù)據(jù)指針

zSql:sql語句,使用UTF-8編碼

nByte:如果nByte小于0,則函數(shù)取出zSql中從開始到第一個0終止符的內(nèi)容;如果nByte不是負的,那么它就是這個函數(shù)能從zSql中讀取的字節(jié)數(shù)的最大值。如果nBytes非負,zSql在第一次遇見’/000/或’u000’的時候終止

pzTail:上面提到zSql在遇見終止符或者是達到設(shè)定的nByte之后結(jié)束,假如zSql還有剩余的內(nèi)容,那么這些剩余的內(nèi)容被存放到pZTail中,不包括終止符

ppStmt:能夠使用sqlite3_step()執(zhí)行的編譯好的準備語句的指針,如果錯誤發(fā)生,它被置為NULL,如假如輸入的文本不包括sql語句。調(diào)用過程必須負責在編譯好的sql語句完成使用后使用sqlite3_finalize()刪除它。

 

說明

如果執(zhí)行成功,則返回SQLITE_OK,否則返回一個錯誤碼。推薦在現(xiàn)在任何的程序中都使用sqlite3_prepare_v2這個函數(shù),sqlite3_prepare只是用于前向兼容

 

備注

<1>準備語句(prepared statement)對象

typedef struct sqlite3_stmt sqlite3_stmt;

        

準備語句(prepared statement)對象一個代表一個簡單SQL語句對象的實例,這個對象通常被稱為“準備語句”或者“編譯好的SQL語句”或者就直接稱為“語句”。

         語句對象的生命周期經(jīng)歷這樣的過程:

l  使用sqlite3_prepare_v2或相關(guān)的函數(shù)創(chuàng)建這個對象

l  使用sqlite3_bind_*()給宿主參數(shù)(host parameters)綁定值

l  通過調(diào)用sqlite3_step一次或多次來執(zhí)行這個sql

l  使用sqlite3——reset()重置這個語句,然后回到第2步,這個過程做0次或多次

l  使用sqlite3_finalize()銷毀這個對象

 

在sqlite中并沒有定義sqlite3_stmt這個結(jié)構(gòu)的具體內(nèi)容,它只是一個抽象類型,在使用過程中一般以它的指針進行操作,而sqlite3_stmt類型的指針在實際上是一個指向Vdbe的結(jié)構(gòu)體得指針

<2>宿主參數(shù)(host parameters)

在傳給sqlite3_prepare_v2()的sql的語句文本或者它的變量中,滿足如下模板的文字將被替換成一個參數(shù):

l  ?

l  ?NNN,NNN代表數(shù)字

l  :VVV,VVV代表字符

l  @VVV

l  $VVV

在上面這些模板中,NNN代表一個數(shù)字,VVV代表一個字母數(shù)字標記符(例如:222表示名稱為222的標記符),sql語句中的參數(shù)(變量)通過上面的幾個模板來指定,如

“select ? from ? “這個語句中指定了兩個參數(shù),sqlite語句中的第一個參數(shù)的索引值是1,這就知道這個語句中的兩個參數(shù)的索引分別為1和2,使用”?”的話會被自動給 予索引值,而使用”?NNN”則可以自己指定參數(shù)的索引值,它表示這個參數(shù)的索引值為NNN?!?VVV”表示一個名為”VVV”的參數(shù),它也有一個索引 值,被自動指定。

可以使用sqlite3_bind_*()來給這些參數(shù)綁定值

 

 

 

3.  sqlite3_setp()

這個過程用于執(zhí)行有前面sqlite3_prepare創(chuàng)建的準備語句。這個語句執(zhí)行到結(jié)果的第一行可用的位置。繼續(xù)前進到結(jié)果的第二行的話,只需 再次調(diào)用sqlite3_setp()。繼續(xù)調(diào)用sqlite3_setp()知道這個語句完成,那些不返回結(jié)果的語句 (如:INSERT,UPDATE,或DELETE),sqlite3_step()只執(zhí)行一次就返回

函數(shù)定義

int sqlite3_step(sqlite3_stmt*);

返回值

函數(shù)的返回值基于創(chuàng)建sqlite3_stmt參數(shù)所使用的函數(shù),假如是使用老版本的接口sqlite3_prepare()和 sqlite3_prepare16(),返回值會 是 SQLITE_BUSY, SQLITE_DONE, SQLITE_ROW, SQLITE_ERROR 或 SQLITE_MISUSE,而v2版本的接口sqlite3_prepare_v2()和sqlite3_prepare16_v2()則會同時返 回這些結(jié)果碼和擴展結(jié)果碼。

對所有V3.6.23.1以及其前面的所有版本,需要在sqlite3_step()之后調(diào)用sqlite3_reset(),在后續(xù)的 sqlite3_ step之前。如果調(diào)用sqlite3_reset重置準備語句失敗,將會導致sqlite3_ step返回SQLITE_MISUSE,但是在V3. 6.23.1以后,sqlite3_step()將會自動調(diào)用sqlite3_reset。

int sqlite3_reset(sqlite3_stmt *pStmt);

sqlite3_reset用于重置一個準備語句對象到它的初始狀態(tài),然后準備被重新執(zhí)行。所有sql語句變量使用sqlite3_bind*綁定 值,使用sqlite3_clear_bindings重設(shè)這些綁定。Sqlite3_reset接口重置準備語句到它代碼開始的時候。sqlite3_reset并不改變在準備語句上的任何綁定值,那么這里猜測,可能是語句在被執(zhí)行的過程中發(fā)生了其他的改變,然后這個語句將它重置到綁定值的時候的那個狀態(tài)。

 

4.  sqlite3_column()

這個過程從執(zhí)行sqlite3_step()執(zhí)行一個準備語句得到的結(jié)果集的當前行中返回一個列。每次sqlite3_step得到一個結(jié)果集的列停下后,這個過程就可以被多次調(diào)用去查詢這個行的各列的值。對列操作是有多個函數(shù),均以sqlite3_column為前綴

const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);

int sqlite3_column_bytes(sqlite3_stmt*, int iCol);

int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);

double sqlite3_column_double(sqlite3_stmt*, int iCol);

int sqlite3_column_int(sqlite3_stmt*, int iCol);

sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);

const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);

const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);

int sqlite3_column_type(sqlite3_stmt*, int iCol);

sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);

說明

第一個參數(shù)為從sqlite3_prepare返回來的prepared statement對象的指針,第二參數(shù)指定這一行中的想要被返回的列的索引。最左邊的一列的索引號是0,行的列數(shù)可以使用sqlite3_colum_count()獲得。

這些過程會根據(jù)情況去轉(zhuǎn)換數(shù)值的類型,sqlite內(nèi)部使用sqlite3_snprintf()去自動進行這個轉(zhuǎn)換,下面是關(guān)于轉(zhuǎn)換的細節(jié)表:

內(nèi)部類型

請求的類型

轉(zhuǎn)換

NULL

INTEGER

結(jié)果是0

NULL

FLOAT

結(jié)果是0.0

NULL

TEXT

結(jié)果是NULL

NULL

BLOB

結(jié)果是NULL

INTEGER

FLOAT

從整形轉(zhuǎn)換到浮點型

INTEGER

TEXT

整形的ASCII碼顯示

INTEGER

BLOB

同上

FLOAT

INTEGER

浮點型轉(zhuǎn)換到整形

FLOAT

TEXT

浮點型的ASCII顯示

FLOAT

BLOB

同上

TEXT

INTEGER

使用atoi()

TEXT

FLOAT

使用atof()

TEXT

BLOB

沒有轉(zhuǎn)換

BLOB

INTEGER

先到TEXT,然后使用atoi

BLOB

FLOAT

先到TEXT,然后使用atof

BLOB

TEXT

如果需要的話添加0終止符

 

注:BLOB數(shù)據(jù)類型是指二進制的數(shù)據(jù)塊,比如要在數(shù)據(jù)庫中存放一張圖片,這張圖片就會以二進制形式存放,在sqlite中對應(yīng)的數(shù)據(jù)類型就是BLOB

 

int sqlite3_column_bytes(sqlite3_stmt*, int iCol)int sqlite3_column_bytes16(sqlite3_stmt*, int iCol)兩個函數(shù)返回對應(yīng)列的內(nèi)容的字節(jié)數(shù),這個字節(jié)數(shù)不包括后面類型轉(zhuǎn)換過程中加上的0終止符。

下面是幾個最安全和最簡單的使用策略

  • 先sqlite3_column_text() ,然后 sqlite3_column_bytes()
  • 先sqlite3_column_blob(),然后sqlite3_column_bytes()
  • 先sqlite3_column_text16(),然后sqlite3_column_bytes16()

 

 

5.  sqlite3_finalize

    int sqlite3_finalize(sqlite3_stmt *pStmt);

這個過程銷毀前面被sqlite3_prepare創(chuàng)建的準備語句,每個準備語句都必須使用這個函數(shù)去銷毀以防止內(nèi)存泄露。

在空指針上調(diào)用這個函數(shù)沒有什么影響,同時可以準備語句的生命周期的任一時刻調(diào)用這個函數(shù):在語句被執(zhí)行前,一次或多次調(diào)用sqlite_reset之后,或者在sqlite3_step任何調(diào)用之后不管語句是否完成執(zhí)行

 

6.  sqlite3_close

這個過程關(guān)閉前面使用sqlite3_open打開的數(shù)據(jù)庫連接,任何與這個連接相關(guān)的準備語句必須在調(diào)用這個關(guān)閉函數(shù)之前被釋放

 

 

二.使用舉例

 

#include "stdafx.h"
#include "sqlite3.h"
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
    int i;
    for(i=0; i<argc; i++){
       printf("%s = %s/n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    printf("/n");
    return 0;
}
#define CHECK_RC(rc,szInfo,szErrMsg,db) if(rc!=SQLITE_OK) /
           {printf("%s error!/n",szInfo);/
           printf("%s/n",szErrMsg);    /
           sqlite3_free(szErrMsg);         /
           sqlite3_close(db);              /
           return 0;}
int _tmain(int argc, _TCHAR* argv[])
{
  
    sqlite3 *db;
    char *dbPath="f:/test.db";
    char *szErrMsg = 0;
  
    int rc= sqlite3_open(dbPath, &db);
    CHECK_RC(rc,"open database",db);
    char *szSql="create table UserInfo(ID int primary key , UserName char, PassWord char);";
    rc=sqlite3_exec(db,szSql,0,0,&szErrMsg);
    CHECK_RC(rc,"create table",szErrMsg,db);
    rc=sqlite3_exec(db,"insert into UserInfo(ID,UserName,PassWord) values(1,'kfqcome','123456')",0,0,&szErrMsg);
    CHECK_RC(rc,"insert info",szErrMsg,db);
    rc=sqlite3_exec(db,"insert into UserInfo(ID,UserName,PassWord) values(2,'miss wang','654321')",0,0,&szErrMsg);
    CHECK_RC(rc,"insert info",szErrMsg,db);
    szSql="select * from UserInfo";
    rc = sqlite3_exec(db,szSql, callback, 0, &szErrMsg);
    CHECK_RC(rc,"query values",szErrMsg,db);
    sqlite3_close(db);
    getchar();
    return 0;
}

  輸出的結(jié)果:

ID = 1

UserName = kfqcome

PassWord = 123456

 

ID = 2

UserName = miss wang

PassWord = 654321

 

這里執(zhí)行sql語句用的是sqlite3_exec,它是前面幾個函數(shù)的封裝

 

int sqlite3_exec(

  sqlite3*,                                  /* An open database */

  const char *sql,                           /* SQL to be evaluated */

  int (*callback)(void*,int,char**,char**),  /* Callback function */

  void *,                                    /* 1st argument to callback */

  char **errmsg                              /* Error msg written here */

);

sqlite3_exec是sqlite3_prepare_v2,sqlite3_step()和sqlite3_finalize()的封裝,能讓程序多次執(zhí)行sql語句而不要寫許多重復(fù)的代碼。

Sqlite3_exec接口執(zhí)行0或多個UTF-8編碼的,分號分割的sql語句,傳到第二個參數(shù)中。如果sqlite3_exec的第三個參數(shù) 回調(diào)函數(shù)指針不為空,那么它會為每個來自執(zhí)行的SQL語句的結(jié)果行調(diào)用(也就是說回調(diào)函數(shù)會調(diào)用多次,上面例子中會返回2個結(jié)果行,因而會被執(zhí)行2次), 第4個參數(shù)是傳給回調(diào)函數(shù)的第一個參數(shù),如果回調(diào)函數(shù)指針為空,那么回調(diào)不會發(fā)生同時結(jié)果行被忽略。

如果在執(zhí)行sql語句中有錯誤發(fā)生,那么當前的語句的執(zhí)行被停止,后續(xù)的語句也被跳過。第五個參數(shù)不為空的時候,它被分配內(nèi)存并寫入了錯誤信息,所以在sqlite3_exec后面需要調(diào)用sqlite3_free去釋放這個對象以防止內(nèi)存泄露

 

回調(diào)函數(shù):

int (*callback)(void*,int,char**,char**),  /* Callback function */

         第一個參數(shù)通過sqlite3_exec的第第四個參數(shù)傳入的

         第二個參數(shù)是結(jié)果行的列數(shù)

         第三個參數(shù)是行中列數(shù)據(jù)的指針

         第四個參數(shù)是行中列名稱的指針

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产av熟女一区二区三区蜜桃| 夫妻性生活一级黄色录像| 日韩女优视频国产一区| 日韩蜜桃一区二区三区| 一区二区在线激情视频| 国产又粗又黄又爽又硬的| 亚洲性日韩精品一区二区| 亚洲性生活一区二区三区| 久七久精品视频黄色的| 99国产成人免费一区二区| 九九热最新视频免费观看| 日本高清中文精品在线不卡| 亚洲熟女一区二区三四区| 亚洲日本中文字幕视频在线观看| 国产不卡一区二区四区| 精品人妻一区二区三区在线看| 人妻内射精品一区二区| 手机在线观看亚洲中文字幕| 国产亚洲不卡一区二区| 白丝美女被插入视频在线观看| av免费视屏在线观看| 午夜国产福利在线播放| 久久99青青精品免费观看| 日本成人三级在线播放| 亚洲中文字幕在线观看黑人| 91人人妻人人爽人人狠狠| 视频一区中文字幕日韩| 国产性色精品福利在线观看| 日韩一区二区三区观看| 国产精品午夜小视频观看| 国产精品一区欧美二区| 国产原创激情一区二区三区| 国产精品午夜视频免费观看| 亚洲综合精品天堂夜夜| 免费在线播放不卡视频| 国产精品免费视频视频| 亚洲国产丝袜一区二区三区四 | 午夜福利视频日本一区| 风韵人妻丰满熟妇老熟女av| 久久国产人妻一区二区免费| 亚洲伊人久久精品国产|