Frage

Gibt es eine intelligente Möglichkeit, ein Byte -Array in eine varbinäre oder (andere zu erklären) zu schreiben, die ich so funciton so machen möchte

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

Wenn ich die nächste Funktion verwende die Daten, die in MySQL nicht gleich dem Puffer sind

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;

}

Danke

War es hilfreich?

Lösung

Fügen Sie zwischen Ihrer Bindung und Ihrer Ausführung die folgende Zeile hinzu, um die Blob -Daten auf die Serverseite hochzuladen:

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

Die Feldzahl ist null basiert und wäre in Ihrem Fall 0, da Sie nur das Feld 1 haben.

Außerdem unterstützt der Blob -Typ nur bis zu 64.000. Möglicherweise möchten Sie den Datentyp "Long Blob", der bis zu 1 GB ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top