我使用IBPP在C ++中使用firebird数据库。我想动态地在更新sql语句中设置表名。所以我在Prepare("UPDATE ? ...")
中将表名称作为问号。不幸的是,这会引发错误:
* IBPP :: SQLException * 上下文:Statement :: Prepare(UPDATE?SET name =?WHERE stage_system_id =?)消息:isc_dsql_prepare失败
SQL消息:-104无效令牌
引擎代码:335544569引擎消息:动态SQL错误SQL 错误代码= -104令牌未知 - 第1行,第8列?
是否可以使表名成为参数?可以通过手动创建字符串 - 但这非常麻烦。或者使表名成为一个参数而不是一个好的理想? 以下是完整的代码段:
try
{
m_DbStatement->Prepare (
"UPDATE ? SET name = ? WHERE stage_system_id = ?" /*Works not - throws exception*/
/*"UPDATE stage_systems SET name = 'qqq' WHERE stage_system_id = 3"*/ /*Works*/
);
}
catch (std::exception& e)
{
std::string error = e.what();
throw;
}
m_DbStatement->Set(1, rowElementToUpdate.tableName.c_str ());
m_DbStatement->Set(2, rowElementToUpdate.value.c_str ());
m_DbStatement->Set(3, rowElementToUpdate.primaryKey);
m_DbStatement->Execute ();
m_DbTransaction->CommitRetain ();
}
答案 0 :(得分:1)
您无法参数化对象名称(如表名,列名等)。查询参数仅表示值。
这不是Firebird特有的,或者至少:我不知道任何允许对象名称进行参数化的数据库。