SQLITE3 函数接口

简述

sqlite3 接口的核心元素: 两大对象,八大函数;

其中两个对象指的是:

sqlite3 数据库连接对象
        数据库的连接句柄(数据库的文件描述符)  代表你打开的那个 sqlite3 的数据库文件,后序对数据库的操作都需要用到这个对象

sqlite3_stmt SQL 语句对象

        关系型数据库的标准的操作语言  我们操作数据库必须通过 SQL 语句

编程流程

1.建立连接
2.打开数据库
        sqlite3_open();//打开或者创建一个数据库,返回一个数据库的连接对象
3.操作数据库(必须通过 SQL 语句)
        //准备一条 sql 语句
                sqlite3_prepare_v2();
        //绑定参数
                sqlite3_bind_*();
        //执行准备好的 sql 语句
                sqlite3_step();
                sqlite3_column();
        //释放 sql 语句资源,销毁 sql 语句对象
                sqlite3_finalize();
        或
                sqlite3_exec()
4.关闭数据库
        sqlite3_close(); //关闭一个 sqlite3 数据库
备注 :在对 sqlite3 代码进行编译是,需要链接 sqlite3 库文件 -lsqlite3

打开或创建一个数据库函数(sqlite3_open)

【头文件】
#include <sqlite3.h>
【函数原型】
SQLITE_API int sqlite3_open(const char *filename,sqlite3 **ppDb);
【函数作用】
        该函数将打开名字为 filename 数据库文件,如果不存在则创建,打开后的文件使用数据库连接对象 ppDb 表示。
【参数含义】
        [filename]:数据库名字,可以是绝对路径,也可以是相对路径
        [ppDb]:sqlite3 类型的指针地址,用来操作数据库
【返回值】
        成功返回 SQLITE_OK
        失败返回其他一些宏,具体查看 sqlite3.h 文件描述( sqlite3 的代码注释率自称是非常高的
【示例】
sqlite3 * pDB = NULL; //用来表示你打开的数据库
//打开数据库
int ret = sqlite3_open(argv[1],&pDB);//打开或者创建一个数据库,返回一个数据库的连接对象
if(ret != SQLITE_OK)
{printf("open sqlite3 database error\n");return 0;
}

关闭数据库函数(sqlite3_close)

【头文件】
#include <sqlite3.h>
【函数原型】
SQLITE_API int sqlite3_close(sqlite3* ppDb);
【函数作用】
        关闭 ppDb 操作的数据库文件
【参数含义】
        [ppDb]:sqlite3 类型的指针,指向要关闭的数据库
【返回值】
        成功返回 SQLITE_OK
        失败返回其他一些宏
【示例】
//关闭数据库
sqlite3_close(pDB); //关闭一个 sqlite3 数据库

准备一条 SQL 语句对象(sqlite3_prepare_v2)

【头文件】
#include <sqlite3.h>
【函数原型】
SQLITE_API int sqlite3_prepare_v2(sqlite3 *db, /* 数据库句柄 */const char *zSql, /* SQL 语句,UTF-8 编码 */int nByte, /* zSql 的最大长度,以字节为单位。 */sqlite3_stmt **ppStmt, /* OUT:语句句柄 */const char **pzTail /* OUT:指向 zSql 中未使用部分的指针,一般给 NULL*/
);
【函数作用】
        为 db 指向的数据库准备一条 sql 语句,语句的字符形式使用 zSql 参数保存,转换后的 sql语句使用 ppStmt 保存。
【参数含义】
        [db]:数据库连接句柄
        [zSql]: 要执行的原始的 SQL 语句的字符串表示形式
        [nByte]:用来指定需要转换 zSql 的字节数,当为小于 0 的值时表示转换 zSql 字符串到‘\0’为 止,当为 0 时,表示不需要转换,当大于 0 时则转换相应的字节数
        [ppStmt]:转换后的 sql 语句对象。
        [db]: 指向元素 SQL 语句中未使用的部分,一般给 NULL
【返回值】
         成功返回 SQLITE_OK
        失败返回其他一些宏
【示例】
int num; //存放 ID
char name[20] = {0}; //存放 name
char Tel[20] = {0}; //存放电话号码
char sql[256] = {0}; //存放 sql 语句
memset(name,0,20);
memset(Tel,0,20);
scanf("%d%s%s",&num,name,Tel);
if(num == 0) //输入 0 结束
{break;
}
memset(sql,0,20);
sprintf(sql,"INSERT INTO STU VALUES(%d,'%s','%s');",num,name,Tel);
sqlite3_stmt *stmt = NULL;//指针,指向一条语句对象
ret = sqlite3_prepare_v2(pDB,sql,-1,&stmt,NULL); //准备一个语句对象
if(ret != SQLITE_OK)
{perror("sqlite3_prepare_v2 failed");sqlite3_close(pDB);return -1;
}

销毁 SQL 语句对象(sqlite3_finalize)

【头文件】
#include <sqlite3.h>
【函数原型】
SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt);
【函数作用】
        销毁 pStmt 指向的 SQL 语句对象。
【参数含义】
        [pStmt]:SQL 语句对象。
【返回值】
        成功返回 SQLITE_OK
        失败返回其他一些宏

执行一条 SQL 语句对象(sqlite3_step)

【头文件】
#include <sqlite3.h>
【函数原型】
SQLITE_API int sqlite3_step(sqlite3_stmt* pStmt);
【函数作用】
        执行一条 pStmt 语句对象
【参数含义】
        [pStmt]:SQL 语句对象。
【返回值】
        执行成功返回 SQLITE_DOME , 一旦执行成功后,sqlite3_step()就不应该被再次调用执行, 除非我们使用 sqlite3_reset()重置 sqlite3_stmt 数据。
        当我们的 sql 语句是 读命令,比如"SELECT* FROM...",返回的数据必然是很多行,而 sqlite3_step 调用每次只返回一行,并且函数返回值为 SQLITE_ROW ,所以我们也需要重复调用
sqlite3_step 函数,当所有参数返回完成后,sqlite3_step 返回 SQLITE_DONE. 失败返回其他一些宏
【示例】
//执行准备好的 sql 语句
ret = sqlite3_step(stmt);
if(ret == SQLITE_DONE)
{printf("sqlite3_step success\n");
}else
{printf("sqlite3_step failed,%d\n",ret);
}

普通编程流程示例

#include<stdio.h>
#include<sqlite3.h>
#include<stdlib.h>
#include<string.h>
int main(int argc, char const *argv[])
{sqlite3 * pDB = NULL; //用来表示表示你打开的数据库//打开数据库int ret = sqlite3_open("1.db",&pDB);//打开或者创建一个数据库,返回一个数据库的连接对象if(ret != SQLITE_OK){printf("open sqlite3 database error\n");return 0;}//准备一条 sql 语句对象,表的列有 ID,NAME,TELint num; //存放 IDchar name[20] = {0}; //存放 namechar Tel[20] = {0}; //存放电话号码char sql[256] = {0}; //存放 sql 语句while(1){//输入插入表中的数据memset(name,0,20);memset(Tel,0,20);scanf("%d%s%s",&num,name,Tel);if(num == 0) //输入 0 结束{break;}memset(sql,0,20);sprintf(sql,"INSERT INTO JIUYUE VALUES(%d,'%s','%s');",num,name,Tel);sqlite3_stmt *stmt = NULL;//指针,指向一条语句对象ret = sqlite3_prepare_v2(pDB,sql,-1,&stmt,NULL); //准备一个语句对象if(ret != SQLITE_OK){perror("sqlite3_prepare_v2 failed");sqlite3_close(pDB);return -1;}//执行准备好的 sql 语句ret = sqlite3_step(stmt);if(ret == SQLITE_DONE){printf("sqlite3_step success\n");}else{printf("sqlite3_step failed,%d\n",ret);}//释放 sql 语句资源,销毁 sql 语句对象sqlite3_finalize(stmt); }//关闭数据库sqlite3_close(pDB); //关闭一个 sqlite3 数据库return 0;
}

添加数据前表中内容:

执行函数后:

回调函数执行接口(sqlite3_exec)

【头文件】
#include <sqlite3.h>
【函数原型】
SQLITE_API int sqlite3_exec(sqlite3* ppDb, /* 数据库句柄 */const char *sql, /* SQL 语句 */int (*callback)(void*,int,char**,char**), /* 回调函数 */void *arg1, /* 回调的第一个参数 */char **errmsg /* 保存错误信息*/
);
【函数作用】
        执行 sql 语句,将一些处理给到回调函数去处理
【参数含义】
        [ppDb]:SQL 数据库句柄。 [sql] :SQL 语句字符串形式(可以包含多条命令,用;隔开)。
        [callback]:回调函数,通常用来做显示操作。
        [arg1]:传递给回调函数的第一个参数,可以是一些控制开关
        [errmsg]:用来保存错误信息。
【回调函数解释】
        回调函数的作用是执行我们需要的一些操作,常用的是用回调来打印我们的数据表,我们先来看看回调函数的参数
typedef int(*sqlite_callback)(void* para, int columenCount, char** columnValue, char**columnName);
        [para]:是通过 sqlite3_exec 函数传递过来的一个参数。
        [columenCount]:查询到的这一张表的列数
        [columenValue]:可以看作是一个保存了字符串的一维数组,保存了每条记录的内容
        [columenName]:保存列名
备注
        1.create,drop,insert,delete,update 这些操作的时候不会调用回调函数,也就是说只有查询操作会调用回调函数。
        2.回调函数不是只执行一次,而是执行 n 次,取决于 select 中产生了多少条结果,也就是需要显示多少列数据。
【返回值】
                执行成功返回 SQLITE_OK
                失败返回其他一些宏
【示例】
#include<stdio.h>
#include<sqlite3.h>
int my_callback(void* arg,int ncols,char*col_values[],char*col_names[])
{//打印表头int i;if(*((int *)arg) == 1){for(i = 0;i<ncols;i++) //打印表头{printf("%s\t",col_names[i]);}printf("\n");*((int *)arg) = 0; //表头只打印一次即可}//打印这一条记录的值for(i = 0;i<ncols;i++){printf("%s\t",col_values[i]); //打印表中一行数据}printf("\n");return 0;
}int main(int argc, char const *argv[])
{sqlite3 * pDB = NULL;//打开数据库int ret = sqlite3_open("1.db",&pDB);//打开或者创建一个数据库,返回一个数据库的连接对象if(ret != SQLITE_OK){printf("open sqlite3 database error\n");return 0;}const char *sql = "INSERT INTO JIUYUE VALUES(9,'lishi','17654329987');SELECT * FROM JIUYUE;";int flag = 1; //表头打印标志,为 1 打印,为 0 不打印char *ermsg = NULL; //用来保存出错信息ret = sqlite3_exec(pDB,sql,my_callback,(void *)&flag,&ermsg);if(ret != SQLITE_OK){printf("sqlite3_exec failed:%s\n",ermsg);}//关闭数据库sqlite3_close(pDB); //关闭一个 sqlite3 数据库return 0;
}
执行前表中内容:
执行后结果:

获取结果集的列数(sqlite3_column_count)

【头文件】
#include <sqlite3.h>
【函数原型】
SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt);
【函数作用】
        获取 pStmt 结果集中的列数
【参数含义】
        [pStmt]:SQL 语句对象。
【返回值】
        返回语句对象 select 结果集中的列数,没有则返回 0

获取表头信息(sqlite3_column_name)

【头文件】
#include <sqlite3.h>
【函数原型】
SQLITE_API const char *sqlite3_column_name(sqlite3_stmt *pStmt, int N);
【函数作用】
        获取第 N 列的列名
【参数含义】
        [pStmt]:SQL 语句对象。
        [N]:列序号
【返回值】
        成功返回列名字符串地址,失败返回 NULL
【示例】
//获取结果集的列数
int nCols = sqlite3_column_count(stmt);
int i = 0;
if(flag == 1)
{for(i = 0;i<nCols;i++) //打印一行记录的表头{printf("%s\t",sqlite3_column_name(stmt,i));}printf("\n");flag = 0;
}

获取指定列数据类型(sqlite3_column_type)

【头文件】
#include <sqlite3.h>
【函数原型】
SQLITE_API int sqlite3_column_type(sqlite3_stmt *pStmt, int iCol);
【函数作用】
        获取第 iCol 列数据的数据类型
【参数含义】
        [pStmt]:SQL 语句对象。
        [N]:列序号
【返回值】
        SQLITE_FLOAT:表示该列数据类型为浮点型
        SQLITE_INTEGER: 表示该列数据类型为整型
        SQLITE_TEXT: 表示该列数据类型为字符型
        SQLITE_BLOB: 表示该列数据类型为 bool
        SQLITE_NULL: 表示该列数据类型为空类型

获取指定列数据(sqlite3_column_类型名)

【头文件】
#include <sqlite3.h>
【函数原型】
SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol);SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);
SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);
【函数作用】
        获取第 iCol 列的数据元素
【参数含义】
        [pStmt]:SQL 语句对象。
        [N]:列序号
【返回值】
        返回相应类型的数据
【示例】
for(i = 0;i<nCols;i++) //打印一行记录的所有的列
{//获取结果行中第 i 列的类型int vtype = sqlite3_column_type(stmt,i);if(vtype == SQLITE_INTEGER) //如果当前列为整型{ int val = sqlite3_column_int(stmt,i);printf("%d\t",val);}else if(vtype == SQLITE_FLOAT) //如果当前列为浮点型{ double val = sqlite3_column_double(stmt,i);printf("%f\t",val);}else if(vtype == SQLITE_TEXT) //如果当前列为字符串{ const char *val = sqlite3_column_text(stmt,i);printf("%s\t",val);}else{printf("\t\t");}
}

采用 column 类函数打印表示例程序

#include<stdio.h>
#include<sqlite3.h>
int main(int argc, char const *argv[])
{sqlite3 * pDB = NULL;//打开数据库int ret = sqlite3_open("1.db",&pDB);//打开或者创建一个数据库,返回一个数据库的连接对象if(ret != SQLITE_OK){printf("open sqlite3 database error\n");return 0;}//准备一条 sql 语句对象sqlite3_stmt *stmt = NULL;//指针,指向一条语句对象const char *sql = "SELECT * FROM JIUYUE;";ret = sqlite3_prepare_v2(pDB, /* 数据库的连接句柄,打开的数据库对象 */sql, /* 要执行的原始的 SQL 语句 */-1, /*zSql 指向的 SQL 语句的长度 */&stmt, /* OUT:准备之后的 SQL 语句对象,把准备好的语句使用 ppstmt 指向它 */NULL /*指针,指向元素 SQL 语句中未使用的部分,一般给 NULL */); if(ret != SQLITE_OK){perror("sqlite3_prepare_v2 failed");sqlite3_close(pDB);return -1;}int r; int flag = 1; //表头打印标志,为 1 打印,为 0 不打印do{//3.执行 sql 语句,select 有多少条结果,就可以执行多少次语句r = sqlite3_step(stmt);if(r == SQLITE_DONE){printf("sqlite3_step success\n");break;}//打印 select 语句产生的结果集//获取结果集的列数int nCols = sqlite3_column_count(stmt);int i = 0;if(flag == 1){for(i = 0;i<nCols;i++) //打印一行记录的表头{printf("%s\t",sqlite3_column_name(stmt,i));}printf("\n");flag = 0;}for(i = 0;i<nCols;i++) //打印一行记录的所有的列{//获取结果行中第 i 列的类型int vtype = sqlite3_column_type(stmt,i);if(vtype == SQLITE_INTEGER) //如果当前列为整型{ int val = sqlite3_column_int(stmt,i);printf("%d\t",val);}else if(vtype == SQLITE_FLOAT) //如果当前列为浮点型{ double val = sqlite3_column_double(stmt,i);printf("%f\t",val);}else if(vtype == SQLITE_TEXT) //如果当前列为字符串{ const char *val = sqlite3_column_text(stmt,i);printf("%s\t",val);}else{printf("\t\t");}}printf("\n");} while (r == SQLITE_ROW);//表示 sqlite3_step 产生了一行数据//释放 sql 语句资源,销毁 sql 语句对象sqlite3_finalize(stmt);//关闭数据库sqlite3_close(pDB); //关闭一个 sqlite3 数据库return 0;
}

获取 SQL 语句索引值(sqlite3_bind_parameter_index)

【头文件】
#include <sqlite3.h>
【函数原型】
SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt * pStmt, const char *zName);
【函数作用】
        获取 pStmt 语句对象中 SQL 语句中名称为 zName 的索引值
【参数含义】
        [pStmt]:SQL 语句对象。
        [zName]:SQL 语句中的子字符串
【返回值】
        成功返回该子字符串的索引值,失败返回 0
【示例】
char *sql = "INSERT INTO STU(ID,NAME,TEL)VALUES(@ID,@NAME,@TEL);";
sqlite3_stmt *stmt = NULL;//指针,指向一条语句对象
ret = sqlite3_prepare_v2(pDB, /* 数据库的连接句柄,打开的数据库对象 */sql, /* 要执行的原始的 SQL 语句 */-1, /*zSql 指向的 SQL 语句的长度 */&stmt, /* OUT:准备之后的 SQL 语句对象,把准备好的语句使用 ppstmt 指向它 */NULL /*指针,指向元素 SQL 语句中未使用的部分,一般给 NULL */
); 
//1.获取 sql 语句中占位符的索引值
int var_index[3] = {0};//保存@ID,@NAME,@TEL 在语句对象中的索引值
var_index[0] = sqlite3_bind_parameter_index(stmt, "@ID");
var_index[1] = sqlite3_bind_parameter_index(stmt, "@NAME");
var_index[2] = sqlite3_bind_parameter_index(stmt, "@TEL");

绑定索引值(sqlite3_bind_类型名)

【头文件】
#include <sqlite3.h>
【函数原型】
//常用类型
SQLITE_API int sqlite3_bind_int(sqlite3_stmt*, int, int);
SQLITE_API int sqlite3_bind_text(sqlite3_stmt*,int,const char*,int,void(*)(void*));
SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double);
//其他类型
SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
SQLITE_API int sqlite3_bind_blob64(sqlite3_stmt*, int, const void*, sqlite3_uint64,void(*)(void*));
SQLITE_API int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64);
SQLITE_API int sqlite3_bind_null(sqlite3_stmt*, int);
SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*));
SQLITE_API int sqlite3_bind_text64(sqlite3_stmt*, int, const char*, sqlite3_uint64,void(*)(void*), unsigned char encoding);
SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);
SQLITE_API int sqlite3_bind_pointer(sqlite3_stmt*, int, void*, constchar*,void(*)(void*));
SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n);
SQLITE_API int sqlite3_bind_zeroblob64(sqlite3_stmt*, int, sqlite3_uint64);
【函数作用】
        绑定索引值为指定的值
【参数含义】
        [第一个参数]:SQL 语句对象。
        [第二个参数]:要绑定的索引值
        [第三个参数]:示要绑定的值
        [第四个参数]:表示第三个参数的字节大小
        [第五个参数]:BLOB 和字符串绑定后的析构函数,一般指定为 NULL
【返回值】
        成功返回 SQLITE_OK,失败返回其他宏值
【示例】
var_index[0] = sqlite3_bind_parameter_index(stmt, "@ID");
var_index[1] = sqlite3_bind_parameter_index(stmt, "@NAME");
var_index[2] = sqlite3_bind_parameter_index(stmt, "@TEL");
//2.给索引值绑定自己的值
sqlite3_bind_int(stmt,var_index[0],num);
sqlite3_bind_text(stmt,var_index[1],name,strlen(name),NULL);
sqlite3_bind_text(stmt,var_index[2],tel,strlen(tel),NULL);

复位操作(sqlite3_reset)

【头文件】
#include <sqlite3.h>
【函数原型】
SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt);
【函数作用】
        调用 sqlite3_reset()函数将 pStmt 语句对象重置到初始状态,准备重新执行。任何使用 sqlite3_bind_*() API 绑定值的 SQL 语句变量在重新绑定时都要重置绑定
【参数含义】
        [pStmt]:SQL 语句对象。
【返回值】
        成功返回 SQLITE_OK,失败返回其他宏值

采用绑定的方式从文件中添加数据到数据库程序示例

#include<stdio.h>
#include<sqlite3.h>
int main(int argc, char const *argv[])
{sqlite3 * pDB = NULL;//打开数据库int ret = sqlite3_open("1.db",&pDB);//打开或者创建一个数据库,返回一个数据库的连接对象if(ret != SQLITE_OK){printf("open sqlite3 database error\n");return 0;}//准备一条 sql 语句对象sqlite3_stmt *stmt = NULL;//指针,指向一条语句对象const char *sql = "INSERT INTO JIUYUE(ID,NAME,TEL)VALUES(@ID,@NAME,@TEL);";ret = sqlite3_prepare_v2(pDB, /* 数据库的连接句柄,打开的数据库对象 */sql, /* 要执行的原始的 SQL 语句 */-1, /*zSql 指向的 SQL 语句的长度 */&stmt, /* OUT:准备之后的 SQL 语句对象,把准备好的语句使用 ppstmt 指向它 */NULL /*指针,指向元素 SQL 语句中未使用的部分,一般给 NULL */); if(ret != SQLITE_OK){perror("sqlite3_prepare_v2 failed");sqlite3_close(pDB);return -1;}//打开文件FILE * fp = fopen("table.txt","r");if(fp == NULL) //打开失败{perror("fopen error");sqlite3_finalize(stmt); //打开失败,释放语句对象sqlite3_close(pDB); //关闭数据库return -1;}//获取 sql 语句中占位符的索引值int var_index[3] = {0};//保存@ID,@NAME,@TEL 在语句对象中的索引值var_index[0] = sqlite3_bind_parameter_index(stmt, "@ID");var_index[1] = sqlite3_bind_parameter_index(stmt, "@NAME");var_index[2] = sqlite3_bind_parameter_index(stmt, "@TEL");while (1){int num = 0; //保存 IDchar name[20] = {0}; //保存名字char tel[20] = {0}; //保存电话int r = fscanf(fp,"%d%s%s",&num,name,tel); //从文件中获取数据if(r!=3){if(feof(fp)) //如果文件读到末尾{fclose(fp); //关闭文件break;}continue;}//给索引值绑定自己的值sqlite3_bind_int(stmt,var_index[0],num);sqlite3_bind_text(stmt,var_index[1],name,strlen(name),NULL);sqlite3_bind_text(stmt,var_index[2],tel,strlen(tel),NULL);r = sqlite3_step(stmt);if(r == SQLITE_DONE){printf("sqlite3_step success\n");}else{printf("sqlite3_step failed,%d\n",ret);}//复位 sql 语句对象,方便下一轮的绑定sqlite3_reset(stmt);}//释放 sql 语句资源,销毁 sql 语句对象sqlite3_finalize(stmt);//关闭数据库sqlite3_close(pDB); //关闭一个 sqlite3 数据库return 0;
}
执行前表中数据
文件中数据
执行后:
  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/177209.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

本地模拟,服务器下载文件

题目要求&#xff1a; 编写客户端程序和服务器端程序客户端可以输入一个音乐 文件名&#xff0c;比如 美丽中国&#xff0c;服务端 收到音乐后&#xff0c;可以给客户端返回这个音乐文件&#xff0c;如果服务器没有这个文件&#xff0c;返回一个默认的音乐即可客户端收到文件后…

redis加入window服务及删除

1、命令redis-server.exe --service-install redis.windows.conf&#xff0c;在服务中可配置自动启动 删除redis服务&#xff0c;先停止redis服务运行&#xff0c;管理员cmd模式&#xff0c;sc delete "redis" ,

python捕获异常和scapy模块的利用

Python捕获异常 ​ 当程序运行时&#xff0c;因为遇到未知的错误而导致中止运行&#xff0c;便会出现Traceback 消息&#xff0c;打印异常。异常即是一个事件&#xff0c;该事件会在程序执行过程中发生&#xff0c;影响程序的正常执行。一般情况下&#xff0c;在Python 无法正…

node使用fs模块(四)—— 文件夹的使用(创建、读取、删除)

文章目录 前言一、文件的创建1.参数2.基本使用 二、文件的读取1.参数2.读取文件的基本使用3.读取文件的递归使用&#xff08;option中添加recursive为true&#xff09; 三、文件的删除1. 参数2. 基本使用&#xff08;删除文件夹&#xff09;3. 递归删除文件夹 前言 创建、读取…

Vue3.0 toRef toRefs :VCA模式

简介 作用&#xff1a; 创建一个ref对象&#xff0c;其value值指向另一个对象中的某个属性 语法&#xff1a; const name toRef(person, name) 应用&#xff1a; 要将响应式对象中的某个属性单独供应给外部使用时 扩展&#xff1a; toRefs与toRef功能一致&#xff0c;但可…

Java while 和do while 循环

循环是程序中的重要流程结构之一。循环语句能够使程序代码重复执行&#xff0c;适用于需要重复一段代码直到满足特定条件为止的情况。 所有流行的编程语言中都有循环语句。Java 中采用的循环语句与C语言中的循环语句相似&#xff0c;主要有 while、do-while 和 for。 另外 Ja…

LabVIEW开发双目立体系统猪重估算

LabVIEW开发双目立体系统猪重估算 动物的活重是各种研究中的重要参考&#xff0c;例如动物生长&#xff0c;饲料转化率&#xff0c;健康状况和疾病发生。生长中的动物的体重为保持它们处于适当的营养和环境水平提供了一个有价值的参数或指标。动物的利润通常与收入和成本之间的…

idea集成测试插件替代postman

idea集成测试插件替代postman 兄弟萌&#xff0c;你再测试接口是否无bug是否流畅的时候是否还在使用“postman”来回切换进行测试呢&#xff1f; 页面切换进行测试&#xff0c;有没有感觉很麻烦呢&#xff1f; 打开postman&#xff0c;输入接口地址&#xff0c;有没有感觉很麻烦…

《AI时代架构师修炼之道:ChatGPT让架构师插上翅膀》

本专注于帮助架构师在AI时代 实现晋级、提高效率的图书 书中介绍了如何使用 ChatGPT 来完成架构设计的各个环节 并通过实战案例展示了ChatGPT在实际架构设计中的应用方法 关键点 1.架构设计新模式&#xff1a;让架构设计更高效、更快捷、更完美。 2.全流程解析&#xff1a;涵盖…

利用Vue2实现印章徽章组件

需要实现的组件效果&#xff1a; 该组件有设置颜色、大小、旋转度数和文本内容功能。 一、组件实现代码 <template><divclass"first-ring"v-bind"getBindValue":class"getStampBadgeClass":style"{ transform: rotate(${rotate}…

Vray3.6 for SketchUp安装失败错误如何处理?

SketchUp这款软件是一个极受欢迎并且易于使用的3D软件&#xff0c;有很多朋友会通过Sketchup建模或是Sketchup渲染操作。 Sketchup 建模渲染来说&#xff0c;也是较简单的一款软件&#xff0c;今天小编聊的话题不是Sketchup怎样渲染的操作。 而是对于一些新手朋友提到的关于V…

Netty第一部

一、select和epoll原理分析 外设设备网卡、鼠标、键盘等通过总线写到内存中&#xff0c;中间就有DMA拷贝&#xff0c;操作系统怎么知道内存中有数据了&#xff0c;这就需要操作系统通过中断机制确定&#xff0c;如果有中断信号过来&#xff0c;cpu会首先打断用户程序执行&…

YOLO目标检测——安全帽佩戴检测数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;安全帽佩戴检测数据集可以用于实时检测工作人员是否按照要求佩戴了安全帽&#xff0c;以保障他们的安全数据集说明&#xff1a;安全帽佩戴检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;图片分为带头盔和没带头…

8种按钮设计的常见类型分享

按钮是UI界面的元素之一&#xff0c;可以本能地吸引游客并将其转化为买家。界面中的UI按钮类型包括&#xff1a;CTA按钮、幽灵按钮、下拉按钮、浮动操作按钮、汉堡包按钮、加号按钮、消耗品按钮、共享按钮。 号召性用语按钮 CTA&#xff08;呼叫语言&#xff09;按钮是一种交…

查看局域网内另外一个电脑屏幕

查看局域网内另外一个电脑屏幕是一个相对简单但实用的技术。在局域网中&#xff0c;我们可以使用远程桌面、网络发现和共享、软件等技术来实现这一目标。 今天重点讲解一下&#xff0c;如何通过域之盾软件来查看另一个电脑屏幕&#xff1a; 1、部署软件&#xff0c;安装提示一…

Python---字符串在计算机底层的存储形式---涉及索引下标

一个字符串&#xff0c;在计算机中&#xff0c;是先占用一个空间。 在计算机中&#xff0c;Python中的字符串属于序列结构。所以其底层存储占用一段连续的内存空间。 str1 abcdefg 结构原理图&#xff1a; 注意&#xff1a;索引下标从0开始。 索引下标 索引下标&#xff…

cocosCreator 调用wxAPI 及后台授权设置、获取用户昵称和头像

版本&#xff1a; 3.8.0 语言&#xff1a; TypeScript 环境&#xff1a; Mac 官方文档&#xff1a; 微信官方文档 - 开放能力 微信 API 小游戏环境 在cocosCreator的3.x版本项目开发中&#xff0c;TypeScript最终会被转换为JavaScript语言。 JavaScript的运行时调用的API…

c语言从入门到实战——函数

函数 前言1. 函数的概念2. 库函数2.1 标准库和头⽂件2.2 库函数的使用方法2.2.1 功能2.2.2 头文件包含2.2.3 实践2.2.4 库函数文档的一般格式 3. 自定义函数3.1 函数的语法形式3.2 函数的举例 4. 形参和实参4.1 实参4.2 形参4.3 实参和形参的关系 5. return 语句6. 数组做函数参…

基于jsp,ssm物流快递管理系统

开发工具&#xff1a;eclipse&#xff0c;jdk1.8 服务器&#xff1a;tomcat7.0 数据库&#xff1a;mysql5.7 技术&#xff1a; springspringMVCmybaitsEasyUI 项目包括用户前台和管理后台两部分&#xff0c;功能介绍如下&#xff1a; 一、用户(前台)功能&#xff1a; 用…

【嵌入式】HC32F07X CAN通讯配置和使用配置不同缓冲器以连续发送

一 背景说明 使用小华&#xff08;华大&#xff09;的MCU HC32F07X实现 CAN 通讯配置和使用 二 原理分析 【1】CAN原理说明&#xff08;参考文章《CAN通信详解》&#xff09;&#xff1a; CAN是控制器局域网络(Controller Area Network, CAN)的简称&#xff0c;是一种能够实现…