插入Firebird 2.5时无效的BLOB ID

时间:2014-06-04 10:26:58

标签: insert blob firebird2.5

我正在尝试使用来自C ++应用程序的API将一些二进制数据插入到Firebird BLOB字段中。在官方Firebird API手册之后,我的代码基本上如下(错误处理省略):

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];
...

然后以与应用程序中其他地方的许多其他实例相同的方式提交查询,因此我相信那里没有问题。
blob创建完成且没有错误,但是在提交查询时,返回的错误代码是“无效的BLOB ID”。 谁能看到我做错了什么?

更新(来自评论)

我只是重新命令我的语句在XSQLDA结构定义之后创建blob并调用isc_dsql_allocate_statement和isc_dsql_prepare,并且lo!它没有错误地工作。所以我的问题直接解决了,但我仍然很想知道到底出了什么问题。

1 个答案:

答案 0 :(得分:1)

您不显示语句准备/执行以及与此问题相关的事务启动:您发布的错误通常是由与您用于执行插入的事务不同的事务中创建blob引起的。更新:只要blob id没有链接到表,就不会在其他事务中看到它。