现象
Firebird 数据库表中字段类型为 Float,使用 IBPP set() 函数使用 double 类型设置 Prepared Statement 中对应的 Parameter 时发生错误。因运行时无法看到错误信息,虽然记录不能插入表,但程序也不总是在这个时候崩溃,因此这个问题相当隐蔽。
表的 DDL 如下所示:
CREATE TABLE "REPORT-ERROR" ( REPORT_ID Bigint NOT NULL, TEST_ID Smallint NOT NULL, ERROR_ID Smallint NOT NULL, "VALUE" Float NOT NULL, EXPECTATION Varchar(32), DESCRIPTION Varchar(256) CHARACTER SET UTF8, CONSTRAINT "PK_REPORT-ERROR_1" PRIMARY KEY (REPORT_ID,ERROR_ID,TEST_ID) )
而出错的 c++ 语句如下所示,其中行5的 value 为 double 数据类型:
st->Prepare("INSERT INTO \"REPORT-ERROR\" (REPORT_ID, TEST_ID, ERROR_ID, \"VALUE\", EXPECTATION, DESCRIPTION) VALUES (?,?,?,?,?,?)");
st->Set(1, reportId);
st->Set(2, iter->first);
st->Set(3, iter->second.errorId);
st->Set(4, iter->second.value);
st->Set(5, iter->second.expectation.c_str());
st->Set(6, iter->second.desc.c_str());
st->Execute();
解决方案
将上面 c++ 代码的第5行使用强制类型转换修改为:
st->Set(4, (float)iter->second.value);
Leave a Reply
You must be logged in to post a comment.