l'écriture d'un tableau d'octets à MySQL en utilisant le connecteur de c?
Question
est-il un moyen intelligent pour écrire un tableau d'octets en varbinary ou (autre me expliquer) Je cherche à faire funciton comme ça
bool writeBinary(char * someQuery, LPBYTE buffer)
{
}
quand i en utilisant la fonction suivante, les données qui happend dans mysql pas même dans le tampon
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;
}
Merci
La solution
Entre votre bind et votre exécuter, ajoutez la ligne suivante pour télécharger les données blob du côté du serveur:
* mysql_stmt_send_long_data ({stmt}, {field-number}, {data}, {longueur de données}); *
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;
}
Le champ numéro est basé sur zéro, et serait 0 dans votre cas puisque vous avez seulement le champ 1.
En outre, le type de blob ne supporte que jusqu'à 64k, vous voudrez peut-être le type de données « long blob » qui est jusqu'à 1 Go.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow