sqllite简介
SQLite是一个无服务器的数据库,是自包含的,也称为嵌入式数据库,这意味着数据库引擎作为应用程序的一部分运行。它是轻量化,用于设备端的数据管理,可以理解成单点的数据库。传统服务器型数据库用于管理多端设备,更加复杂。
基于嵌入式的数据库主要有:SQLite,Firebird,Berkeley DB,eXtremeDB。
Firebird:关系型数据库,功能强大,支持存储过程,SQL兼容等SQLite关系型数据库,
体积小,支持ACID事务
BerkeleyDB:并没有数据库服务器的概念,他的程序直接链接到应用程序中
eXtremeDB:内存数据库,运行效率高
sqlite与msql对比
sqlite优点 | sqlite缺点 | mysql优点 | mysql |
1.基于文件,易于设和使用 2.适合基础开发和测试 3.轻松携带 4.使用标准SQL语法进行微小更改使用方便 | 1.缺乏用户管理和安全功能 2.不容易扩展 3.不适合大数据库 4.无法定制 | 1.包含许多数据库相关的功能 2.良好的安全功能 3.易于扩展,适用于大型数据库 提供良好的速度和性能 4.提供良好的用户管理和 5.多种访问控制 | 1.需要技术专业知识来设置 2.传统SQL 相比,语法略有不同 |
sqllite的C接口
int sqlite3_open(const char *filename, sqlite3 **ppDb);
功能:打开(创建)数据库
参数:
filename:打开(创建)的数据库文件名
ppDb:sqlite3数据库句柄的指针
返回值:
#defineSQLITE_OK 0 成功结果
错误开始码
#defineSQLITE_ERROR 1 SQL错误或缺少数据库
#defineSQLite 内部逻辑错误
#defineSQLITE_PERM 3 拒绝访问权限
#defineSQLITE_ABORT 4 回调例程请求中止
#define SQLITE_BUSY 5 数据库文件被锁定
# SQLITE_LOCKED 6 数据库中的表被锁定
#define SQLITE_NOMEM 7 A malloc() failed
#define SQLITE_READONLY 8 尝试写一个只读数据库
#defineSQLITE_INTERRUPT 9 被sqlite3_interrupt()终止的操作
# SQLITE_IOERR 10 磁盘I/O出错
#define SQLITE_CORRUPT 11 数据库磁盘镜像不正常
#defineSQLITE_NOTFOUND 12 sqlite3_file_control()中未知的操作码
#define SQLITE_FULL 13 插入失败,因为数据库已满
# SQLITE_CANTOPEN 14 无法打开数据库文件
#defineSQLITE_PROTOCOL 15 数据库锁定协议错误
#define SQLITE_EMPTY 16 数据库为空
#defineSQLITE_SCHEMA 17 数据库模式改变
#defineSQLITE_TOOBIG 18 字符串或BLOB超过大小限制
#defineSQLITE_CONSTRAINT 19 由于约束违反而终止
#defineSQLITE_MISMATCH 20 数据类型不匹配
#define SQLITE_MISUSE 21 错误使用的库
#define SQLITE_NOLFS 22 使用主机不支持的操作系统特性
#defineSQLITE_AUTH 23 拒绝授权
#defineSQLITE_FORMAT 24 辅助数据库格式错误
#defineSQLITE_RANGE 25 第二个参数为sqlite3_bind out of range
#defineSQLITE_NOTADB 26 打开的文件不是数据库文件
#defineSQLITE_ROW 100 sqlite3_step()有另一行
#define SQLITE_DONE 101 sqlite3_step()已经完成执行
int sqlite3_close(sqlite3 *db);
功能:关闭数据库
参数: db:数据库的句柄
返回值同上
const char* sqlite3_errmg(sqlite3 *db);
功能:收集错误信息
参数: db:数据库的句柄
返回值:
成功返回错误说明的字符串指针,错误返回空指针;
int sqlite3_exec(sqlite3 *db,const char *sql,int callback,void *arg,char **errmsg);
功能:执行sql
参数:
db:数据库句柄
sql:执行的sql
callback:回调函数
arg:参数
errmsg:错误信息
返回值同上
int callback(void*arg,intcolumn_size,char*column_value[],char*column_name[]);
功能:回调函数
参数:
arg:参数
column_size:数据库的字段数
column_value[]:列的值
column_name[]:字段名字
demo:
1.编写数据库接口及操作函数
2.可使用.open,create,insert,select,update,delete,drop等SQL
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <string.h>
static int callback(void *args,int column_size,char *column_name[],char *column_value[])
{
int i;
printf("%s\n",(char *)args);
printf("======================\n");
for(i = 0;i < column_size;i++)
{
printf("%s = %s\n",column_name[i],column_value[i]);
}
printf("======================\n");
return 0;
}
void result(char data_bin[])
{
sqlite3 *db;
int ret;
int ret_exec;
char input[128] = {'\0'};
char *err_msg = NULL;
ret = sqlite3_open(data_bin,&db);
if(ret != 0)
{
printf("create/open db faili,why : %s\n",sqlite3_errmsg(db));
exit(-1);
}
while(1)
{
printf("input your sql:\n");
printf(">>>");
memset(input,'\0',128);
fgets(input,128,stdin);
ret_exec = sqlite3_exec(db,input,callback,"context of sql:",&err_msg);
if(ret_exec != 0)
{
printf("error:%s\n",err_msg);
}
}
sqlite3_close(db);
}
int main(int argc,char **argv)
{
if(argc != 2)
{
printf("param is error\n");
exit(-1);
}
result(argv[1]);
return 0;
}
结果示例: