質問
バイト配列をvarbinaryに書き込む賢明な方法はありますか、または(他の説明私に)私はそのような責任を作りたいと思っています
bool writeBinary(char * someQuery, LPBYTE buffer)
{
}
次の機能を使用すると、mysqlで起こったデータはバッファーと同じではありません
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;
}
ありがとう
解決
バインドと実行の間に、次の行を追加して、BLOBデータをサーバー側にアップロードします。
*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;
}
フィールド番号はゼロベースであり、1つのフィールドしか持っていないため、ケースでは0になります。
また、BLOBタイプは最大64Kのみをサポートしているため、最大1GBの「Long Blob」データ型が必要になる場合があります。
所属していません StackOverflow