Linux下通过c操作mysql(向数据库的表中存储图片并进行查询)

Linux下通过c操作mysql(向数据库的表中存储图片并进行查询)

一、通过c连接mysql

    /*定义一个mysql对象,便于后续操作确定要操作的数据库是哪一个*/
	MYSQL mysql;
	/*mysql_init初始化一个MYSQL对象,来连接mysql服务端。*/
    //非0值成功
    if(NULL==mysql_init(&mysql))
    {
    
    
        
        printf("mysql_init: %s\n",mysql_error(&mysql));
        return -1;
    }
    #define KING_DB_SERVER_IP "192.168.112.111"//主机地址
	#define KING_DB_SERVER_PORT 3306
	#define KING_DB_USERNAME "admin"  //用户名
	#define KING_DB_PASSWORD "123456" //密码
	#define KING_DB_DATABASE "DB_King" //数据库名
	/*mysql_real_connect连接数据库*/
    //非0值成功
	if(!mysql_real_connect(&mysql,KING_DB_SERVER_IP,KING_DB_USERNAME,KING_DB_PASSWORD,KING_DB_DATABASE,KING_DB_SERVER_PORT,NULL,0))
    {
    
    
        printf("mysql_real_connect: %s\n",mysql_error(&mysql));
    }

二、向mysql的表中插入数据

	#define SQL "insert into t_1(id,name) values(1,'as');"
	/*mysql_real_query用于执行mysql命令*/
	if(mysql_real_query(&mysql,SQL,strlen(SQL)))
    {
    
    
        printf("mysql_real_connect: %s\n",mysql_error(&mysql));
    }
    /*mysql_close关闭连接*/
    mysql_close(&mysql);

三、 查询mysql的表中的数据

/*查询表中数据的方法*/
int King_mysql_select(MYSQL *mysql)
{
    
    
	#define SQL_Select "select * from t_1;"
    //mysql_real_query-->SQL 使用sql语句
    if(mysql_real_query(mysql,SQL_Select,strlen(SQL_Select)))
    {
    
    
        printf("mysql_real_query: %s\n",mysql_error(mysql));
        return -1;
    }
    /*MYSQL_RES定义一个存储数据库检索信息结果的对象*/
    /*mysql_store_result获取mysql操作的检索结果*/
    //存储查询结果
    MYSQL_RES *res=mysql_store_result(mysql);
    if(res==NULL)
    {
    
    
        printf("mysql_store_result: %s\n",mysql_error(mysql));
        return -2;
    }
    /*mysql_num_rows获取结果集的行数*/
    /*mysql_num_fields获取结果集的字段数*/
    //判断结果的行和列
    int rows=mysql_num_rows(res); //数据结果的行数
    printf("rows:%d\n",rows);
    int fields=mysql_num_fields(res); //数据结果的列数
    printf("fields:%d\n",fields);
    //抓取数据
    /*MYSQL_ROW定义一个行对象,其内容含有一行的数据.*/
    /*mysql_fetch_row从结果集中获取下一行,结束返回NULL。*/
    MYSQL_ROW row;//行数组
    while((row=mysql_fetch_row(res)))
    {
    
    
        int i=0;
        for(i=0;i<fields;i++)
        {
    
    
            printf("%s\t",row[i]);
        }
        printf("\n");
    }
    //释放
    mysql_free_result(res);
    return 0;
}

三、向mysql的表中添加图片

//filename: path+ file name
//buffer: store image data
int read_image(char *filename,char *buffer)
{
    
    
    if(filename == NULL || buffer==NULL)
        return -1;
    FILE *fp=fopen(filename,"rb");
    if(fp==NULL)
    {
    
    
        printf("fopen failed\n");
        return -2;
    }
    //检测整个文件的大小length
    /*fseek用来移动文件流的读写位置*/
    /*ftell用来取得文件流目前的读写位置,调用成功时则返回目前的读写位置*/
    fseek(fp,0,SEEK_END);//将读写位置移动到文件末尾
    int length=ftell(fp); //文件偏移量file size
    fseek(fp,0,SEEK_SET);


    //读取
    /*fread*/
    int size=fread(buffer,1,length,fp);//读取fp的内容存在buffer
    if(size!=length)
    {
    
    
        printf("fread failed: %d\n",size);
        return -3;
    }
    fclose(fp);
    return size;
}

int write_image(char *filename,char *buffer,int length)
{
    
    
    if(filename==NULL || buffer==NULL || length<=0)
        return -1;
    
    FILE *fp=fopen(filename,"wb+");
    if(fp==NULL)
    {
    
    
        printf("fopen failed\n");
        return -2;
    }
    
    int size=fwrite(buffer,1,length,fp);//将buffer的内容写到fp中
    if(size!=length)
    {
    
    
        printf("fwrite failed: %d\n",size);
        return -3;
    }

    fclose(fp);
    return size;
}
//向数据库存储图片信息
int mysql_write(MYSQL *handle,char *buffer,int length)
{
    
    
    if(handle==NULL || buffer==NULL || length<=0)
        return -1;
    /*mysql_stmt_init创建MYSQL_STMT句柄*/
    MYSQL_STMT *stmt=mysql_stmt_init(handle); //数据存储,缓冲
    #define SQL_Insert "insert into t_1(id,name,u_img) values(2,'bs',?);"
    /*mysql_stmt_prepare准备字符串查询指向的SQL语句*/
    int ret=mysql_stmt_prepare(stmt,SQL_Insert,strlen(SQL_Insert));
    if(ret)
    {
    
    
        printf("mysql_stmt_prepare: %s\n",mysql_stmt_error(stmt));
        return -2;
    }
    //param跟stmt是一对一的
    MYSQL_BIND param={
    
    0};
    param.buffer_type=MYSQL_TYPE_LONG_BLOB;//buffer_type指明了与语句参数捆绑的值类型
    param.buffer=NULL;
    param.is_null=0;
    param.length=NULL;
    //绑定参数
    /*mysql_stmt_bind_param为SQL语句中的参数标记符绑定数据*/
    ret=mysql_stmt_bind_param(stmt,&param);
    if(ret)
    {
    
    
        printf("mysql_stmt_bind_param: %s\n",mysql_error(handle));
        return -3;
    }
    //数据到了mysql服务器的缓冲区
    /*mysql_stmt_send_long_data分段地(分块)将参数数据发送到服务器*/
    ret=mysql_stmt_send_long_data(stmt,0,buffer,length);
    if(ret)
    {
    
    
        printf("mysql_stmt_send_long_data: %s\n",mysql_error(handle));
        return -4;
    }
	/*mysql_stmt_execute将当前绑定的参数标记符的值发送到服务器*/
    ret=mysql_stmt_execute(stmt);
    if(ret)
    {
    
    
        printf("mysql_stmt_execute: %s\n",mysql_error(handle));
        return -5;
    }

    mysql_stmt_close(stmt);
    return 0;
}
//读取数据库的图片信息
int mysql_read(MYSQL *handle,char *buffer,int length)
{
    
    
    if(handle==NULL || buffer==NULL || length<=0)
    {
    
    
        return -1;
    }
    MYSQL_STMT *stmt=mysql_stmt_init(handle);
    /*#define SQL_Select_Img "select u_img from t_1 where id=2;"*/
    int ret=mysql_stmt_prepare(stmt,SQL_Select_Img,strlen(SQL_Select_Img));
    if(ret)
    {
    
    
        printf("mysql_stmt_prepare: %s\n",mysql_error(handle));
        return -2;
    }
    MYSQL_BIND result={
    
    0};
    result.buffer_type=MYSQL_TYPE_LONG_BLOB;
    unsigned long total_length=0;
    result.length=&total_length;
    //结果绑定
    /*将结果集中的列与数据缓冲和长度缓冲关联(绑定)起来*/
     ret=mysql_stmt_bind_result(stmt,&result);
    if(ret)
    {
    
    
        printf("mysql_stmt_bind_result: %s\n",mysql_error(handle));
        return -3;
    }
    mysql_stmt_execute(stmt);
    /*全部结果集进行缓冲处理时*/
    mysql_stmt_store_result(stmt);
    //将存的图片数据显示出来
    while(1)
    {
    
    
    	/*返回结果集中的下一行*/
        ret=mysql_stmt_fetch(stmt);
        if(ret!=0 && ret!=MYSQL_DATA_TRUNCATED) break;
        int start=0;
        while(start<(int)total_length)
        {
    
    
            result.buffer=buffer+start;
            result.buffer_length=1;
            /*从当前结果集行获取1列*/
            mysql_stmt_fetch_column(stmt,&result,0,start);
            start+=result.buffer_length;
        }  
    }
    mysql_stmt_close(stmt);
    return total_length;
}
int main()
{
    
    
	#define FILE_IMAGE_LENGTH (64*1024)
	//图片写进数据库里面去
    printf("case:mysql-->read_image and write mysql\n");
    char buffer[FILE_IMAGE_LENGTH]={
    
    0};
    int length=read_image("01.jpg",buffer);
    if(length<0) goto Exit;
    mysql_write(&mysql,buffer,length); //往数据库中写图片数据

    //将图片从数据库里面读出
    printf("case:mysql-->read_image and write mysql\n");
    memset(buffer,0,FILE_IMAGE_LENGTH);
    length=mysql_read(&mysql,buffer,FILE_IMAGE_LENGTH);
    write_image("a.jpg",buffer,length);
Exit:
    //释放
    mysql_close(&mysql);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_52259848/article/details/125172287