zoukankan      html  css  js  c++  java
  • 在Mysql中用 LONGBLOB 类型存储二进制数据

     

    //需要设置为你自己的

    //在DBMS中线要创建数据库test,table bintest,data字段数据类型用LONGBLOB即可测试

    //测试文件c:\\test.iso,你可以找任何一个文件修改为即可,我找的是一个exe程序,修改为test.iso而已

    //最大测试过加入文件大小为650M(一个正真的iso文件)

    //注意:还要修改my.ini文件中的max_allowed_packet字段,我设置的是
    //max_allowed_packet = 1024M

    //#define host "localhost" //mysql server
    //#define username "root"
    //#define password "674800"
    //#define database "test"
    //int port = 3306;

    // Mysql3.cpp : Defines the entry point for the console application.
    //

    #include "stdafx.h"

    #include <Winsock2.h>
    #include <mysql.h>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>

    #pragma comment(lib,"libmysql.lib")

    #define INSERT_QUERY "INSERT INTO bintest(id, data) VALUES(NULL, ?)"

    #define host "localhost" //mysql server
    #define username "root"
    #define password "674800"
    #define database "test"
    int port = 3306;

    int get_file_size(char *path, off_t *size)
    {
    struct stat file_stats;

    if(stat(path, &file_stats))
    return -1;

    *size = file_stats.st_size;
    return 0;
    }
    void test()
    {
    MYSQL_BIND bind[1];
    unsigned long length;


    char* pos = NULL;
    off_t size;
    FILE* fp;

    char* filename = "c:\\test.iso";
    if ((get_file_size(filename, &size)) == -1) //得到文件的大小
    {
    perror("get file size" );
    exit(1);
    }

    if ((pos = (char *)malloc(sizeof(char)*(size+1))) == NULL)
    {
    perror("malloc buf" );
    exit(1);
    }
    if ((fp = fopen(filename, "rb" )) == NULL) //读文件
    {
    perror("fopen file" );
    exit(1);
    }

    if ((fread(pos, 1, size, fp)) < 0) //读文件失败
    {
    perror("fread file" );
    exit(1);
    }

    MYSQL *mysql = mysql_init(NULL); //mysql 初始化
    if (!mysql)
    return;
    if (!mysql_real_connect(mysql,host,username,password,"test",port,NULL,0))//链接服务器
    {
    int ret = mysql_errno(mysql);
    mysql_close(mysql);
    return;
    }

    MYSQL_STMT *stmt = mysql_stmt_init(mysql);
    if (!stmt)
    {
    fprintf(stderr, " mysql_stmt_init(), out of memory\n");
    exit(0);
    }
    if (mysql_stmt_prepare(stmt, INSERT_QUERY, strlen(INSERT_QUERY)))
    {
    fprintf(stderr, "\n mysql_stmt_prepare(), INSERT failed");
    fprintf(stderr, "\n %s", mysql_stmt_error(stmt));
    exit(0);
    }
    memset(bind, 0, sizeof(bind));
    //bind[0].buffer_type= MYSQL_TYPE_STRING;
    //bind[0].buffer_type = MYSQL_TYPE_LONG;
    bind[0].buffer = pos;
    //bind[0].buffer_type = MYSQL_TYPE_TINY;
    bind[0].buffer_type = MYSQL_TYPE_BLOB;
    bind[0].length= &length;
    bind[0].is_null= 0;

    /* Bind the buffers */
    if (mysql_stmt_bind_param(stmt, bind))
    {
    fprintf(stderr, "\n param bind failed");
    fprintf(stderr, "\n %s", mysql_stmt_error(stmt));
    exit(0);
    }

    int rc =0;
    /* Supply data in chunks to server */
    if (mysql_stmt_send_long_data(stmt,0, pos, size))
    {
    fprintf(stderr, "\n send_long_data failed");
    fprintf(stderr, "\n %s", mysql_stmt_error(stmt));
    exit(0);
    }

    // pos += size;

    /* Supply the next piece of data */
    if (mysql_stmt_send_long_data(stmt,0, pos, size))
    {
    fprintf(stderr, "\n send_long_data failed");
    fprintf(stderr, "\n %s", mysql_stmt_error(stmt));
    exit(0);
    }

    /* Now, execute the query */
    if (mysql_stmt_execute(stmt))
    {
    fprintf(stderr, "\n mysql_stmt_execute failed");
    fprintf(stderr, "\n %s", mysql_stmt_error(stmt));
    exit(0);
    }
    }


    int main()
    {
    test();
    //sleep(1);
    return 0;
    }

  • 相关阅读:
    五种开源协议(GPL,LGPL,BSD,MIT,Apache)
    我想要做的编码机器人
    2017年前端框架、类库、工具大比拼
    Python实现好友全头像的拼接
    Python 中的闭包与装饰器
    Vuex2.0边学边记+两个小例子
    Vue.js写一个SPA登录页面的过程
    react与vue
    20行js代码制作网页刮刮乐
    css3动画详解
  • 原文地址:https://www.cnblogs.com/byfei/p/3112318.html
Copyright © 2011-2022 走看看