¿Escribir una matriz de bytes a MySQL usando el conector C?
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
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