BLOB ID inválido ao inserir no Firebird 2.5
-
21-12-2019 - |
Pergunta
Estou tentando inserir alguns dados binários em um campo BLOB do Firebird usando a API de uma aplicação C++.Meu código é basicamente o seguinte (tratamento de erros omitido), seguindo o manual oficial da API do Firebird:
extern db_conn_t global_db;
extern db_txn_t global_txn;
extern db_stmt_t global_stmt;
#define mydb (global_db.db_conn)
#define mytr (global_txn.dt_txn)
#define mystmt (global_stmt.ds_stmt)
#define status_vector (global_db.db_status)
isc_blob_handle hblob;
ISC_QUAD blobid;
XSQLDA *pinsqlda;
short flag[NUM_FIELDS];
memset (&flag[0], 0, NUM_FIELDS*sizeof(short));
hblob = NULL;
memset (&blobid, 0, sizeof(blobid));
isc_create_blob2(status_vector, &mydb, &mytr, &hblob, &blobid, 0, NULL);
isc_put_segment(status_vector, &hblob, payload_len, (char*)payload);
isc_close_blob(status_vector, &hblob);
pinsqlda = (XSQLDA *)calloc(1, XSQLDA_LENGTH(NUM_FIELDS));
...
pinsqlda->sqlvar[4].sqldata = (char *)&(blobid);
pinsqlda->sqlvar[4].sqltype = SQL_BLOB + 1;
pinsqlda->sqlvar[4].sqllen = sizeof(blobid);
pinsqlda->sqlvar[4].sqlind = &flag[4];
...
Em seguida, a consulta é enviada da mesma forma que muitas outras instâncias em outras partes do aplicativo, por isso estou confiante de que não há problema nisso.
A criação do blob é concluída sem erros, mas quando a consulta é enviada, o código de erro retornado é "ID BLOB inválido".Alguém pode ver o que estou fazendo de errado?
Atualização (do comentário)
Acabei de reordenar minhas instruções para colocar a criação do blob após a definição da estrutura XSQLDA e chamadas para isc_dsql_allocate_statement e isc_dsql_prepare, e eis!funciona sem erros.Portanto, meu problema imediato está resolvido, mas ainda assim gostaria de saber exatamente o que está errado.
Solução
Você não mostra a preparação/execução da instrução nem o início da transação que é relevante para este problema:O erro que você publica geralmente é causado pela criação do blob em uma transação diferente daquela que você usa para executar a inserção ou atualização:contanto que um ID de blob não tenha sido vinculado a uma tabela, ele não será visível em outras transações.