IBPP:在事务中获取异常。在对表名使用问号时准备(…) 我使用iBPP在C++中使用FielBoeDebug数据库。我想在UPDATESQL语句中动态设置表名。因此,我在Prepare(“UPDATE?”)中将表名作为问号。不幸的是,这会引发一个错误:

IBPP:在事务中获取异常。在对表名使用问号时准备(…) 我使用iBPP在C++中使用FielBoeDebug数据库。我想在UPDATESQL语句中动态设置表名。因此,我在Prepare(“UPDATE?”)中将表名作为问号。不幸的是,这会引发一个错误:,sql,firebird,interbase,Sql,Firebird,Interbase,*IBPP::SQLException*上下文:语句::准备(更新?集合名称=?其中阶段\系统\ id=?)消息:isc\ dsql\准备失败 SQL消息:-104无效令牌 引擎代码:335544569引擎消息:动态SQL错误SQL 错误代码=-104令牌未知-第1行第8列 是否可以将表名设为参数?手动创建字符串是可能的,但这相当麻烦。还是将表名作为参数根本不是一个好主意? 下面是完整的代码片段: try { m_DbStatement->Prepare ( "UPDATE

*IBPP::SQLException*上下文:语句::准备(更新?集合名称=?其中阶段\系统\ id=?)消息:isc\ dsql\准备失败

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

不能参数化对象名称(如表名、列名等)。查询参数仅用于值


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

您需要在UPDATE语句中指定表名,即不是参数标记。