IBPP: получить исключение в transaction.prepare() при использовании вопросительного знака для имени таблицы

Я использую IBPP для использования базы данных firebird на C++. Я хотел бы динамически установить имя таблицы в операторе обновления sql. Поэтому я сделал имя таблицы знаком вопроса в Prepare("UPDATE ? ...") . К сожалению, это вызывает ошибку:

* IBPP::SQLException * Контекст: Statement::Prepare( UPDATE ? SET name = ? WHERE stage_system_id = ? ) Сообщение: isc_dsql_prepare failed

Сообщение 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 ();
}

person Semjon Mössinger    schedule 09.04.2015    source источник
comment
Вам нужно указать имя таблицы в операторе UPDATE, т.е. не маркер параметра.   -  person jarlh    schedule 09.04.2015


Ответы (1)


Вы не можете параметризовать имена объектов (например, имена таблиц, имена столбцов и т. д.). Параметры запроса только для значений.

Это не специфично для Firebird, или, по крайней мере: я не знаю ни одной базы данных, которая позволяла бы параметризовать имена объектов подобным образом.

person Mark Rotteveel    schedule 09.04.2015