sqlite3API函數


回顧:
DDL
表的創建、修改、刪除
create table 表名(字段名 字段類型 [約束],...);
alter table 表名 {rename to 新名字 | add column 字段 字段類型};
drop table 表名 ;
DML
記錄的增、刪、改、查
insert into 表名(字段名,...)values(字段值,...);
insert into 表名 values(字段值,...);

delete from 表名 [where 條件];

update 表名 set 字段=新值 [where 條件];

select * from 表名 [where 條件];

------------------------------------------
sqlite3接口函數

sqlite3 數據庫連接對象
sqlite3_stmt 編譯后的SQL語句對象
sqlite3_open() 打開或創建一個數據庫連接
sqlite3_prepare() 准備SQL語句
sqlite3_bind() 綁定參數
sqlite3_step() 執行准備好的SQL語句
sqlite3_column() 從sqlite3_stmt中取字段值
sqlite3_finalize() 用來釋放sqlite3_stmt
sqlite3_close() 關閉數據庫
sqlite3_exec() 執行SQL語句

------------------------------------
sqlite3
sqlite3_open
sqlite3_exec
sqlite3_close
sprintf()
-------------
數據庫的操作流程:
1.連接數據庫
sqlite3 *db;
2.打開數據庫
int sqlite3_open(
const char *filename, /* 數據庫名(字符串類型) */
sqlite3 **ppDb /* sqlite3結構二級指針,數據庫連接對象 */
);
返回值:成功返回 SQLITE_OK,並且ppDb指向新的數據庫連接
其它值表示失敗

例:
int res = sqlite3_open("test.db",&db);
if(res != SQLITE_OK)
{
printf("open db err:%s\n",sqlite3_errmsg(db));
sqlite3_close(db);
return -1;
}
3.操作
int sqlite3_exec(
sqlite3*, 打開的數據庫
const char *sql, 要執行的SQL語句(字符串)
int (*callback)(void*,int,char**,char**), 回調函數
void *, 做為回調函數的第一個參數
char **errmsg 錯誤信息寫在這里
)
SQL語句的執行分為兩類:
a.沒有返回結果的情況,那么就不需要回調函數,給NULL即可
如:create insert update delete...
b.有結果集返回的情況,那么就需要通過回調函數去獲取結果集
每查到一條記錄調用一次回調函數
如:select

int (*callback)(void* arg,傳給回調函數的參數
int column_count,記錄的字段(例)個數
char**column_value,字段值(就是個一維數組)
char**column_name)字段名(一維數組)
例:
char* column_name[3] = {"abc","123","hello"};


4.關閉數據庫
int sqlite3_close(sqlite3*);

id name age addr

1000 白起 20 CHINA
1001 李牧 21 CHINA
1002 王箭 21 CHINA
1003 廉頗 25 CHINA

gcc sqlite3_exec_select.c
-I /usr/local/sqlite3/PC/include/ 指明頭文件所在目錄
-L /usr/local/sqlite3/PC/lib/ 指明庫所在目錄
-lsqlite3 所用的庫的名字


------------------------------------------------------------------------
sqlite3 數據庫連接對象
sqlite3_stmt 編譯后的SQL語句對象
sqlite3_open() 打開或創建一個數據庫連接
sqlite3_prepare() 准備SQL語句
sqlite3_bind() 綁定參數
sqlite3_step() 執行准備好的SQL語句
sqlite3_column() 從sqlite3_stmt中取字段值
sqlite3_finalize() 用來釋放sqlite3_stmt
sqlite3_close()

1.打開數據庫,建立連接
2.准備SQL語句
(如果SQL語句有可變的參數,那就要綁定值)
int sqlite3_prepare_v2(
sqlite3 *db, /* 數據庫連接對象 */
const char *zSql, /* 要執行的SQL語句 */
int nByte, /* SQL語句的長度 */ 可以為負數(-1),自動計算長度
sqlite3_stmt **ppStmt, /* 准備好的SQL語句 */
const char **pzTail /* 指向未執行的SQL語句*/
);
char *zSql = "create table....;intser into...";
char *pzTail = "intser into...";

3.執行
(如果是查詢語句,那就需要獲取結果集)
int sqlite3_step(sqlite3_stmt*);
執行成功返回SQLITE_DONE
如果有數據返回時,執行成功返回SQLITE_ROW

4.釋放sqlite3_stmt對象
int sqlite3_finalize(sqlite3_stmt *pStmt);
5.關閉

-----------------
int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
int sqlite3_bind_double(sqlite3_stmt*, int, double);
int sqlite3_bind_int(sqlite3_stmt*, int, int);
int sqlite3_bind_null(sqlite3_stmt*, int);
int sqlite3_bind_text(sqlite3_stmt*,int,const char*,int,void(*)(void*));

第一、二個參數和返回值都是相同的:
第一個參數:解析后的語句對象
第二個參數:是要綁定的參數的索引號,從索引值1開始
第三個參數:要給參數綁定的值
第四個參數(如果有):代表第三個參數的綁定值的長度
第五個參數(如果有):是一個指向內存管理的回調函數的指針,一般給0
回調函數:void callback(void*);

練習:
用sqlite3_bind_blob,往數據庫里存取圖片

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

double sqlite3_column_double(sqlite3_stmt*, int iCol);
int sqlite3_column_int(sqlite3_stmt*, int iCol);
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
int sqlite3_column_count(sqlite3_stmt *pStmt);

int sqlite3_column_type(sqlite3_stmt*, int iCol);
返回五個存儲類型對應的整數值:
SQLITE_INTEGER 1
SQLITE_FLOAT 2
SQLITE_TEXT 3
SQLITE_BLOB 4
SQLITE_NULL 5

 

/*************************************************************************
> File Name: sqlite3_exec.c
> Author: csgec
> Mail: longer.zhou@gmail.com
> Created Time: Thu 25 Aug 2016 10:07:00 AM CST
************************************************************************/

#include<stdio.h>
#include<sqlite3.h>

int main()
{
//1.打開數據庫,並建立數據庫連接
sqlite3 *db;
int res = sqlite3_open("test.db",&db);
if(res != SQLITE_OK)
{
fprintf(stderr,"open err:%s\n",sqlite3_errmsg(db));
sqlite3_close(db);
return -1;
}
printf("打開數據庫test.db成功~~\n");

//2.操作數據庫,建表,增 刪 改 查等操作
char *createSql = "create table if not exists stud(id integer primary key,name text not null,age integer check(age>6),addr text default 'CHINA')";
char *errmsg = NULL;
res = sqlite3_exec(db,createSql,NULL,NULL,&errmsg);
if(res != SQLITE_OK)
{
fprintf(stderr, "SQL error: %s\n", errmsg);
sqlite3_free(errmsg);
}
printf("建表 stud 成功~\n");

//3.關閉數據庫
sqlite3_close(db);
return 0;
}

 

/*************************************************************************
> File Name: sqlite3_exec_select.c
> Author: csgec
> Mail: longer.zhou@gmail.com
> Created Time: Thu 25 Aug 2016 10:07:00 AM CST
************************************************************************/

#include<stdio.h>
#include<sqlite3.h>


int callback(void*arg,int column_count,char **column_value,char** column_name)
{
printf("字段數:%d\n",column_count);
int i;
for(i = 0; i < column_count; i++)
{
printf("字段名:%s\t",column_name[i]);
}
printf("\n");

for(i = 0; i < column_count; i++)
{
printf("%s\t",column_value[i]);
}
printf("\n");

return 0;
}
int main()
{
//1.打開數據庫,並建立數據庫連接
sqlite3 *db;
int res = sqlite3_open("test.db",&db);
if(res != SQLITE_OK)
{
fprintf(stderr,"open err:%s\n",sqlite3_errmsg(db));
sqlite3_close(db);
return -1;
}
printf("打開數據庫test.db成功~~\n");

//2.操作數據庫,建表,增 刪 改 查等操作
// char *createSql = "create table if not exists stud(id integer primary key,name text not null,age integer check(age>6),addr text default 'CHINA')";

char *selectSql = "select * from stud";
char *errmsg = NULL;
res = sqlite3_exec(db,selectSql,callback,NULL,&errmsg);
if(res != SQLITE_OK)
{
fprintf(stderr, "SQL error: %s\n", errmsg);
sqlite3_free(errmsg);
}
printf("建表 stud 成功~\n");

//3.關閉數據庫
sqlite3_close(db);
return 0;
}

 

/*************************************************************************
> File Name: sqlite3_prepare.c
> Author: csgec
> Mail: longer.zhou@gmail.com
> Created Time: Thu 25 Aug 2016 02:23:03 PM CST
************************************************************************/

#include<stdio.h>
#include<sqlite3.h>
#include<string.h>
int main()
{
sqlite3 *db;
sqlite3_stmt *stmt;
//1
int res = sqlite3_open("test.db",&db);
if(res != SQLITE_OK)
{
fprintf(stderr,"open error %s\n",sqlite3_errmsg(db));
sqlite3_close(db);
return -1;
}
printf("打開數據庫test.db成功~\n");

//2.
int id;
char name[32] = {0};
int age;
char *insertSql = "insert into stud(id,name,age) values(?,?,?);";
printf("請輸入ID:\n");
scanf("%d",&id);
printf("請輸入姓名:\n");
scanf("%s",name);
printf("請輸入年齡:\n");
scanf("%d",&age);
res = sqlite3_prepare_v2(db,insertSql,strlen(insertSql),&stmt,0);
if(res != SQLITE_OK)
{
printf("sqlite3_prepare_v2 error\n");
fprintf(stderr,"prepare error %s\n",sqlite3_errmsg(db));
return -1;
}
sqlite3_bind_int(stmt,1,id);
sqlite3_bind_int(stmt,3,age);
sqlite3_bind_text(stmt,2,name,strlen(name),0);


//3
res = sqlite3_step(stmt);
if(res != SQLITE_DONE)
{
printf("sqlite3_step error\n");
return -1;
}
//4
sqlite3_finalize(stmt);
sqlite3_close(db);
}

 

/*************************************************************************
> File Name: sqlite3_prepare_select.c
> Author: csgec
> Mail: longer.zhou@gmail.com
> Created Time: Thu 25 Aug 2016 02:23:03 PM CST
************************************************************************/

#include<stdio.h>
#include<sqlite3.h>
#include<string.h>
int main()
{
sqlite3 *db;
sqlite3_stmt *stmt;
//1
int res = sqlite3_open("test.db",&db);
if(res != SQLITE_OK)
{
fprintf(stderr,"open error %s\n",sqlite3_errmsg(db));
sqlite3_close(db);
return -1;
}
printf("打開數據庫test.db成功~\n");

//2.
char *selectSql = "select * from stud;";
res = sqlite3_prepare_v2(db,selectSql,strlen(selectSql),&stmt,0);
if(res != SQLITE_OK)
{
printf("sqlite3_prepare_v2 error\n");
fprintf(stderr,"prepare error %s\n",sqlite3_errmsg(db));
return -1;
}

//3
res = sqlite3_step(stmt);
/*
if(res != SQLITE_DONE)
{
printf("sqlite3_step error\n");
return -1;
}
*/
int count = sqlite3_column_count(stmt);
printf("count = %d\n",count);
int i;
//獲取字段名和字段類型
for(i = 0; i < count; i++)
{
printf("column name:%s\n",sqlite3_column_name(stmt,i));
printf("column type:%i\n",sqlite3_column_type(stmt,i));
}

//獲取字段值
int id;
const char *name;
int age;
const char *addr;
while(res == SQLITE_ROW)
{
id = sqlite3_column_int(stmt,0);
name = sqlite3_column_text(stmt,1);
age = sqlite3_column_int(stmt,2);
addr = sqlite3_column_text(stmt,3);
printf("id = %d,name = %s,age = %d,addr = %s\n",
id,name,age,addr);

res = sqlite3_step(stmt);
}
//4
sqlite3_finalize(stmt);
sqlite3_close(db);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM