Linux下sqlite3基本指令之具体应用
2018-01-02 16:23
429 查看
整理一下sqlite3数据库在文件中的操作用法(代码选自UDP网络聊天室):
创建(数据库文件)user.db文件
函数原型(打开):
int sqlite3_open(const char* fileName, sqlite3** ppDB);
函数功能:打开一个数据库;若该数据库文件不存在,则自动创建。打开或者创建数据库的命令会被缓存,直到这个数据库真正被调用的时候才会被执行。
输入参数:fileName,待打开的数据库文件名称,包括路径,以’\0’结尾; 特别说明:SQLite 支持内存数据库,内存方式存储使用文件名“:memory:”
输出参数:ppDB,返回打开的数据库句柄;
返回值:执行成功返回SQLITE_OK,否则返回其他值;
函数原型(执行):
int sqlite3_exec(sqlite3* pDB, const char sql, sqlite_callback callback, void*para, char* errMsg);
函数功能:编译和执行零个或多个SQL 语句,查询的结果返回给回调函数callback
语法注释:
[INTO]:一个可选的关键字,可以将它用在 INSERT 和目标表之间。
table_name:将要接收数据的表或 table 变量的名称。
(column_list):要在其中插入数据的一列或多列的列表。必须用圆括号将column_list括起来,并且用逗号进行分隔。
VALUES:引入要插入的数据值的列表。对于column_list(如果已指定)中或者表中的每个列,都必须有一个数据值。必须用圆括号将值列表括起来。如果 VALUES 列表中的值与表中列的顺序不相同,或者未包含表中所有列的值,那么必须使用column_list明确地指定存储每个传入值的列。
修改数据
Update <表名>
Set <列名>=<表达式>[{, <列名>=<表达式>}] Set 列名 表达式 [{, 列名 表达式 }] [Where <条件>]
sqlite3_get_table函数原型:
int sqlite3_get_table(sqlite3* pDB, const char sql,char *pResult, int rowCount,int * columnCount, char errMsg);
函数功能:执行SQL 语句,通过一维数组返回结果;一般用于数据记录查询
下面是聊天室注册和登录部分的代码:
创建(数据库文件)user.db文件
函数原型(打开):
int sqlite3_open(const char* fileName, sqlite3** ppDB);
函数功能:打开一个数据库;若该数据库文件不存在,则自动创建。打开或者创建数据库的命令会被缓存,直到这个数据库真正被调用的时候才会被执行。
输入参数:fileName,待打开的数据库文件名称,包括路径,以’\0’结尾; 特别说明:SQLite 支持内存数据库,内存方式存储使用文件名“:memory:”
输出参数:ppDB,返回打开的数据库句柄;
返回值:执行成功返回SQLITE_OK,否则返回其他值;
int ret; sqlite3 *ppdb = NULL; ret = sqlite3_open("user.db", &ppdb); if (ret != SQLITE_OK) { perror("sqlite3_open"); exit(1); }
函数原型(执行):
int sqlite3_exec(sqlite3* pDB, const char sql, sqlite_callback callback, void*para, char* errMsg);
函数功能:编译和执行零个或多个SQL 语句,查询的结果返回给回调函数callback
ret = sqlite3_exec(ppdb, "create table if not exists save_info(account text primary key, password text, nickname text, moto text, likes integer, vip text, qq_email text, administrator text, shut_up text);", NULL, NULL, NULL); if (ret != SQLITE_OK) { perror("sqlite3_exec_create_table"); exit(1); }
语法注释:
[INTO]:一个可选的关键字,可以将它用在 INSERT 和目标表之间。
table_name:将要接收数据的表或 table 变量的名称。
(column_list):要在其中插入数据的一列或多列的列表。必须用圆括号将column_list括起来,并且用逗号进行分隔。
VALUES:引入要插入的数据值的列表。对于column_list(如果已指定)中或者表中的每个列,都必须有一个数据值。必须用圆括号将值列表括起来。如果 VALUES 列表中的值与表中列的顺序不相同,或者未包含表中所有列的值,那么必须使用column_list明确地指定存储每个传入值的列。
sprintf(admin, "insert into save_info values('%s', '%s', '%s', '%s', '%d', '%s', '%s', '%s', '%s')", account, password, nickname, moto, likes, vip, qq_email, administrator, shut_up);//服务器启动后自行生成一个管理员帐号 ret = sqlite3_exec(ppdb, admin, NULL, NULL, NULL); if (ret != SQLITE_OK) { perror("sqlite3_exec_insert into"); exit(1); }
修改数据
Update <表名>
Set <列名>=<表达式>[{, <列名>=<表达式>}] Set 列名 表达式 [{, 列名 表达式 }] [Where <条件>]
sqlite3_get_table函数原型:
int sqlite3_get_table(sqlite3* pDB, const char sql,char *pResult, int rowCount,int * columnCount, char errMsg);
函数功能:执行SQL 语句,通过一维数组返回结果;一般用于数据记录查询
下面是聊天室注册和登录部分的代码:
void server_save_info(sqlite3 *ppdb, Userinfo *recvbuf, Userinfo *sendbuf)//注册 { int ret; char auff[1024]; sprintf(auff, "insert into save_info values('%s', '%s', '%s', '%s', '%d', '%s', '%s', '%s', '%s')", recvbuf->account, recvbuf->password, recvbuf->nickname, recvbuf->moto, recvbuf->likes, recvbuf->vip, recvbuf->qq_email, recvbuf->administrator, recvbuf->shut_up); ret = sqlite3_exec(ppdb, auff, NULL, NULL, NULL); if (ret != SQLITE_OK) { perror("sqlite3_exec"); strcpy(sendbuf->buf, "帐号已存在!"); } else { strcpy(sendbuf->buf, "注册成功!"); } } **dbresult[i]是从select出来的数据中寻找,从零开始数,数完第一行的列表名称后,下一行的数据才是要寻找的值** void server_login(sqlite3 *ppdb, Userinfo *recvbuf, Userinfo *sendbuf, Node **head, struct sockaddr_in *tmp_addr) //登录 { bzero(sendbuf, sizeof(*sendbuf)); char **dbresult = NULL; char *errmsg = NULL;//用来存储错误信息字符串 int nrow;//查询出多少记录(总行数) int ncolumn;//查询出来的记录有多少字段,(总列数) int ret, i; char cuff[1024]; sprintf(cuff, "select account, password, nickname, moto, likes, vip , administrator from save_info where account = '%s' and password = '%s'", recvbuf->account, recvbuf->password); ret = sqlite3_get_table(ppdb, cuff, &dbresult, &nrow, &ncolumn, &errmsg);//执行成功返回SQLITE_OK,否则返回其他值 if (ret != SQLITE_OK) { perror("sqlite3_get_table_server_login"); return; } if (1 == nrow) { Node *tmp = (*head)->next; while (tmp != (*head)) { if (!strcmp(tmp->nickname, dbresult[9])) { strcpy(sendbuf->buf, "该帐号已在其他地方登录!"); return; } tmp = tmp->next; } strcpy(sendbuf->buf, "登录成功!"); strcpy(sendbuf->nickname, dbresult[9]); strcpy(sendbuf->moto, dbresult[10]); sendbuf->likes = (*dbresult[11]) - 48; strcpy(sendbuf->vip, dbresult[12]); strcpy(sendbuf->administrator, dbresult[13]); Node *p = (Node *)malloc(sizeof(Node));//链表用来记录帐号是否已登录,登录的帐号接入链表 if (NULL == p) { printf("Malloc Failure !\n"); return; } p->client_addr.sin_family = tmp_addr->sin_family; p->client_addr.sin_port = tmp_addr->sin_port; p->client_addr.sin_addr.s_addr = tmp_addr->sin_addr.s_addr; strcpy(p->nickname, dbresult[9]); p->next = (*head)->next; (*head)->next = p;//循环链表; 记忆:head始终在最右边,新来的结点在最左边,head->next 始终指向p } else { strcpy(sendbuf->buf, "帐号或密码错误"); } }
相关文章推荐
- Linux下sqlite3基本指令
- Linux--基本指令
- linux-MySQL基本指令-增删改查
- sqlite 基本操作指令
- 在mipsel-linux平台上的编译应用SQLite-3.5.9
- 嵌入式成长轨迹16 【Linux应用编程强化阶段】【Linux下的C编程下】【Linux c基本应用】
- 一些linux的基本操作指令
- Linux 日常常用指令及应用小结
- Linux 常用基本指令
- Linux上iptables防火墙的基本应用教程
- linux 系统基本指令
- 关于sqlite3在linux系统的应用
- Android-SQLite3基本操作指令集合
- linux 下用户管理命令基本应用
- Linux 一些基本指令简单使用记录
- LINUX常用基本命令及应用技巧大全1
- Linux-05基本指令学习
- linux基本指令
- Linux应用软件安装基本方法
- android SQLite具体实例应用详解(SQLiteOpenHelper)