mysql++如何读取数据库中二进制字段?
急求一段通过mysql++读取数据库中二进制字段示例代码。
在线等,谢谢!请注意,是通过mysql++,不是用mysql的C API!

解决方案 »

  1.   

    http://www.cppblog.com/cxl82116/archive/2007/07/05/27450.html下载手册查一下看看
      

  2.   

    http://242877.blog.chinajavaworld.com/entry/4892/0/import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.sql.Blob;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
     
    public class TestQuery {
     
    /**
     * 测试从mysql读取二进制大字段,以jpg格式为例
     */
    public void testQuery() {
     
    // 1.create sql ;
    String sql = "select * from user where id = ?";
     
    // 2.get connection
    Connection conn = null;
     
    PreparedStatement psmt = null;
     
    // query result
    ResultSet rst = null;
     
    // the image
    Blob resume = null;
     
    // local file
    OutputStream os = null;
     
    // the image stream
    InputStream is = null;
     
    try {
     
    conn = JdbcHelper.getConnection();
     
    // 3.prepare sql
    psmt = conn.prepareStatement(sql);
     
    // 4.set params
    psmt.setLong(1, 8L);
     
    // 5.query db
    rst = psmt.executeQuery();
     
    // 6.
    // (1)get the image
    while (rst.next()) {
     
    resume = rst.getBlob("image");
    break;
    }
    // (2)get the stream
    is = resume.getBinaryStream();
     
    // (3)write to local file
    byte[] b = new byte[1024];
    int len = 0;
    os = new FileOutputStream("C:/xajh/2.jpg");
    while ((len = is.read(b)) != -1) {
    os.write(b, 0, len);
    }
     
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    // (4)close file stream
    try {
    if (os != null)
    os.close();
    if (is != null)
    is.close();
    } catch (IOException e1) {
    e1.printStackTrace();
    }
    // 7.close db
    try {
    if (psmt != null)
    psmt.close();
    if (conn != null)
    conn.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    }
     
    public static void main(String[] args) {
     
    TestQuery test = new TestQuery();
    test.testQuery();
    }
    }
      

  3.   

    mysqlbinlog:用于处理二进制日志文件的实用工具服务器生成的二进制日志文件写成二进制格式。要想检查这些文本格式的文件,应使用mysqlbinlog实用工具。应这样调用mysqlbinlog:shell> mysqlbinlog [options] log-files...例如,要想显示二进制日志binlog.000003的内容,使用下面的命令:shell> mysqlbinlog binlog.0000003输出包括在binlog.000003中包含的所有语句,以及其它信息例如每个语句花费的时间、客户发出的线程ID、发出线程时的时间戳等等。通常情况,可以使用mysqlbinlog直接读取二进制日志文件并将它们用于本地MySQL服务器。也可以使用--read-from-remote-server选项从远程服务器读取二进制日志。当读取远程二进制日志时,可以通过连接参数选项来指示如何连接服务器,但它们经常被忽略掉,除非你还指定了--read-from-remote-server选项。这些选项是--host、--password、--port、--protocol、--socket和--user。还可以使用mysqlbinlog来读取在复制过程中从服务器所写的中继日志文件。中继日志格式与二进制日志文件相同。在5.11.3节,“二进制日志”中详细讨论了二进制日志。mysqlbinlog支持下面的选项:·         ---help,-?显示帮助消息并退出。·         ---database=db_name,-d db_name只列出该数据库的条目(只用本地日志)。·         --force-read,-f使用该选项,如果mysqlbinlog读它不能识别的二进制日志事件,它会打印警告,忽略该事件并继续。没有该选项,如果mysqlbinlog读到此类事件则停止。·         --hexdump,-H在注释中显示日志的十六进制转储。该输出可以帮助复制过程中的调试。在MySQL 5.1.2中添加了该选项。·         --host=host_name,-h host_name获取给定主机上的MySQL服务器的二进制日志。·         --local-load=path,-l pat为指定目录中的LOAD DATA INFILE预处理本地临时文件。·         --offset=N,-o N跳过前N个条目。·         --password[=password],-p[password]当连接服务器时使用的密码。如果使用短选项形式(-p),选项和 密码之间不能有空格。如果在命令行中--password或-p选项后面没有 密码值,则提示输入一个密码。·         --port=port_num,-P port_num用于连接远程服务器的TCP/IP端口号。·         --position=N,-j N不赞成使用,应使用--start-position。·         --protocol={TCP | SOCKET | PIPE | -position使用的连接协议。·         --read-from-remote-server,-R从MySQL服务器读二进制日志。如果未给出该选项,任何连接参数选项将被忽略。这些选项是--host、--password、--port、--protocol、--socket和--user。·         --result-file=name, -r name将输出指向给定的文件。·         --short-form,-s只显示日志中包含的语句,不显示其它信息。·         --socket=path,-S path用于连接的套接字文件。·         --start-datetime=datetime从二进制日志中第1个日期时间等于或晚于datetime参量的事件开始读取。datetime值相对于运行mysqlbinlog的机器上的本地时区。该值格式应符合DATETIME或TIMESTAMP数据类型。例如:shell> mysqlbinlog --start-datetime="2004-12-25 11:25:56" binlog.000003该选项可以帮助点对点恢复。·         --stop-datetime=datetime从二进制日志中第1个日期时间等于或晚于datetime参量的事件起停止读。关于datetime值的描述参见--start-datetime选项。该选项可以帮助及时恢复。·         --start-position=N从二进制日志中第1个位置等于N参量时的事件开始读。·         --stop-position=N从二进制日志中第1个位置等于和大于N参量时的事件起停止读。·         --to-last-logs,-t在MySQL服务器中请求的二进制日志的结尾处不停止,而是继续打印直到最后一个二进制日志的结尾。如果将输出发送给同一台MySQL服务器,会导致无限循环。该选项要求--read-from-remote-server。·         --disable-logs-bin,-D禁用二进制日志。如果使用--to-last-logs选项将输出发送给同一台MySQL服务器,可以避免无限循环。该选项在崩溃恢复时也很有用,可以避免复制已经记录的语句。注释:该选项要求有SUPER权限。·         --user=user_name,-u user_name连接远程服务器时使用的MySQL用户名。·         --version,-V显示版本信息并退出。还可以使用--var_name=value选项设置下面的变量:·         open_files_limit指定要保留的打开的文件描述符的数量。可以将mysqlbinlog的输出传到mysql客户端以执行包含在二进制日志中的语句。如果你有一个旧的备份,该选项在崩溃恢复时也很有用(参见5.9.1节,“数据库备份”):shell> mysqlbinlog hostname-bin.000001 | mysql或:shell> mysqlbinlog hostname-bin.[0-9]* | mysql如果你需要先修改含语句的日志,还可以将mysqlbinlog的输出重新指向一个文本文件。(例如,想删除由于某种原因而不想执行的语句)。编辑好文件后,将它输入到mysql程序并执行它包含的语句。mysqlbinlog有一个--position选项,只打印那些在二进制日志中的偏移量大于或等于某个给定位置的语句(给出的位置必须匹配一个事件的开始)。它还有在看见给定日期和时间的事件后停止或启动的选项。这样可以使用--stop-datetime选项进行点对点恢复(例如,能够说“将数据库前滚动到今天10:30 AM的位置”)。如果MySQL服务器上有多个要执行的二进制日志,安全的方法是在一个连接中处理它们。下面是一个说明什么是不安全的例子:shell> mysqlbinlog hostname-bin.000001 | mysql # DANGER!!shell> mysqlbinlog hostname-bin.000002 | mysql # DANGER!!使用与服务器的不同连接来处理二进制日志时,如果第1个日志文件包含一个CREATE TEMPORARY TABLE语句,第2个日志包含一个使用该临时表的语句,则会造成问题。当第1个mysql进程结束时,服务器撤销临时表。当第2个mysql进程想使用该表时,服务器报告 “不知道该表”。要想避免此类问题,使用一个连接来执行想要处理的所有二进制日志中的内容。下面提供了一种方法:shell> mysqlbinlog hostname-bin.000001 hostname-bin.000002 | mysql
      

  4.   

    另一个方法是:shell> mysqlbinlog hostname-bin.000001 >  /tmp/statements.sqlshell> mysqlbinlog hostname-bin.000002 >> /tmp/statements.sqlshell> mysql -e "source /tmp/statements.sql"mysqlbinlog产生的输出可以不需要原数据文件即可重新生成一个LOAD DATA INFILE操作。mysqlbinlog将数据复制到一个临时文件并写一个引用该文件的LOAD DATA LOCAL INFILE语句。由系统确定写入这些文件的目录的默认位置。要想显式指定一个目录,使用--local-load选项。因为mysqlbinlog可以将LOAD DATA INFILE语句转换为LOAD DATA LOCAL INFILE语句(也就是说,它添加了LOCAL),用于处理语句的客户端和服务器必须配置为允许LOCAL操作。参见5.6.4节,“LOAD DATA LOCAL安全问题”。警告:为LOAD DATA LOCAL语句创建的临时文件不会自动删除,因为在实际执行完那些语句前需要它们。不再需要语句日志后应自己删除临时文件。文件位于临时文件目录中,文件名类似original_file_name-#-#。--hexdump选项可以在注释中产生日志内容的十六进制转储:shell> mysqlbinlog --hexdump master-bin.000001上述命令的输出应类似:/*!40019 SET @@session.max_insert_delayed_threads=0*/;/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;# at 4#051024 17:24:13 server id 1  end_log_pos 98# Position  Timestamp   Type   Master ID        Size      Master Pos    Flags# 00000004 9d fc 5c 43   0f   01 00 00 00   5e 00 00 00   62 00 00 00   00 00# 00000017 04 00 35 2e 30 2e 31 35  2d 64 65 62 75 67 2d 6c |..5.0.15.debug.l|# 00000027 6f 67 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |og..............|# 00000037 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................|# 00000047 00 00 00 00 9d fc 5c 43  13 38 0d 00 08 00 12 00 |.......C.8......|# 00000057 04 04 04 04 12 00 00 4b  00 04 1a                |.......K...|#       Start: binlog v 4, server v 5.0.15-debug-log created 051024 17:24:13#       at startupROLLBACK;十六进制转储的输出包含下面的元素:·         Position: The byte position within the log file.·         Timestamp: The event timestamp. In the example just shown, '9d fc 5c 43' is the representation of '051024 17:24:13' in hexadecimal.·         Type: The type of the log event. '0f' means that the example event is a FORMAT_DESCRIPTION_EVENT. The types are:·                00  UNKNOWN_EVENT·                    This event should never be present in the log.·                01  START_EVENT_V3·                    This indicates the start of a log file written by MySQL 4 or earlier.·                02  QUERY_EVENT·                    The most common type of events.  These contain queries executed·                    on the master.·                03  STOP_EVENT·                    Indicates that master has stopped.·                04  ROTATE_EVENT·                    Written when the master switches to a new log file.·                05  INTVAR_EVENT·                    Used mainly for AUTO_INCREMENT values and if the LAST_INSERT_ID()·                    function is used in the statement.·                06  LOAD_EVENT·                    Used for LOAD DATA INFILE in MySQL 3.23.·                07  SLAVE_EVENT·                    Reserved for future use.·                08  CREATE_FILE_EVENT·                    Used for LOAD DATA INFILE statements.  This indicates the start·                    of execution of such a statement.  A temporary file is created·                    on the slave.  Used in MySQL 4 only.·                09  APPEND_BLOCK_EVENT·                    Contains data for use in a LOAD DATA INFILE statement.  The·                    data is stored in the temporary file on the slave.·                0a  EXEC_LOAD_EVENT·                    Used for LOAD DATA INFILE statements.  The contents of the·                    temporary file is stored in the table on the slave.·                    Used in MySQL 4 only.·                0b  DELETE_FILE_EVENT·                    Rollback of LOAD DATA INFILE statement.  The temporary file·                    should be deleted on slave.·                0c  NEW_LOAD_EVENT·                    Used for LOAD DATA INFILE in MySQL 4 and earlier.·                0d  RAND_EVENT·                    Used to send information about random values if the RAND()·                    function is used in the query.·                0e  USER_VAR_EVENT·                    Used to replicate user variables.·                0f  FORMAT_DESCRIPTION_EVENT·                    This indicates the start of a log file written by MySQL 5 or later.·                10  XID_EVENT·                    Event indicating commit of XA transaction·                11  BEGIN_LOAD_QUERY_EVENT·                    Used for LOAD DATA statements in MySQL 5 and later.·                12  EXECUTE_LOAD_QUERY_EVENT·                    Used for LOAD DATA statements in MySQL 5 and later.·                13  TABLE_MAP_EVENT·                    Reserved for future use·                14  WRITE_ROWS_EVENT·                    Reserved for future use·                15  UPDATE_ROWS_EVENT·                    Reserved for future use·                16  DELETE_ROWS_EVENT·                    Reserved for future use·         Master ID: The server id of the master that created the event.·         Size: The size in bytes of the event.·         Master Pos: The position of the event in the original master log file.·         Flags: 16 flags.·                01  LOG_EVENT_BINLOG_IN_USE_F·                    Log file correctly closed (Used only in FORMAT_DESCRIPTION_EVENT)·                    If this flag is set (if the flags are e.g. '01 00') in an·                    FORMAT_DESCRIPTION_EVENT, then the log file has not been·                    properly closed.  Most probably because of a master crash (for·                    example, due to power failure).·                02  Reserved for future use.·                04  LOG_EVENT_THREAD_SPECIFIC_F·                    Set if the event is dependent on the connection it was·                    executed in (example '04 00'), e.g. if the event uses·                    temporary tables.·                08  LOG_EVENT_SUPPRESS_USE_F·                    Set in some circumstances when the event is not dependent on·                    the current database其它标志保留用于将来使用。在以后的版本中十六进制转储输出的格式可能会改变。
    你试试!
      

  5.   

    mysql++ ? 啥东东?没用过。
      

  6.   

    /*插入数据图片*/#include <stdio.h>
    #include <stdlib.h>
    #include <mysql/mysql.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/stat.h>/*把文件读入内存,成功返回长度,不成功返回-1*/
    int GetFile(const char *p_szFileName, char *p_buff)
    {
        struct stat l_stat;
        FILE *ifp;
        memset(&l_stat, 0, sizeof(struct stat));    if (stat(p_szFileName, &l_stat) ==  - 1)
        {
            return  - 1;
        }     ifp = fopen(p_szFileName, "rb");    if (ifp == NULL)
        {
            return  - 1;
        }
        if (fread(p_buff, l_stat.st_size, 1, ifp) < 1)
        {
            fclose(ifp);
            return  - 1;
        }    fclose(ifp);
        return l_stat.st_size;
    }/*把文件从内存写入硬盘,成功返回0,不成功返回-1*/
    int WriteFile(const char *p_szFileName, const char *p_buff, const int p_iSize, int flag = 1)
    {
        int ret;
        FILE *fp;    ret = access(p_szFileName, F_OK);
        if (ret == 0 && flag != 1)
        {
            return  - 1;
        }    if ((fp = fopen(p_szFileName, "wb")) == NULL)
        {
            return  - 1;
        }    if (fwrite(p_buff, p_iSize, 1, fp) < 1)
        {
            fclose(fp);
            unlink(p_szFileName);
            return  - 1;
        }    fclose(fp);
        return 0;
    }//-------------------------------------------------------------------------
    //
    //-------------------------------------------------------------------------int main()
    {
        MYSQL my_con;
        MYSQL_STMT *stmt;
        MYSQL_BIND bind;
        char l_buff[1024 *1024];
        int l_errno;
        char l_sql[1024];
        unsigned long l_flen;    if (mysql_init(&my_con) == NULL)
        {
            fprintf(stderr, "No enough memory!\n");
            return EXIT_FAILURE;
        }    if (mysql_real_connect(&my_con, "192.168.33.66", "root", "xxxxxx", "test", 3306, NULL, 0) == NULL)
        {
            fprintf(stderr, "Connection failed\n");
            if ((l_errno = mysql_errno(&my_con)) != 0)
            {
                fprintf(stderr, "Connection:\t<%d>\t%s\n", l_errno, mysql_error(&my_con));
            }
            return EXIT_FAILURE;
        }
        mysql_query(&my_con, "SET NAMES GBK");
        memset(l_sql, 0, sizeof(l_sql));
        sprintf(l_sql, "INSERT INTO PERSON VALUES(6, '我爱北京喆汎袆祎', ?, 'F', 23)");    stmt = mysql_stmt_init(&my_con);    if (stmt == NULL)
        {
            goto err_exit;
        }    if (mysql_stmt_prepare(stmt, l_sql, strlen(l_sql)) != 0)
        {
            fprintf(stderr, "mysql_stmt_prepare failed!\n");
            goto stmt_exit;
        }    l_flen = GetFile("./6.jpg", l_buff);
        if (l_flen ==  - 1)
        {
            fprintf(stderr, "Read file error!\n");
            mysql_stmt_close(stmt);
            mysql_close(&my_con);
            return EXIT_FAILURE;
        }    memset(&bind, 0, sizeof(MYSQL_BIND));
        bind.buffer_type = MYSQL_TYPE_BLOB;
        bind.buffer_length = sizeof(l_buff);
        bind.is_null = 0;
        bind.length = &l_flen;
        bind.buffer = l_buff;    if (mysql_stmt_bind_param(stmt, &bind) != 0)
        {
            fprintf(stderr, "BIND ERROR!\n");
            goto stmt_exit;
        }
        fprintf(stdout, "%d\n", l_flen);
        if (mysql_stmt_execute(stmt) != 0)
        {
            fprintf(stderr, "EXECUTE ERROR!\n");
            goto stmt_exit;
        }    mysql_stmt_close(stmt);
        mysql_close(&my_con);
        return EXIT_SUCCESS;    stmt_exit: fprintf(stderr, "%s\n", mysql_stmt_error(stmt));
        mysql_stmt_close(stmt);
        err_exit: mysql_close(&my_con);
        return EXIT_FAILURE;
    }
      

  7.   

    /*检索图片*/#include <stdio.h>
    #include <stdlib.h>
    #include <mysql/mysql.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/stat.h>
    #include <sys/types.h>/*把文件读入内存,成功返回长度,不成功返回-1*/
    int GetFile(const char *p_szFileName, char *p_buff)
    {
        struct stat l_stat;
        FILE *ifp;
        memset(&l_stat, 0, sizeof(struct stat));    if (stat(p_szFileName, &l_stat) ==  - 1)
        {
            return  - 1;
        }     ifp = fopen(p_szFileName, "rb");    if (ifp == NULL)
        {
            return  - 1;
        }
        if (fread(p_buff, l_stat.st_size, 1, ifp) < 1)
        {
            fclose(ifp);
            return  - 1;
        }    fclose(ifp);
        return l_stat.st_size;
    }/*把文件从内存写入硬盘,成功返回0,不成功返回-1,flag=1覆盖*/
    int WriteFile(const char *p_szFileName, const char *p_buff, const int p_iSize, int flag = 1)
    {
        int ret;
        FILE *fp;    ret = access(p_szFileName, F_OK);
        if (ret == 0 && flag != 1)
        {
            return  - 1;
        }    if ((fp = fopen(p_szFileName, "wb")) == NULL)
        {
            return  - 1;
        }    if (fwrite(p_buff, p_iSize, 1, fp) < 1)
        {
            fclose(fp);
            unlink(p_szFileName);
            return  - 1;
        }    fclose(fp);
        return 0;
    }//-------------------------------------------------------------------------
    //
    //-------------------------------------------------------------------------
    int main()
    {
        MYSQL my_con;
        MYSQL_STMT *stmt;
        MYSQL_BIND bind;
        MYSQL_RES *res;
        unsigned long paranum;
        char l_sql[1024];
        char l_picbuff[1024 *1024];
        my_bool is_null;
        unsigned long l_piclen;
        int row;
        char l_picname[20];
        int l_errno;    /*初始化mysql库*/
        if (mysql_init(&my_con) == NULL)
        {
            fprintf(stderr, "No enough memory!\n");
            return EXIT_FAILURE;
        }    /*连接数据库*/
        if (mysql_real_connect(&my_con, "192.168.33.66", "root", "xxxxxx", "test", 3306, NULL, 0) == NULL)
        {
            fprintf(stderr, "Connection failed\n");
            if ((l_errno = mysql_errno(&my_con)) != 0)
            {
                fprintf(stderr, "Connection:\t<%d>\t%s\n", l_errno, mysql_error(&my_con));
            }
            return EXIT_FAILURE;
        }
        /*填充查询语句*/
        memset(l_sql, 0, sizeof(l_sql));
        snprintf(l_sql, sizeof(l_sql) - 1, "select picture from PERSON");    if ((stmt = mysql_stmt_init(&my_con)) == NULL)
        {
            fprintf(stderr, "mysql_stmt_init out of memory!\n");
            goto err_exit;
        }    if (mysql_stmt_prepare(stmt, l_sql, strlen(l_sql)))
        {
            fprintf(stderr, "mysql_stmt_prepare(), SELECT failed\n");
            goto stmt_exit;
        }    if ((paranum = mysql_stmt_param_count(stmt)) != 0)
        {
            fprintf(stderr, "mysql_stmt_param_count() failed!\n");
            goto stmt_exit;
        }    if ((res = mysql_stmt_result_metadata(stmt)) == NULL)
        {
            fprintf(stderr, "mysql_stmt_result_metadata() failed!\n");
            goto stmt_exit;
        }    if (mysql_stmt_execute(stmt) != 0)
        {
            fprintf(stderr, "mysql_stmt_execute() failed!\n");
            mysql_free_result(res);
            goto stmt_exit;
        }    memset(&bind, 0, sizeof(MYSQL_BIND));    bind.buffer_type = MYSQL_TYPE_BLOB;
        bind.buffer = l_picbuff;
        bind.buffer_length = sizeof(l_picbuff);
        bind.is_null = &is_null;
        bind.length = &l_piclen;    if (mysql_stmt_bind_result(stmt, &bind))
        {
            fprintf(stderr, "mysql_stmt_bind_result() failed\n");
            mysql_free_result(res);
            goto stmt_exit;
        }    if (mysql_stmt_store_result(stmt))
        {
            fprintf(stderr, "mysql_stmt_store_result() failed\n");
            mysql_free_result(res);
            goto stmt_exit;
        }
        row = 0;
        while (!mysql_stmt_fetch(stmt))
        {
            row++;
            fprintf(stdout, "test_%d.jpg\n", row);
            if (!is_null)
            {
                memset(l_picname, 0, sizeof(l_picname));
                sprintf(l_picname, "./test_%02d.jpg", row);            if (WriteFile(l_picname, l_picbuff, l_piclen) ==  - 1)
                {
                    fprintf(stderr, "WriteFile failed!\n");
                    mysql_free_result(res);
                    mysql_stmt_close(stmt);
                    mysql_close(&my_con);
                    return EXIT_FAILURE;
                }
            }
            else
            {
                fprintf(stdout, "The %d picture is null\n", row);
            }
        }    mysql_free_result(res);
        mysql_stmt_close(stmt);
        mysql_close(&my_con);
        return EXIT_SUCCESS;    stmt_exit: fprintf(stderr, "%s\n", mysql_stmt_error(stmt));
        mysql_stmt_close(stmt);
        err_exit: mysql_close(&my_con);
        return EXIT_FAILURE;
    }