Sqlite3:增删改查

发布时间 2023-08-21 11:09:02作者: eiSouthBoy

条件介绍

1)已存在一个数据库AddressBook.db 以及 其中的一张表telephone

2)telephone表格式:

Name     TEXT     NOT NULL
PhoneNum CHAR(11) NOT NULL
Birthday TEXT
Nation   TEXT DEFAULT 'China'

insert

目的:新增两行记录

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <sqlite3.h>

int main(int argc, char **argv)
{
	sqlite3 *db = NULL;
	char *err_msg = NULL;
	int rc = 0;
	const char *database_name = "AddressBook.db";

	rc = sqlite3_open(database_name, &db);
	if (rc)
	{
		fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
		sqlite3_close(db);
		return 1;

	}
	char sql[512] = { 0 };
	snprintf(sql, sizeof(sql), "insert telephone(Name,PhoneNum,Birthday,Nation) value('ZhaoLiu','10015','1993-01-01 12:00:00','US');"
							   "insert telephone(Name,PhoneNum,Birthday,Nation) value('QianMing','10018','1994-01-01 12:00:00','UK');");
	rc = sqlite3_exec(db, sql, NULL, NULL, &err_msg);
	if (rc)
	{
		fprintf(stderr, "SQL error: %s\n", err_msg);
		sqlite3_free(err_msg);
		sqlite3_close(db);
		return 1;
	}
	sqlite3_close(db);
	return 0;
}

验证结果是否新增2行:

delete

目的:删除1行,这一行中 Name=QianMing

int main(int argc, char **argv)
{
	sqlite3 *db = NULL;
	char *err_msg = NULL;
	int rc = 0;
	const char *database_name = "AddressBook.db";

	rc = sqlite3_open(database_name, &db);
	if (rc)
	{
		fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
		sqlite3_close(db);
		return 1;

	}
	char sql[512] = { 0 };
	snprintf(sql, sizeof(sql), "delete from telephone where name='QianMing'");
	rc = sqlite3_exec(db, sql, NULL, NULL, &err_msg);
	if (rc)
	{
		fprintf(stderr, "SQL error: %s\n", err_msg);
		sqlite3_free(err_msg);
		sqlite3_close(db);
		return 1;
	}
	sqlite3_close(db);

	return 0;
}

验证是否删除成功:

update

目的:更改 WangWuBirthday1992-01-01 12:00:00

? 有一个小问题:表中没有设置主键,对于update or delete会有影响。不过本实例操作没有影响,毕竟只有三行不一样的数据

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <sqlite3.h>

int main(int argc, char **argv)
{
	sqlite3 *db = NULL;
	char *err_msg = NULL;
	int rc = 0;
	const char *database_name = "AddressBook.db";

	rc = sqlite3_open(database_name, &db);
	if (rc)
	{
		fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
		sqlite3_close(db);
		return 1;

	}
	char sql[512] = { 0 };
	snprintf(sql, sizeof(sql), "update telephone set Birthday='1992-01-01 12:00:00' where name='WangWu'");
	rc = sqlite3_exec(db, sql, NULL, NULL, &err_msg);
	if (rc)
	{
		fprintf(stderr, "SQL error: %s\n", err_msg);
		sqlite3_free(err_msg);
		sqlite3_close(db);
		return 1;
	}
	sqlite3_close(db);
	return 0;
}

验证是否修改成功:

select

目的:查询指定数据库中表的内容

方式一

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

/* 对于select查询结果集进行处理 */
int callback(void *NotUsed, int num_of_column, char **column_value, char **column_name)
{
	NotUsed = NULL;
	for (int i = 0; i < num_of_column; ++i)
	{
		printf("%s = %s\n", column_name[i], (column_value[i] ? column_value[i] : "NULL"));
	}
	printf("\n");
	return 0;
}

int main(int argc, char **argv)
{
	sqlite3 *db = NULL;
	char *err_msg = NULL;
	int rc = 0;
	const char *database_name = "AddressBook.db";

	rc = sqlite3_open(database_name, &db);
	if (rc)
	{
		fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
		sqlite3_close(db);
		return 1;

	}
	const char *sql_select = "select * from telephone;";
	rc = sqlite3_exec(db, sql_select, callback, NULL, &err_msg);
	if (rc != SQLITE_OK)
	{
		fprintf(stderr, "SQL error: %s\n", err_msg);
		sqlite3_free(err_msg);
		sqlite3_close(db);
		return 1;
	}

	sqlite3_close(db);
	return 0;
}

运行结果

方式二

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <sqlite3.h>

typedef struct
{
	char *name;
	char *phonenum;
	char *birthday;
	char *nation;
}PERSON_T;

typedef PERSON_T ELEMTYPE;

typedef struct LNODE_T
{
	ELEMTYPE data;
	struct LNODE_T *next;
}LNODE_T, *LINK_LIST_T;

static bool list_init(LINK_LIST_T *L)
{
	*L = (LNODE_T *)malloc(sizeof(LNODE_T)); // 带头结点的链表
	if (NULL == *L)
		return false;
	memset(*L, 0, sizeof(LNODE_T));
	(*L)->next = NULL;
	return true;
}

static void list_destroy(LINK_LIST_T *L)
{
	LNODE_T *temp = NULL;
	while (*L)
	{
		temp = *L;
		*L = (*L)->next;
		free(temp->data.name);
		free(temp->data.phonenum);
		free(temp->data.birthday);
		free(temp->data.nation);
		free(temp);
	}
}

static int list_create_r(LINK_LIST_T *L, ELEMTYPE elem)
{
	// 尾插法需要将指针移至最后一个结点
	LNODE_T *r = *L;
	while (r->next)
	{
		r = r->next;
	}
	LNODE_T *p = (LNODE_T *)malloc(sizeof(LNODE_T));
	memset(p, 0, sizeof(LNODE_T));
	p->data = elem;
	p->next = NULL;
	r->next = p;
	return 0;
}

static int list_traverse(LINK_LIST_T L)
{
	LNODE_T *p = NULL;
	for (p = L->next; p != NULL; p = p->next)
	{
		fprintf(stdout, "%-22s %-22s %-22s %-22s\n", p->data.name, p->data.phonenum, p->data.birthday, p->data.nation);
	}
	return 0;
}

static int get_column_type(sqlite3 *db, const char *sql, char name_arr[][128], int type_arr[], int *len)
{
	sqlite3_stmt *stmt = NULL;
	sqlite3_prepare(db, sql, -1, &stmt, NULL);
	if (stmt)
	{
		while (sqlite3_step(stmt) == SQLITE_ROW)
		{
			int num_of_col = sqlite3_column_count(stmt);
			*len = num_of_col;
			for (int i = 0; i < num_of_col; i++)
			{
				int type = sqlite3_column_type(stmt, i);
				const char *name = sqlite3_column_name(stmt, i);
				type_arr[i] = type;
				snprintf(name_arr[i], sizeof(name_arr[i]), "%s", name);
			}
		}
		sqlite3_finalize(stmt);
		stmt = NULL;
	}

	return 0;
}

int main(int argc, char **argv)
{
	sqlite3 *db = NULL;
	char *err_msg = NULL;
	int rc = 0;
	const char *database_name = "AddressBook.db";

	rc = sqlite3_open(database_name, &db);
	if (rc)
	{
		fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
		sqlite3_close(db);
		return 1;

	}

	/* 获取表头 */
	sqlite3_stmt *stmt = NULL;
	char sql[512] = {0};
	char name[50][128] = {0};
	int col_type[50] = {0}, len = 0;
	snprintf(sql, sizeof(sql), "select * from telephone limit 0,1;");
	get_column_type(db, sql, name, col_type, &len);

	/* 获取结果集 */
	snprintf(sql, sizeof(sql), "select * from telephone;");
	sqlite3_prepare(db, sql, -1, &stmt, NULL);
	LINK_LIST_T L;
	list_init(&L);
	if (stmt)
	{
		int byte = 0;
		int num_of_col = sqlite3_column_count(stmt);
		while (sqlite3_step(stmt) == SQLITE_ROW)
		{
			ELEMTYPE elem;
			byte = sqlite3_column_bytes(stmt, 0);
			if (byte)
			{
				elem.name = (char *)malloc((byte+1)*sizeof(char));
				memset(elem.name, 0, (byte + 1) * sizeof(char));
				char *name = (char *)sqlite3_column_text(stmt, 0);
				memcpy(elem.name, name, byte);
				;
			}
			byte = sqlite3_column_bytes(stmt, 1);
			if (byte)
			{
				elem.phonenum = (char *)malloc((byte + 1) * sizeof(char));
				memset(elem.phonenum, 0, (byte + 1) * sizeof(char));
				char *phonenum = (char *)sqlite3_column_text(stmt, 1);
				memcpy(elem.phonenum, phonenum, byte);
				;
			}
			byte = sqlite3_column_bytes(stmt, 2);
			if (byte)
			{
				elem.birthday = (char *)malloc((byte + 1) * sizeof(char));
				memset(elem.birthday, 0, (byte + 1) * sizeof(char));
				char *birthday = (char *)sqlite3_column_text(stmt, 2);
				memcpy(elem.birthday, birthday, byte);
				;
			}
			byte = sqlite3_column_bytes(stmt, 3);
			if (byte)
			{
				elem.nation = (char *)malloc((byte + 1) * sizeof(char));
				memset(elem.nation, 0, (byte + 1) * sizeof(char));
				char *nation = (char *)sqlite3_column_text(stmt, 3);
				memcpy(elem.nation, nation, byte);
				;
			}
			list_create_r(&L, elem);
		}
		sqlite3_finalize(stmt);
		stmt = NULL;
	}
	/* 打印结果集 */
	for (int i = 0; i < len; i++)
	{
		printf("%-22s ", name[i]);
	}
	printf("\n");
	list_traverse(L);
	list_destroy(&L);

	sqlite3_close(db);
	return 0;
}

运行结果: