IBPP ライブラリ経由で組み込みの Firebird データベースを使用する C++ アプリケーションがあります (たとえば、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 ...
挿入を行った後、または上記の変数... returning ID
の末尾にあるa を使用して、同じトランザクション内で ID を取得できます (明らかに成功したようです) 。SQL_STMT
しかし、トランザクションがコミットされ、コードの他の部分がテーブル内の値を取得しようとすると、そこにはありません。エラー/例外が発生することはありません。
これらの状況でエラーが発生しない理由はありますか?