代码之家  ›  专栏  ›  技术社区  ›  Thomas Matthews

MySql Connector prepared语句只传输64字节

  •  1
  • Thomas Matthews  · 技术社区  · 14 年前

    我对示例的研究表明,不需要迭代,并且示例假定准备好的语句加载整个文件。这是我的密码:

    std::string         statement_text("INSERT INTO ");
    statement_text += "picture_image_data";
    statement_text += " (";
    statement_text += "ID_Picture";
    statement_text += ", ";
    statement_text += "Image_Data";
    statement_text += ") VALUES (?, ?)";    
    wxLogDebug("Creating prepared statement using:\n%s\n", statement_text.c_str());
    std::string filename("my_image.jpg");
    Ptr_Db_Connection                           db_conn(db_mgr.get_db_connection());
    boost::shared_ptr<sql::PreparedStatement>   prepared_statement(db_conn->prepareStatement(statement_text));
    prepared_statement->setInt(1, picture_id);
    std::ifstream   blob_file(filename.c_str());
    prepared_statement->setBlob(2, &blob_file);
    prepared_statement->execute();
    blob_file.close();
    

    以下是表的架构:

    mysql> describe picture_image_data;
    +------------+------------------+------+-----+---------+----------------+
    | Field      | Type             | Null | Key | Default | Extra          |
    +------------+------------------+------+-----+---------+----------------+
    | ID_Picture | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
    | Image_Data | mediumblob       | YES  |     | NULL    |                |
    +------------+------------------+------+-----+---------+----------------+
    2 rows in set (0.00 sec)
    

    mysql> select ID_Picture, LENGTH(image_data)
        -> FROM picture_image_data
        -> where ID_Picture = 1;
    +------------+--------------------+
    | ID_Picture | LENGTH(image_data) |
    +------------+--------------------+
    |          1 |                 65 |
    +------------+--------------------+
    1 row in set (0.02 sec)
    


    表创建语句:

    CREATE TABLE Picture_Image_Data
    (
        ID_Picture INTEGER UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
        Image_Data MEDIUMBLOB
    );
    

    0000000 d8ff e0ff 1000 464a 4649 0100 0101 1c00
    0000010 1c00 0000 dbff 4300 0500 0403 0404 0503
    0000020 0404 0504 0505 0706 080c 0707 0707 0b0f
    0000030 090b 110c 120f 1112 110f 1311 1c16 1317
    0000040 1a14 1115 1811 1821 1d1a 1f1d 1f1f 1713
    0000050 2422 1e22 1c24 1f1e ff1e 00db 0143 0505
    0000060 0705 0706 080e 0e08 141e 1411 1e1e 1e1e
    0000070 1e1e 1e1e 1e1e 1e1e 1e1e 1e1e 1e1e 1e1e  
    
    1 回复  |  直到 14 年前
        1
  •  1
  •   Thomas Matthews    14 年前

    问题在于映像文件的构造函数:

    std::ifstream   blob_file(filename.c_str());
    

    它应该具有二进制模式属性:

    std::ifstream   blob_file(filename.c_str(), std::ios_base::binary);
    

    该文件是一个JPEG图像 二元的 数据。

    此外,字节65处的十六进制转储显示 1a ,这是Windows操作系统的文件结束字符:
    1a级 14 1115 1811 1821 1d1a 1f1d 1f1f 1713年

    mysql> SELECT ID_Picture, LENGTH(Image_Data)
        -> FROM picture_image_data
        -> WHERE ID_Picture = 1;
    +------------+--------------------+
    | ID_Picture | LENGTH(Image_Data) |
    +------------+--------------------+
    |          1 |              18453 |
    +------------+--------------------+
    1 row in set (0.00 sec)