Next 13 sqlite3 查找、网页

作业:

cs 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>

int main(int argc, char **argv)
{
    sqlite3 *db = NULL;
    // 1 打开数据库,获得数据的句柄(相当于linux 中的文件描述符)
    int ret = sqlite3_open("aaa.db", &db);
    if (SQLITE_OK != ret)
    {
        fprintf(stderr, "open db error  %s\n", sqlite3_errstr(ret));
        sqlite3_close(db);
        return 1;
    }
    char sql_cmd[1024] = {0};
    char *errmsg = NULL;

    // 创建表
    bzero(sql_cmd, sizeof(sql_cmd));
    strcpy(sql_cmd,
           "create table IF NOT EXISTS dict(id INTEGER PRIMARY KEY ASC,word "
           "char,mean text);");
    // 2 执行sql语句(对数据库的读写)
    ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
    if (SQLITE_OK != ret)
    {
        fprintf(stderr, "sqlite3_exec  sql_cmd:[%s] ,%s\n", sql_cmd, errmsg);
        sqlite3_free(errmsg);
        sqlite3_close(db);
        return 1;
    }

    bzero(sql_cmd, sizeof(sql_cmd));  // 清空表
    strcpy(sql_cmd, "delete from dict");
    ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
    if (SQLITE_OK != ret)
    {
        fprintf(stderr, "sqlite3_exec  sql_cmd:[%s] ,%s\n", sql_cmd, errmsg);
        sqlite3_free(errmsg);
        sqlite3_close(db);
        return 1;
    }

    bzero(sql_cmd, sizeof(sql_cmd));  // 为了提高效率,批量操作 ,开启事务
    strcpy(sql_cmd, "BEGIN TRANSACTION;");
    ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
    if (SQLITE_OK != ret)
    {
        fprintf(stderr, "sqlite3_exec  sql_cmd:[%s] ,%s\n", sql_cmd, errmsg);
        sqlite3_free(errmsg);
        sqlite3_close(db);
        return 1;
    }

    FILE *fp = fopen("/home/linux/dict.txt", "r");
    if (NULL == fp)
    {
        perror("fopen");
        return 1;
    }
    int i = 1;
    while (1)
    {
        char line_buf[1024] = {0};
        if (NULL == fgets(line_buf, sizeof(line_buf), fp))
        {
            break;
        }

        char *word = strtok(line_buf, " ");
        char *mean = strtok(NULL, "\r");

        bzero(sql_cmd, sizeof(sql_cmd));  // 清空表
        sprintf(sql_cmd, "insert into dict values(NULL,\"%s\",\"%s\");", word,
                mean);
        ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
        if (SQLITE_OK != ret)
        {
            fprintf(stderr, "sqlite3_exec  sql_cmd:[%s] ,%s\n", sql_cmd,
                    errmsg);
            sqlite3_free(errmsg);
            sqlite3_close(db);
            return 1;
        }
       // printf("num:%d\n", i++);
    }

    bzero(sql_cmd, sizeof(sql_cmd));  // 提交事务 ,相当于保存文件
    strcpy(sql_cmd, "COMMIT;");
    ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
    if (SQLITE_OK != ret)
    {
        fprintf(stderr, "sqlite3_exec  sql_cmd:[%s] ,%s\n", sql_cmd, errmsg);
        sqlite3_free(errmsg);
        sqlite3_close(db);
        return 1;
    }

    // 3. 关闭数据 释放资源
    sqlite3_close(db);

    return 0;
}

一、sqlite3编程数据库查询

当需要对数据库中的数据,进行查询的时候.

sqlite3_exec()中的回调函数(第三个参数)就不能为空了。

通过回调函数反馈查询到的结果。回调函数是用来返回结果。

如果结果集有5条记录,那么回调函数调用5次。

int show(void *arg,int col,char **result,char **title)

这个函数的的调用次数,由结果集决定。如果结果由10条,函数就会调用10次。

result参数每次都会执行对应的记录,如果有多条记录,数据库会分多次把数据传给result指针。
事务(Transaction)是以逻辑顺序完成的工作单位或序列,可以是由用户手动操作完成,也可以是由某种数据库程序自动完成

♥ 原子性(Atomicity) :确保工作单位内的所有操作都成功完成,否则,事务会在出现故障

时终止,之前的操作也会回滚到以前的状态。

♥ 一致性(consistency):确保数据库在成功提交的事务上正确地改变状态。

♥ 隔离性(Isolation) :使事务操作相互独立和透明。

♥ 持久性(Durability) :确保已提交事务的结果或效果在系统发生故障的情况下仍然存在

cs 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>
int flag = 0;

// arg sqlite3_exec 传递过来的参数
// col  结果集列数
// result查询到的结果
// title 标题
// 这个函数的的调用次数,由 结果集决定 。如果结果由10 条,函数就会调用10次。
// result 对指向对应一条记录。
int show(void *arg, int col, char **result, char **title)
{
    int i = 0;
    if (0 == flag)  //只需要输出一次
    {
        flag = 1;
        for (i = 0; i < col; i++)
        {
            printf("%s\t", title[i]);
        }
        printf("\n");
    }

    for (i = 0; i < col; i++)
    {
        printf("%s\t", result[i]);
    }
    printf("\n");
    // 一定加上,否则查询语句只会运行一次 return 0
    return 0;
}

int main(int argc, char **argv)
{
    sqlite3 *db = NULL;
    // 1 打开数据库,获得数据的句柄(相当于linux 中的文件描述符)
    int ret = sqlite3_open("aaa.db", &db);
    if (SQLITE_OK != ret)
    {
        fprintf(stderr, "open db error  %s\n", sqlite3_errstr(ret));
        sqlite3_close(db);
        return 1;
    }
    char *errmsg = NULL;
    char sql_cmd[512] = "select * from user where id =20;";
    // 2 执行sql语句(对数据库的读写)
    ret = sqlite3_exec(db, sql_cmd, show, NULL, &errmsg);
    if (SQLITE_OK != ret)
    {
        fprintf(stderr, "sqlite3_exec  sql_cmd:[%s] ,%s\n", sql_cmd, errmsg);
        sqlite3_free(errmsg);
        sqlite3_close(db);
        return 1;
    }
    // 3. 关闭数据 释放资源
    sqlite3_close(db);

    return 0;
}
cs 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>


// arg sqlite3_exec 传递过来的参数
// col  结果集列数
// result查询到的结果
// title 标题
// 这个函数的的调用次数,由 结果集决定 。如果结果由10 条,函数就会调用10次。
// result 对指向对应一条记录。
int show(void *arg, int col, char **result, char **title)
{
    *(int*)arg = 1;
    return 0;
}

int main(int argc, char **argv)
{
    sqlite3 *db = NULL;
    // 1 打开数据库,获得数据的句柄(相当于linux 中的文件描述符)
    int ret = sqlite3_open("aaa.db", &db);
    if (SQLITE_OK != ret)
    {
        fprintf(stderr, "open db error  %s\n", sqlite3_errstr(ret));
        sqlite3_close(db);
        return 1;
    }
    char username[50] = {0};
    char passwd[50] = {0};
    printf("user name:");
    fgets(username, sizeof(username), stdin);
    username[strlen(username) - 1] = '\0';

    printf("passwd:");
    fgets(passwd, sizeof(passwd), stdin);
    passwd[strlen(passwd) - 1] = '\0';
    int num = atoi(passwd);

    char *errmsg = NULL;
    char sql_cmd[512] = {0};
    int flag = 0; // 判断用户的账号和秘密是否正确的标志位
    sprintf(sql_cmd,"select * from user where name like '%s' and age = %d;",username,num);
    // 2 执行sql语句(对数据库的读写)
    ret = sqlite3_exec(db, sql_cmd, show, &flag, &errmsg);
    if (SQLITE_OK != ret)
    {
        fprintf(stderr, "sqlite3_exec  sql_cmd:[%s] ,%s\n", sql_cmd, errmsg);
        sqlite3_free(errmsg);
        sqlite3_close(db);
        return 1;
    }
    if(0 == flag)
    {
        printf("userpasswd name ,error\n");
    }
    else  
    {
        printf("userpaswd name correct\n");
    }
    // 3. 关闭数据 释放资源
    sqlite3_close(db);

    return 0;
}

这个示例中,有批量操作。如果没有开启事务。每条插入语句,都会先开启事务,插入结束后在关闭事务。会导致效率下降,插入数据速度非常慢。

解决方案:在批量插入前开启事务,插入结束后提交事务。提高插入的效率。

cs 复制代码
查字典
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>

int find_word(void*arg,int col,char**result,char**title)
{
    *(int*)arg = 1;
    printf("%s:%s\n",result[1],result[2]);
    return 0;
}

int main(int argc, char **argv)
{
    sqlite3 *db = NULL;
    // 1 打开数据库,获得数据的句柄(相当于linux 中的文件描述符)
    int ret = sqlite3_open("aaa.db", &db);
    if (SQLITE_OK != ret)
    {
        fprintf(stderr, "open db error  %s\n", sqlite3_errstr(ret));
        sqlite3_close(db);
        return 1;
    }
    char sql_cmd[1024] = {0};
    char *errmsg = NULL;

    // 创建表
    bzero(sql_cmd, sizeof(sql_cmd));
    strcpy(sql_cmd,
           "create table IF NOT EXISTS dict(id INTEGER PRIMARY KEY ASC,word "
           "char,mean text);");
    // 2 执行sql语句(对数据库的读写)
    ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
    if (SQLITE_OK != ret)
    {
        fprintf(stderr, "sqlite3_exec  sql_cmd:[%s] ,%s\n", sql_cmd, errmsg);
        sqlite3_free(errmsg);
        sqlite3_close(db);
        return 1;
    }

    bzero(sql_cmd, sizeof(sql_cmd));  // 清空表
    strcpy(sql_cmd, "delete from dict");
    ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
    if (SQLITE_OK != ret)
    {
        fprintf(stderr, "sqlite3_exec  sql_cmd:[%s] ,%s\n", sql_cmd, errmsg);
        sqlite3_free(errmsg);
        sqlite3_close(db);
        return 1;
    }

    bzero(sql_cmd, sizeof(sql_cmd));  // 为了提高效率,批量操作 ,开启事务
    strcpy(sql_cmd, "BEGIN TRANSACTION;");
    ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
    if (SQLITE_OK != ret)
    {
        fprintf(stderr, "sqlite3_exec  sql_cmd:[%s] ,%s\n", sql_cmd, errmsg);
        sqlite3_free(errmsg);
        sqlite3_close(db);
        return 1;
    }

    FILE *fp = fopen("/home/linux/dict.txt", "r");
    if (NULL == fp)
    {
        perror("fopen");
        return 1;
    }
    int i = 1;
    while (1)
    {
        char line_buf[1024] = {0};
        if (NULL == fgets(line_buf, sizeof(line_buf), fp))
        {
            break;
        }

        char *word = strtok(line_buf, " ");
        char *mean = strtok(NULL, "\r");

        bzero(sql_cmd, sizeof(sql_cmd));  // 清空表
        sprintf(sql_cmd, "insert into dict values(NULL,\"%s\",\"%s\");", word,
                mean);
        ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
        if (SQLITE_OK != ret)
        {
            fprintf(stderr, "sqlite3_exec  sql_cmd:[%s] ,%s\n", sql_cmd,
                    errmsg);
            sqlite3_free(errmsg);
            sqlite3_close(db);
            return 1;
        }
        // printf("num:%d\n", i++);
    }

    bzero(sql_cmd, sizeof(sql_cmd));  // 提交事务 ,相当于保存文件
    strcpy(sql_cmd, "COMMIT;");
    ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
    if (SQLITE_OK != ret)
    {
        fprintf(stderr, "sqlite3_exec  sql_cmd:[%s] ,%s\n", sql_cmd, errmsg);
        sqlite3_free(errmsg);
        sqlite3_close(db);
        return 1;
    }

    while (1)
    {
        printf("input word:");
        char word[50] = {0};
        fgets(word, sizeof(word), stdin);
        word[strlen(word) - 1] = '\0';
        if(0 == strcmp("#quit",word))
        {
            break;
        }
        int flag = 0 ;
        bzero(sql_cmd, sizeof(sql_cmd));  // 清空表
        sprintf(sql_cmd,"select * from dict where word like \"%s\";",word);
        ret = sqlite3_exec(db, sql_cmd, find_word,&flag , &errmsg);
        if (SQLITE_OK != ret)
        {
            fprintf(stderr, "sqlite3_exec  sql_cmd:[%s] ,%s\n", sql_cmd,
                    errmsg);
            sqlite3_free(errmsg);
            sqlite3_close(db);
            return 1;
        }
        if(0 == flag)
        {
           printf("can't find\n"); 
        }
    }
    // 3. 关闭数据 释放资源
    sqlite3_close(db);

    return 0;
}

二、网页设计

1.格式 dreamwave

<!DOCTYPE html>

<html >

<head>

<meta charset="utf-8">

<title>中文测试。。。。</title>

</head>

<body>

这里是测试body测试内容。。。

</body>

</html>
2.标签 在body内

<h1></h1>双标签 标题 ,加粗,换行 1-6 ---》小

<p></p> 双标签 段落,有换行功效

<hr> 单标签 左到右分割符

<!-- -->注释
4,文本元素属性

b元素 <b>内容</b>加粗

br换行 <br>如果是 p 标签中间有间隔

i元素,字体倾斜<i></i>

del元素删除文字<del></del>

strong强调一段文字,效果类似b标签

u元素,下划线<u></u>

small元素,超小字体<small></small>

sub下标<sub></sub>

sup上标<sup></sup>

相关推荐
像少年啦飞驰点、2 小时前
Java策略模式从入门到实战:小白也能看懂的设计模式指南
java·设计模式·策略模式·编程入门·小白教程
꯭ 瞎꯭扯꯭蛋꯭2 小时前
3万字80道Java基础经典面试题总结
java·开发语言
V1ncent Chen2 小时前
从零学SQL 04 MySQL Workbench用法简介
数据库·sql·mysql·数据分析
洛克大航海2 小时前
SQLite 的安装
数据库·sqlite
程序员Terry2 小时前
别再用 if-else 堆砌代码了!策略模式让你的代码优雅十倍
java·设计模式
what丶k2 小时前
深入浅出责任链模式:解耦流程的优雅设计之道
java·责任链模式
ZZZKKKRTSAE2 小时前
在rhel9中部署MySQL
数据库·mysql
未来之窗软件服务2 小时前
服务器运维(四十七)鸿蒙系统Mongoose服务器伪请求pseudo http —东方仙盟
java·运维·服务器·服务器运维·仙盟创梦ide·东方仙盟
SimonKing2 小时前
被AI编程折磨的苦不堪言:一边喊真香,一边想砸键盘
java·后端·程序员