现象

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.