Question

is there any smart way to write a byte array into varbinary or (other explain me) im looking to make funciton like that

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

when i using next function the data that happend in mysql not same to the buffer

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(&getDB()->m_hMySQL);
printf("\n");
if(BinaryBufferSize >= 2752)
{
    for(int i = 0; i < BinaryBufferSize; i++)
    {
        if(lpBinaryBuffer[i] == 0xFF &&
                 lpBinaryBuffer[i+1] == 0xFF && lpBinaryBuffer[i+2] == 0xFF && lpBinaryBuffer[i+3] == 0xFF && lpBinaryBuffer[i+4] == 0xFF && lpBinaryBuffer[i+5] == 0xFF &&
                  lpBinaryBuffer[i+6] == 0xFF && lpBinaryBuffer[i+7] == 0xFF && lpBinaryBuffer[i+8] == 0xFF && lpBinaryBuffer[i+9] == 0xFF && lpBinaryBuffer[i+10] == 0xFF &&
                   lpBinaryBuffer[i+11] == 0xFF && lpBinaryBuffer[i+12] == 0xFF && lpBinaryBuffer[i+13] == 0xFF && lpBinaryBuffer[i+14] == 0xFF && lpBinaryBuffer[i+15] == 0xFF)
        {
        }
        else
        {
            printf("[%d] %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", 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 memory\n");
}
else if(mysql_stmt_prepare(stmt, lpszStatement, strlen(lpszStatement)))
{
    fprintf(stderr, " mysql_stmt_prepare(), INSERT failed\n");
    fprintf(stderr, " %s\n", 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() failed\n");
        fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
    }
    else if(mysql_stmt_execute(stmt))
    {
        fprintf(stderr, " mysql_stmt_execute(), 1 failed\n");
        fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
    }
}
// ----
delete shhh;

}

thanks

Was it helpful?

Solution

Between your bind and your execute, add the following line to upload the blob data to the server side:

*mysql_stmt_send_long_data({stmt}, {field-number}, {data}, {data length});*

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;
}

The field-number is zero-based, and would be 0 in your case since you only have the 1 field.

Also, the blob type only supports up to 64k, you may want the "long blob" data type which is up to 1GB.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top