Pregunta

¿Hay alguna forma inteligente de escribir una matriz de bytes en Varbinary o (otro Explicarme) estoy buscando hacer un funciones así?

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

Cuando uso la siguiente función, los datos que suceden en MySQL no son iguales al búfer

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;

}

Gracias

¿Fue útil?

Solución

Entre su enlace y su ejecución, agregue la siguiente línea para cargar los datos de blob al lado del servidor:

*mysql_stmt_send_long_data ({stmt}, {campo-number}, {data}, {data longitud});*

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

El número de campo está basado en cero y sería 0 en su caso ya que solo tiene el campo 1.

Además, el tipo de blob solo admite hasta 64k, es posible que desee el tipo de datos "Long Blob" que es de hasta 1 GB.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top