linux-数据库开发之Sqlite3

数据库

数据库基本概念

数据(Data)      
能够输入计算机并能被计算机程序识别和处理的信息集合
数据库 (Database)    
数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合

常用的数据库

大型数据库


Oracle公司是最早开发关系数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率名列前茅。
IBM 的DB2是第一个具备网上功能的多媒体关系数据库管理系统,支持包Linux在内的一系列平台。


中型数据库


Server是微软开发的数据库产品,主要支持windows平台。


小型数据库


mySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司,2008年被Sun公司收购,开放源码。

基于嵌入式的数据库

基于嵌入式Linux的数据库主要有SQLite, Firebird, Berkeley DB, eXtremeDB
Firebird是关系型数据库,功能强大,支持存储过程、SQL兼容等
SQLite关系型数据库,体积小,支持ACID事务
Berkeley DB中并没有数据库服务器的概念,它的程序库直接链接到应用程序中 
eXtremeDB是内存数据库,运行效率高
 

SQLite 基础

SQLite的源代码是C,其源代码完全开放。SQLite第一个Alpha版本诞生于2000年5月。 他是一个轻量级的嵌入式数据库。
SQLite有以下特性:
零配置一无需安装和管理配置;
储存在单一磁盘文件中的一个完整的数据库;
数据库文件可以在不同字节顺序的机器间自由共享;
支持数据库大小至2TB;
足够小,全部源码大致3万行c代码,250KB;
比目前流行的大多数数据库对数据的操作要快;
 

创建数据库

手工创建
使用SQLite3工具,通过手工输入SQL命令行完成数据库创建.
用户在Linux的命令行界面中输入SQLite3可启动SQLite3工具
代码创建
在代码中常动态创建数据库
在程序运行过程中,当需要进行数据库操作时,应用程序会首先尝试打开数据库,此时如果数据库并不存在,程序则会自动建立数据库,然后再打开数据库
 

数据库常用命令介绍

   1, 数据库的安装
       sudo dpkg -i  *.deb

   2, 数据库命令:
      1)系统命令 , 都以'.'开头
         .exit 
         .quit
         .table   查看表
         .schema  查看表的结构
          
      2)sql语句, 都以‘;’结尾

        1-- 创建一张表
            create table stuinfo(id integer, name text, age integer, score float);
        
        2-- 插入一条记录
            insert into stuinfo values(1001, 'zhangsan', 18, 80);
            insert into stuinfo (id, name, score) values(1002, 'lisi', 90);

        3-- 查看数据库记录
            select * from stuinfo;
            select * from stuinfo where score = 80;
            select * from stuinfo where score = 80 and name= 'zhangsan';
            select * from stuinfo where score = 80 or name='wangwu';
            select name,score from stuinfo;  查询指定的字段
            select * from stuinfo where score >= 85 and score < 90;

        4-- 删除一条记录
            delete from stuinfo where id=1003 and name='zhangsan';

        5-- 更新一条记录
            update stuinfo set age=20 where id=1003;
            update stuinfo set age=30, score = 82 where id=1003;

        6-- 删除一张表
            drop table stuinfo;

        7-- 增加一列
            alter table stuinfo add column sex char;

        8-- 删除一列
            create table stu as select id, name, score from stuinfo;
            drop table stuinfo;
            alter table stu rename to stuinfo;

     数据库设置主键:
     create table info(id integer primary key autoincrement, name vchar);

SQLite编程接口

int   sqlite3_open(char  *path,   sqlite3 **db);


功能:打开sqlite数据库
path:数据库文件路径
db:指向sqlite句柄的指针
返回值:成功返回0,失败返回错误码(非零值)

int   sqlite3_close(sqlite3 *db);


功能:关闭sqlite数据库         
返回值:成功返回0,失败返回错误码
const  char  *sqlite3_errmg(sqlite3 *db);         
返回值:返回错误信息

Typedef  int (*sqlite3_callback)(void *, int,
char **, char **);
Int sqlite3_exec(sqlite3 *db, const  char  *sql, sqlite3_callback callback, void *, char **errmsg);

功能:执行SQL操作
db:数据库句柄
sql:SQL语句
callback:回调函数
errmsg:错误信息指针的地址
返回值:成功返回0,失败返回错误码

typedef  int (*sqlite3_callback)(void *para, int f_num, char **f_value, char **f_name);


功能:每找到一条记录自动执行一次回调函数
para:传递给回调函数的参数
f_num:记录中包含的字段数目
f_value:包含每个字段值的指针数组
f_name:包含每个字段名称的指针数组
返回值:成功返回0,失败返回-1
不使用回调函数执行SQL语句

int   sqlite3_get_table(sqlite3 *db, const  char  *sql,  char ***resultp,  int*nrow,  int *ncolumn, char **errmsg);


功能:执行SQL操作
db:数据库句柄
sql:SQL语句
resultp:用来指向sql执行结果的指针
nrow:满足条件的记录的数目
ncolumn:每条记录包含的字段数目
errmsg:错误信息指针的地址
返回值:成功返回0,失败返回错误码
 


sqlite3 数据库 C语言 API 

     int sqlite3_open(
      const char *filename,   /* Database filename (UTF-8) */
      sqlite3 **ppDb          /* OUT: SQLite db handle */
     );


    功能:打开数据库
    参数:filename  数据库名称
          ppdb      数据库句柄
    返回值:成功为0 SQLITE_OK ,出错 错误码

    int sqlite3_close(sqlite3* db);
    功能:关闭数据库
    参数:
    返回值:成功为0 SQLITE_OK ,出错 错误码

   const char *sqlite3_errmsg(sqlite3*db);
    功能:得到错误信息的描述
 

   int sqlite3_exec(
   sqlite3* db,                                  /* An open database */
  const char *sql,                           /* SQL to be evaluated */
  int (*callback)(void* arg,int,char**,char**),  /* Callback function */
  void * arg,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */
  );


  功能:执行一条sql语句
  参数:db  数据库句柄
        sql sql语句
        callback  回调函数,只有在查询时,才传参
        arg      为回调函数传递参数
        errmsg  错误消息
  返回值:成功 SQLITE_OK

查询回调函数:

int (*callback)(void* arg,int ncolumns ,char** f_value,char** f_name),  /* Callback function */


功能:查询语句执行之后,会回调此函数
参数:arg   接收sqlite3_exec 传递来的参数
      ncolumns 列数
      f_value 列的值得地址
      f_name   列的名称
返回值:0,
           
  

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);

查询
 

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

#define  DATABASE   "student.db"

int do_insert(sqlite3 *db)
{
	char sql[128] = {};
	int id;
	char name[20];
	float score;
	char *errmsg;

	printf("Input id:");
	scanf("%d", &id);
	getchar();

	printf("Input name:");
	scanf("%s", name);
	getchar();

	printf("Input score:");
	scanf("%f", &score);
	getchar();

	sprintf(sql,"insert into stuinfo values(%d,'%s',%f);", id, name, score);

	if(sqlite3_exec(db, sql,NULL ,NULL ,&errmsg) != SQLITE_OK)
	{
		printf("%s,%d --> %s\n", __func__, __LINE__, errmsg);
		return -1;
	}
	else
	{
		printf("Insert done.\n");
	}

	return 0;
}

int callback(void* arg,int ncolumns ,char** f_value,char** f_name)
{
	int i = 0;
	for(i = 0; i < ncolumns; i++)
	{
		printf("%-13s ", f_value[i]);
	}
	putchar(10);

	puts("++++++++++++++++");

	return 0;
}

int do_query(sqlite3 *db)
{
	char sql[128] = {};
	int id;
	char *errmsg;

#if 0
	printf("Input id:");
	scanf("%d", &id);
	getchar();

	sprintf(sql,"select * from stuinfo where id = %d;", id);
#endif
#if 1
	sprintf(sql,"select * from stuinfo;");
#endif



	if(sqlite3_exec(db, sql,callback ,NULL ,&errmsg) != SQLITE_OK)
	{
		printf("%s,%d --> %s\n", __func__, __LINE__, errmsg);
		return -1;
	}
	else
	{
		printf("Query done.\n");
	}

	return 0;
}


// gcc stu.c -o stu -lsqlite3

int main(int argc, const char *argv[])
{
	sqlite3 * db;
	char *errmsg;
	int n = 0;
	
	if(sqlite3_open(DATABASE, &db) != SQLITE_OK)
	{
		printf("%s\n", sqlite3_errmsg(db));
		return -1;
	}
	else 
	{
		printf("Create or open success.\n");
	}

	if(sqlite3_exec(db, "create table if not exists stuinfo (id integer, name vchar(20) not null,score float);",\
				NULL, NULL,&errmsg) != SQLITE_OK)
	{
		printf("%s\n", errmsg);
	}
	
	while(1)
	{
		printf("*******************************************************\n");
		printf("1,insert  2,delete  3,select  4,update 5,quit         \n");
		printf("*******************************************************\n");

		printf("Input:");

		scanf("%d",&n);
		switch(n)
		{
		case 1:
			do_insert(db);
			break;
		case 2:
		//	do_delete();
			break;
		case 3:
		//	do_query1(db);
			do_query(db);
			break;
		case 4:
		//	do_update();
			break;
		case 5:
			sqlite3_close(db);
			exit(0);
			break;
		default:
			printf("Invalid cmd.\n");

		}

	}
	
	return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>

#define  DATABASE  "student.db"
#define  N  128

int do_insert(sqlite3* db)
{
	int id;
	char name[32] = {};
	char sex;
	int score;
	char sql[N] = {};
	char* errmsg;

	printf("Input id:");
	scanf("%d", &id);

	printf("Input name:");
	scanf("%s", name);
	getchar();

	printf("Input sex:");
	scanf("%c", &sex);

	printf("Input score:");
	scanf("%d", &score);

	sprintf(sql, "insert into stu values(%d, '%s', '%c', %d)", id, name, sex, score);

	if (sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)//执行一条sql语句
	{
		printf("%s\n", errmsg);
	}
	else
	{
		printf("Insert done.\n");
	}

	return 0;
}
int do_delete(sqlite3* db)
{
	int id;
	char sql[N] = {};
	char* errmsg;

	printf("Input id:");
	scanf("%d", &id);

	sprintf(sql, "delete from stu where id = %d", id);

	if (sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
	{
		printf("%s\n", errmsg);
	}
	else
	{
		printf("Delete done.\n");
	}

	return 0;
}
int do_update(sqlite3* db)
{
	int id;
	char sql[N] = {};
	char name[32] = "zhangsan";
	char* errmsg;

	printf("Input id:");
	scanf("%d", &id);

	sprintf(sql, "update stu set name='%s' where id=%d", name, id);

	if (sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
	{
		printf("%s\n", errmsg);
	}
	else
	{
		printf("update done.\n");
	}

	return 0;
}


int callback(void* arg, int f_num, char** f_value, char** f_name)
{
	int i = 0;

	for (i = 0; i < f_num; i++)
	{
		//	printf("%-8s %s", f_value[i], f_name[i]);
		printf("%-8s", f_value[i]);
	}

	printf("++++++++++++++++++++++");
	putchar(10);

	return 0;
}

int do_query(sqlite3* db)
{
	char* errmsg;
	char sql[N] = "select count(*) from stu where name='zhangsan';";

	if (sqlite3_exec(db, sql, callback, NULL, &errmsg) != SQLITE_OK)
	{
		printf("%s", errmsg);
	}
	else
	{
		printf("select done.\n");
	}
}

int do_query1(sqlite3* db)
{
	char* errmsg;
	char** resultp;
	int nrow;
	int ncolumn;

	if (sqlite3_get_table(db, "select * from stu", &resultp, &nrow, &ncolumn, &errmsg) != SQLITE_OK)
	{
		printf("%s\n", errmsg);
		return -1;
	}
	else
	{
		printf("query done.\n");
	}

	int i = 0;
	int j = 0;
	int index = ncolumn;

	for (j = 0; j < ncolumn; j++)
	{
		printf("%-10s ", resultp[j]);
	}
	putchar(10);

	for (i = 0; i < nrow; i++)
	{
		for (j = 0; j < ncolumn; j++)
		{
			printf("%-10s ", resultp[index++]);
		}
		putchar(10);
	}

	return 0;
}

int main(int argc, const char* argv[])
{
	sqlite3* db;
	char* errmsg;
	int n;

	if (sqlite3_open(DATABASE, &db) != SQLITE_OK)
	{
		printf("%s\n", sqlite3_errmsg(db));
		return -1;
	}
	else
	{
		printf("open DATABASE success.\n");
	}

	if (sqlite3_exec(db, "create table if not exists stu(id int, name char , sex char , score int);",
		NULL, NULL, &errmsg) != SQLITE_OK)
	{
		printf("%s\n", errmsg);
	}
	else
	{
		printf("Create or open table success.\n");
	}

	while (1)
	{
		printf("********************************************\n");
		printf("1: insert  2:query  3:delete 4:update 5:quit\n");
		printf("********************************************\n");
		printf("Please select:");
		scanf("%d", &n);

		switch (n)
		{
		case 1:
			do_insert(db);
			break;
		case 2:
			do_query(db);
			//	do_query1(db);
			break;
		case 3:
			do_delete(db);
			break;
		case 4:
			do_update(db);
			break;
		case 5:
			printf("main exit.\n");
			sqlite3_close(db);
			exit(0);
			break;
		default:
			printf("Invalid data n.\n");
		}

	}




	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 SQLite3 的 C API 来操作 SQLite3 数据库。以下是一个简单的示例程序: ```c #include <stdio.h> #include <stdlib.h> #include <sqlite3.h> int main(int argc, char **argv) { sqlite3 *db; char *err_msg = ; int rc; rc = sqlite3_open("test.db", &db); if (rc != SQLITE_OK) { fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } char *sql = "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER);" "INSERT INTO users (name, age) VALUES ('Alice', 25);" "INSERT INTO users (name, age) VALUES ('Bob', 30);" "INSERT INTO users (name, age) VALUES ('Charlie', 35);"; rc = sqlite3_exec(db, sql, , , &err_msg); if (rc != SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", err_msg); sqlite3_free(err_msg); sqlite3_close(db); return 1; } sqlite3_stmt *stmt; rc = sqlite3_prepare_v2(db, "SELECT * FROM users;", -1, &stmt, ); if (rc != SQLITE_OK ) { fprintf(stderr, "Failed to prepare statement: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) { int id = sqlite3_column_int(stmt, ); const unsigned char *name = sqlite3_column_text(stmt, 1); int age = sqlite3_column_int(stmt, 2); printf("id=%d, name=%s, age=%d\n", id, name, age); } if (rc != SQLITE_DONE) { fprintf(stderr, "Failed to fetch data: %s\n", sqlite3_errmsg(db)); } sqlite3_finalize(stmt); sqlite3_close(db); return ; } ``` 这个程序会创建一个名为 `test.db` 的 SQLite3 数据库,并在其中创建一个名为 `users` 的表,然后插入三条记录。最后,它会查询 `users` 表中的所有记录,并将它们打印出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值