IBPP:当使用表名的问号时,在transaction.prepare(...)中获取异常

时间:2015-04-09 08:57:54

标签: sql firebird interbase

我使用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 ();
}

1 个答案:

答案 0 :(得分:1)

您无法参数化对象名称(如表名,列名等)。查询参数表示值。

这不是Firebird特有的,或者至少:我不知道任何允许对象名称进行参数化的数据库。