作业:

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>