已准备语句中的SQLITE_MISUSE

SQLITE_MISUSE in prepared statement

本文关键字:SQLITE MISUSE 语句      更新时间:2023-10-16

我在下面的代码中收到一个SQLITE_MISUSE错误,我想知道这是否是由于表名是绑定参数引起的?SQLITE_MISUE的一些不同原因是什么?

const char sqlNeuralStateInsert[] =
    "INSERT INTO ?1(LAYER_ID, NEURON_ID, INPUT_ID, VALUE)"
    "VALUES(?2, ?3, ?4, ?5);";
sqlite3_stmt* stmt1;
rc = sqlite3_prepare_v2(db, sqlNeuralStateInsert, -1, &stmt1, NULL);
if(rc){
    //!< Failed to prepare insert statement
}
sqlite3_bind_text(stmt1, 1, this->getNName().c_str(), -1, SQLITE_STATIC); 
for(uint32_t i = 0; i < m_nlayers; i++){
    sqlite3_bind_int(stmt1, 2, i); // Layer id
    for(uint32_t j = 0; j < m_layers[i]->getNeuronCount(); j++){
        std::vector<double> weights = m_layers[i]->getWeights(j);
        sqlite3_bind_int(stmt1, 3, j); // Neuron id
        for(uint32_t k = 0; k < weights.size(); k++){
            sqlite3_bind_int(stmt1, 4, k);
            sqlite3_bind_double(stmt1, 5, weights[k]);
            rc = sqlite3_step(stmt1);
            printf("%dn", rc);
        }
    }
}
sqlite3_finalize(stmt1);

你说得对;无法绑定表名:

通常,不能将SQL参数/占位符用于数据库标识符(表、列、视图、模式等)或数据库函数(例如CURRENT_DATE),而只能用于绑定文字值。

您可以通过对表名进行硬编码来简单地检验这个假设。