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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top