запись массива байтов в mysql с использованием c connector?

#mysql #c #blob

#mysql #c #большой двоичный объект

Вопрос:

есть ли какой-нибудь разумный способ записать массив байтов в varbinary или (другой объясните мне), я хочу сделать подобную функцию

  bool writeBinary(char * someQuery, LPBYTE buffer)
 {
 }
  

когда я использую функцию next, данные, которые происходят в mysql, не совпадают с буфером

 void CDBManager::SetBinary(const char * lpszStatement, LPBYTE lpBinaryBuffer,  
ULONG    BinaryBufferSize)
{
MYSQL_STMT  *stmt;
MYSQL_BIND  bind[1];
char * shhh = new char[BinaryBufferSize];
// ----
memcpy(shhh, lpBinaryBuffer, BinaryBufferSize);

stmt = mysql_stmt_init(amp;getDB()->m_hMySQL);
printf("n");
if(BinaryBufferSize >= 2752)
{
    for(int i = 0; i < BinaryBufferSize; i  )
    {
        if(lpBinaryBuffer[i] == 0xFF amp;amp;
                 lpBinaryBuffer[i 1] == 0xFF amp;amp; lpBinaryBuffer[i 2] == 0xFF amp;amp; lpBinaryBuffer[i 3] == 0xFF amp;amp; lpBinaryBuffer[i 4] == 0xFF amp;amp; lpBinaryBuffer[i 5] == 0xFF amp;amp;
                  lpBinaryBuffer[i 6] == 0xFF amp;amp; lpBinaryBuffer[i 7] == 0xFF amp;amp; lpBinaryBuffer[i 8] == 0xFF amp;amp; lpBinaryBuffer[i 9] == 0xFF amp;amp; lpBinaryBuffer[i 10] == 0xFF amp;amp;
                   lpBinaryBuffer[i 11] == 0xFF amp;amp; lpBinaryBuffer[i 12] == 0xFF amp;amp; lpBinaryBuffer[i 13] == 0xFF amp;amp; lpBinaryBuffer[i 14] == 0xFF amp;amp; lpBinaryBuffer[i 15] == 0xFF)
        {
        }
        else
        {
            printf("[%d] X X X X X X X X X X X X X X X Xn", i, lpBinaryBuffer[i],
                 lpBinaryBuffer[i 1],  lpBinaryBuffer[i 2],  lpBinaryBuffer[i 3],  lpBinaryBuffer[i 4],  lpBinaryBuffer[i 5],
                  lpBinaryBuffer[i 6],  lpBinaryBuffer[i 7],  lpBinaryBuffer[i 8],  lpBinaryBuffer[i 9],  lpBinaryBuffer[i 10],
                   lpBinaryBuffer[i 11],  lpBinaryBuffer[i 12],  lpBinaryBuffer[i 13],  lpBinaryBuffer[i 14],  lpBinaryBuffer[i 15]);
        }
        i =15;
    }
}
printf("n");

if(stmt == NULL)
{
    fprintf(stderr, " mysql_stmt_init(), out of memoryn");
}
else if(mysql_stmt_prepare(stmt, lpszStatement, strlen(lpszStatement)))
{
    fprintf(stderr, " mysql_stmt_prepare(), INSERT failedn");
    fprintf(stderr, " %sn", mysql_stmt_error(stmt));
}
else
{
    memset(bind, 0, sizeof(bind));
    // ----
    bind[0].buffer_type     = MYSQL_TYPE_BLOB;
    bind[0].buffer          = (char *)shhh;
    bind[0].buffer_length   = BinaryBufferSize;
    bind[0].is_null         = 0;
    bind[0].length          = 0;
    // ----
    // allways filed? what? this calls they are good, i made by example on mysql.com so what dont work
    // it always return len 0 => no data saved in db
    if(mysql_stmt_bind_param(stmt, bind))
    {
        fprintf(stderr, " mysql_stmt_bind_param() failedn");
        fprintf(stderr, " %sn", mysql_stmt_error(stmt));
    }
    else if(mysql_stmt_execute(stmt))
    {
        fprintf(stderr, " mysql_stmt_execute(), 1 failedn");
        fprintf(stderr, " %sn", mysql_stmt_error(stmt));
    }
}
// ----
delete shhh;
  

}

Спасибо

Ответ №1:

Между вашим bind и вашим execute добавьте следующую строку, чтобы загрузить данные большого двоичного объекта на сторону сервера:

*mysql_stmt_send_long_data({stmt}, {номер поля}, {данные}, {длина данных});*

 if(mysql_stmt_send_long_data(stmt, 2, (const char*)ser.data(), data_length)) {
  ERROR("dehydrate : failed to send long data : %s", mysql_stmt_error(stmt));
  goto abort;
}
  

Номер поля основан на нуле и в вашем случае будет равен 0, поскольку у вас есть только 1 поле.

Кроме того, тип blob поддерживает только до 64 КБ, вам может понадобиться тип данных «long blob» объемом до 1 ГБ.