IBPP:在 transaction.prepare(...) 中为 table 名称使用问号时出现异常

IBPP: Get exception in transaction.prepare(...) when using question mark for table name

我正在使用 IBPP 在 C++ 中使用 firebird 数据库。我想在更新 sql 语句中动态设置 table 名称。所以我在 Prepare("UPDATE ? ...") 中将 table 名称设为问号。不幸的是,这引发了一个错误:

* IBPP::SQLException * Context: Statement::Prepare( UPDATE ? SET name = ? WHERE stage_system_id = ? ) Message: isc_dsql_prepare failed

SQL Message : -104 Invalid token

Engine Code : 335544569 Engine Message : Dynamic SQL Error SQL error code = -104 Token unknown - line 1, column 8 ?

是否可以将 table 名称作为参数?可以通过手动创建字符串 - 但这非常麻烦。或者将 table 名称作为参数根本不是一个好主意? 以下是完整的代码片段:

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

您不能参数化对象名称(如 table 名称、列名称等)。查询参数只有 个值。

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