您的位置:首页 > 运维架构 > Linux

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 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, "帐号或密码错误");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: