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 特有的,或者至少:我不知道有任何数据库允许像这样对对象名称进行参数化。
我正在使用 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 特有的,或者至少:我不知道有任何数据库允许像这样对对象名称进行参数化。