SQLite C语言接口

sqlite3 *db 是数据库连接对象,用来操作数据库

打开数据库对象函数

int sqlite3_open(

    constchar*filename,/*数据库文件名 */

    sqlite3 **ppDb /* 创建的数据库连接对象*/

);

关闭数据库对象函数

int sqlite3_close(sqlite3 */*打开的数据库连接对象*/);

返回数据库错误消息

constchar*sqlite3_errmsg(sqlite3*);

SQLITE_OK:表示打开成功

 

示例:

#include <stdio.h>

#include <sqlite3.h>

 

int main(void)

{

    /*定义一个数据库连接对象指针*/

    sqlite3 *db =NULL;

    /*初始化连接对象开辟空间*/

    int rc = sqlite3_open("sqlite.db",&db);

    if(rc != SQLITE_OK)

    {

        /*获取连接对象的错误信息*/

        fprintf(stderr,"%s\n",sqlite3_errmsg(db));

        return-1;

    }

    printf("connect sucess!\n");

 

    sqlite3_close(db);   //闭关数据库

 

    return0;

}

 

编译:gcc  sqlite.c -o sqlite -I/usr/local/sqlite-3.3.7/include -L/usr/local/sqlite-3.3.7/lib -lsqlite3

 

 

执行sql语句的函数

 

执行sql语句函数

int sqlite3_exec(

    sqlite3*,/* 打开的数据库连接对象*/

    constchar*sql,/* 将要执行的sql语句*/

    int(*callback)(void*,int,char**,char**),/* 回调函数*/

    void*,/* 回调函数的第一个参数*/

    char**errmsg /* 错误的消息*/

);

 

示例:

#include <stdio.h>

#include <sqlite3.h>

 

int main(void)

{

    sqlite3 *db =NULL;

    int rc = sqlite3_open("sqlite.db",&db);

    if(rc != SQLITE_OK)

    {

        fprintf(stderr,"%s\n", sqlite3_errmsg(db));

        return-1;

    }

 

    char*sql1 ="create table if not exists stu(id integer primary key default 1, name varchar(20));";

    char*sql2 ="insert into stu(name) values('aa');";

    char*errmsg;

 

    rc = sqlite3_exec(db, sql1,NULL,NULL,&errmsg);

    if(rc != SQLITE_OK)

    {

        fprintf(stderr,"错误%s\n",sqlite3_errmsg(db));

        fprintf(stderr,"错误%s\n",errmsg);

    }

   

    rc = sqlite3_exec(db, sql2,NULL,NULL,&errmsg);

    if(rc != SQLITE_OK)

    {

        fprintf(stderr,"错误%s\n",sqlite3_errmsg(db));

        fprintf(stderr,"错误%s\n",errmsg);

    }

   

    sqlite3_close(db);

    return0;

}

 

 

查询函数

int sqlite3_get_table(

    sqlite3 *db,        /*数据库连接对象*/

    constchar*zSql,/*将要执行的sql语句*/

    char***pazResult,/* 查询的结果集 */

    int*pnRow,           /* 结果集的行数*/

    int*pnColumn,        /*结果集的列数*/

    char**pzErrmsg   /* 查询的错误消息*/

);

释放结果集函数

void sqlite3_free_table(char**result);

 

示例:

 

#include <stdio.h>

#include <sqlite3.h>

 

int main(void)

{

    /*定义一个数据库连接对象指针*/

    sqlite3 *db =NULL;

    int rc ;

    /*初始化连接对象,开辟空间*/

    rc = sqlite3_open("test.db",&db);

 

    if(rc != SQLITE_OK )

    {

        /*获取连接对象的错误信息*/

        fprintf(stderr,"错误%s\n",sqlite3_errmsg(db));

        return-1;

    }

 

    char*sql ="select * from tbl_emp";

    char**result =NULL;

    int rows;

    int cols;

    rc = sqlite3_get_table(db,sql,&result,&rows,&cols,NULL);   

    if(rc != SQLITE_OK )

    {

        /*获取连接对象的错误信息*/

        fprintf(stderr,"错误%s\n",sqlite3_errmsg(db));

        return-1;

    };

 

    int i, flag=0;

    for(i =0;i <(rows +1)* cols ;i++)

    {

        if((flag++)== cols)

        {

            flag=1;

            printf("\n");

        }

        printf("%12s", result[i]);

    }

       

    printf("\n");

 

    sqlite3_free_table(result);

 

    /*关闭数据库,释放空间*/

    sqlite3_close(db);

    return1;

}

 

 

#include <stdio.h>

#include <sqlite3.h>

 

int main(void)

{

    /*定义一个数据库连接对象指针*/

    sqlite3 *db =NULL;

    int rc ;

    /*初始化连接对象,开辟空间*/

    rc = sqlite3_open("test.db",&db);

 

    if(rc != SQLITE_OK )

    {

        /*获取连接对象的错误信息*/

        fprintf(stderr,"错误%s\n",sqlite3_errmsg(db));

        return-1;

    }

 

    char* name="denny";

    char*sql;

 

    char buff[200];

    sprintf(buff,"select * from tbl_emp where name ='%s'",name);

    sql =(char*)malloc(strlen(buff));

    strcpy(sql,buff);

 

    char**result =NULL;

    int rows;

    int cols;

    rc = sqlite3_get_table(db,sql,&result,&rows,&cols,NULL);   

    if(rc != SQLITE_OK )

    {

        /*获取连接对象的错误信息*/

        fprintf(stderr,"错误%s\n",sqlite3_errmsg(db));

        return-1;

    };

    int i, flag=0;

    for(i =0;i <(rows +1)* cols ;i++)

    {

        if((flag++)== cols)

        {

            flag=1;

            printf("\n");

        }

        printf("%12s", result[i]);

    }      

 

    sqlite3_free_table(result);

 

    printf("数据库连接成功!\n");

    /*关闭数据库,释放空间*/

    sqlite3_close(db);

    return1;

}

 

 

回调函数

int(*callback)(

    void*,/*从sqlite3_exec传递来的参数*/

    int,/*结果集的列数*/

    char**,/*列的值*/

    char**/*列的名字*/

)

示例:

#include <stdio.h>

#include <sqlite3.h>

 

int testcallback(void*d,int cols,char**col_values,char**col_names)

{

    int i;

   

    int flag  =*((int*)d);

   

    if(flag ==1)

    {

        for(i =0;i< cols ;i++)

        {

            printf("%12s",col_names[i]);

        }

        printf("\n");

    }

 

    for(i =0;i< cols ;i++)

    {

        printf("%12s",col_values[i]);

    }

    printf("\n");

   

    return0;

}

 

int main(void)

{

    /*定义一个数据库连接对象指针*/

    sqlite3 *db =NULL;

    int rc ;

    /*初始化连接对象,开辟空间*/

    rc = sqlite3_open("test.db",&db);

   

    if(rc != SQLITE_OK )

    {

        /*获取连接对象的错误信息*/

        fprintf(stderr,"错误%s\n",sqlite3_errmsg(db));

        return-1;

    }

   

    printf("数据库连接成功!\n");

   

    /*插入数据*/

    char* sql ="select * from tbl_emp";

    char* errmsg;

    int flag =1;

    rc = sqlite3_exec(db,sql,testcallback,&flag,&errmsg);

    if(rc != SQLITE_OK )

    {

        /*获取连接对象的错误信息*/

        fprintf(stderr,"错误%s\n",sqlite3_errmsg(db));

        fprintf(stderr,"错误%s\n",errmsg);

        return-1;

    }

   

    /*关闭数据库,释放空间*/

    sqlite3_close(db);

    return1;

}

 

预处理对象

int sqlite3_prepare(

    sqlite3 *db,/* 数据库连接对象*/

    constchar*zSql,/*将要执行的sql语句*/

    int nByte,/* sql语句的长度 -1*/

    sqlite3_stmt **ppStmt,/* sqlite3_stmt对象 */

    constchar**pzTail /* 指向执行的sql语句 0*/

);

int sqlite3_bind_text(sqlite3_stmt*,int,constchar*,int n,void(*)(void*));

int sqlite3_step(sqlite3_stmt*);

constunsignedchar*sqlite3_column_text(sqlite3_stmt*,int iCol);

int sqlite3_finalize(sqlite3_stmt *pStmt);

 

示例:

#include <stdio.h>

#include <sqlite3.h>

 

int main(void)

{

    /*定义一个数据库连接对象指针*/

    sqlite3 *db =NULL;

    int rc ;

    /*初始化连接对象,开辟空间*/

    rc = sqlite3_open("test.db",&db);

   

    if(rc != SQLITE_OK )

    {

        /*获取连接对象的错误信息*/

        fprintf(stderr,"错误%s\n",sqlite3_errmsg(db));

        return-1;

    }

    char* name ="denny";

    char* sql ="select * from tbl_emp where name=? and id=?";

    sqlite3_stmt  *stmt =NULL;

    rc = sqlite3_prepare(db,sql,-1,&stmt,NULL);

   

    sqlite3_bind_text(stmt,1,name,strlen(name),NULL);

   

    sqlite3_bind_int(stmt,2,2);

   

    sqlite3_step(stmt);

    printf("id=%d\n",sqlite3_column_int(stmt,0));

    printf("name=%s\n",sqlite3_column_text(stmt,1));

   

   

    sqlite3_finalize(stmt);

   

    printf("数据库连接成功!\n");

    /*关闭数据库,释放空间*/

    sqlite3_close(db);

    return1;

}

 

#include <stdio.h>

#include <sqlite3.h>

 

int main(void)

{

    /*定义一个数据库连接对象指针*/

    sqlite3 *db =NULL;

    int rc ;

    /*初始化连接对象,开辟空间*/

    rc = sqlite3_open("test.db",&db);

   

    if(rc != SQLITE_OK )

    {

        /*获取连接对象的错误信息*/

        fprintf(stderr,"错误%s\n",sqlite3_errmsg(db));

        return-1;

    }

 

    char* sql ="select * from tbl_emp";

    sqlite3_stmt  *stmt =NULL;

    rc = sqlite3_prepare(db,sql,-1,&stmt,NULL);

    sqlite3_step(stmt);

    printf("id=%d\n",sqlite3_column_int(stmt,0));

    printf("name=%s\n",sqlite3_column_text(stmt,1));

   

    sqlite3_step(stmt);

    printf("id=%d\n",sqlite3_column_int(stmt,0));

    printf("name=%s\n",sqlite3_column_text(stmt,1));

   

    sqlite3_finalize(stmt);

   

    printf("数据库连接成功!\n");

    /*关闭数据库,释放空间*/

    sqlite3_close(db);

    return1;

}

 

预处理对象重复使用

#include <stdio.h>

#include <sqlite3.h>

 

int main(void)

{

    /*定义一个数据库连接对象指针*/

    sqlite3 *db =NULL;

    int rc ;

    /*初始化连接对象,开辟空间*/

    rc = sqlite3_open("test.db",&db);

   

    if(rc != SQLITE_OK )

    {

        /*获取连接对象的错误信息*/

        fprintf(stderr,"错误%s\n",sqlite3_errmsg(db));

        return-1;

    }

    char* name ="annie";

    char* sql ="select * from tbl_emp where name=?";

    sqlite3_stmt  *stmt =NULL;

    rc = sqlite3_prepare(db,sql,-1,&stmt,NULL);

   

    sqlite3_bind_text(stmt,1,name,strlen(name),NULL);

    sqlite3_step(stmt);

    printf("id=%d\n",sqlite3_column_int(stmt,0));

    printf("name=%s\n",sqlite3_column_text(stmt,1));

    printf("-------\n");

    sqlite3_reset(stmt);

    sqlite3_bind_text(stmt,1,"denny",strlen("denny"),NULL);

    sqlite3_step(stmt);

    printf("id=%d\n",sqlite3_column_int(stmt,0));

    printf("name=%s\n",sqlite3_column_text(stmt,1));

   

   

    sqlite3_finalize(stmt);

   

    printf("数据库连接成功!\n");

    /*关闭数据库,释放空间*/

    sqlite3_close(db);

    return1;

}

 

 

事务

事务是数据库最小处理单元

事务的四个特性:

1.原子性

2.隔离性

3.一直性

4.持久性

 

sqlite如何使用事务

1.begin trasaction

2.rollback--回滚(取消)

3.commit--提交

4.sqlite3_exec(db,"begin trasaction",NULL,NULL,NULL)

5.sqlite3_exec(db,"commit",NULL,NULL,NULL)

6.sqlite3_exec(db,"rollback",NULL,NULL,NULL)

 

 

#include <stdio.h>

#include <sqlite3.h>

 

int main(void)

{

    /*定义一个数据库连接对象指针*/

    sqlite3 *db =NULL;

    int rc ;

    /*初始化连接对象,开辟空间*/

    rc = sqlite3_open("test.db",&db);

   

    if(rc != SQLITE_OK )

    {

        /*获取连接对象的错误信息*/

        fprintf(stderr,"错误%s\n",sqlite3_errmsg(db));

        return-1;

    }

   

    printf("数据库连接成功!\n");

   

    /*插入数据*/

    char* sql1 ="insert into tbl_emp(id,name,age,birthday) values(5,'denny',32,date('1977-06-28'))";

    char* sql2 ="insert into tbl_emp(id,name,age,birthday) values(5,'denny',32,date('1977-06-28'))";

    char* errmsg;

    rc = sqlite3_exec(db,"begin transaction",NULL,NULL,&errmsg);

    rc = sqlite3_exec(db,sql1,NULL,NULL,&errmsg);

    rc = sqlite3_exec(db,sql2,NULL,NULL,&errmsg);

    if(rc != SQLITE_OK )

    {

        /*获取连接对象的错误信息*/

        fprintf(stderr,"错误%s\n",sqlite3_errmsg(db));

        fprintf(stderr,"错误%s\n",errmsg);

        sqlite3_exec(db,"rollback transaction",NULL,NULL,&errmsg);

        return-1;

    }

    sqlite3_exec(db,"commit  transaction",NULL,NULL,&errmsg);

   

    /*关闭数据库,释放空间*/

    sqlite3_close(db);

    return1;

}

 

 

其它:

#include <stdio.h>

#include <sqlite3.h>

#include <fcntl.h>

int main(void)

{

    /*定义一个数据库连接对象指针*/

    sqlite3 *db =NULL;

    int rc ;

    /*初始化连接对象,开辟空间*/

    rc = sqlite3_open("test.db",&db);

 

    if(rc != SQLITE_OK )

    {

        /*获取连接对象的错误信息*/

        fprintf(stderr,"错误%s\n",sqlite3_errmsg(db));

        return-1;

    }

 

    printf("数据库连接成功!\n");

 

    /*插入数据*/

    char* sql ="insert into tbl_emp(id,photo) values(7,?)";

 

    sqlite3_stmt * stmt =NULL;

    rc = sqlite3_prepare(db,sql,-1,&stmt,NULL);

 

    /*读取一个文件*/

    int fd = open("logo.gif",O_RDONLY); 

    int buff[1024*8];

    int len = read(fd,buff,sizeof(buff));

    sqlite3_bind_blob(stmt,1,buff,len,NULL);

    sqlite3_step(stmt);

    if(rc != SQLITE_OK )

    {

        /*获取连接对象的错误信息*/

        fprintf(stderr,"错误%s\n",sqlite3_errmsg(db));

 

        return-1;

    }

 

    /*关闭数据库,释放空间*/

    sqlite3_close(db);

    return1;

}

 

 

 

#include <stdio.h>

#include <sqlite3.h>

#include <fcntl.h>

int main(void)

{

    /*定义一个数据库连接对象指针*/

    sqlite3 *db =NULL;

    int rc ;

    /*初始化连接对象,开辟空间*/

    rc = sqlite3_open("test.db",&db);

 

    if(rc != SQLITE_OK )

    {

        /*获取连接对象的错误信息*/

        fprintf(stderr,"错误%s\n",sqlite3_errmsg(db));

        return-1;

    }

 

    printf("数据库连接成功!\n");

 

    /*插入数据*/

    char* sql ="select photo from tbl_emp where id =7";

 

    sqlite3_stmt * stmt =NULL;

    rc = sqlite3_prepare(db,sql,-1,&stmt,NULL);

    sqlite3_step(stmt);

    constvoid*pimage = sqlite3_column_blob(stmt,0);

    int size = sqlite3_column_bytes(stmt,0);

  

    /*读取一个文件*/

    int fd = open("logo1.gif",O_WRONLY|O_CREAT,0777); 

 

    write(fd,pimage,size);

  

    if(rc != SQLITE_OK )

    {

        /*获取连接对象的错误信息*/

        fprintf(stderr,"错误%s\n",sqlite3_errmsg(db));

 

        return-1;

    }

 

    /*关闭数据库,释放空间*/

    sqlite3_close(db);

    return1;

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值