Linux下sqlite3基本指令之具体应用

整理一下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, "帐号或密码错误");
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮生卍流年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值