我有一个 C++ 应用程序,它通过 IBPP 库使用嵌入式 Firebird 数据库(例如,使用 Windows 上的 fbembed.dll 进行嵌入式使用)。我目前使用的是 Firebird 2.5.3 版和 IBPP 2.5.3.1 版。我遇到的问题是,当我尝试插入由于列大小问题或违反约束(例如插入应该失败)而无法插入的数据时,我没有收到任何错误或插入失败的指示。
作为一个(简化但有代表性的)示例,我有一个如下表:
create table USER_TABLE (
ID BIGINT not null,
USER_ID VARCHAR(10) not null,
DISPLAY_NAME VARCHAR(50) not null,
-- etc...
primary key (ID),
unique (USER_ID)
);
ID 列在插入前触发器中填充了生成器。现在我尝试使用以下代码从我的应用程序中插入:
const string SQL_STMT = "insert into USER_TABLE "
"(USER_ID, DISPLAY_NAME, etc) "
"values (?, ?, ?);";
IBPP::Statement stmt = IBPP::StatementFactory(m_db, m_tr, SQL_STMT);
stmt->Set(1, userDataObject.getUserId());//returns const string&,
stmt->Set(2, userDataObject.getDisplayName());//returns const string&
//etc, etc...
stmt->Execute();
如果我的userDataObject.getUserId()
值对于列来说是一个太长的字符串,1234567890xxx
我不会像我期望的那样得到异常。select ID from user_table where ...
我可以(显然成功地)在执行插入后使用 a 或通过上述变量... returning ID
末尾的a获取同一事务中的 ID 。SQL_STMT
但是一旦事务提交并且代码的其他部分尝试获取表中的值,它就不存在了。我绝不会收到错误/异常。
有什么想法为什么我在这些情况下没有出错?