2015-06-19 3 views
0

Я получаю ошибку SQLITE_MISUSE в следующем коде, и мне интересно, может ли это быть вызвано тем, что имя таблицы является связанным параметром? Каковы некоторые другие причины SQLITE_MISUE?SQLITE_MISUSE в подготовленном сообщении

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("%d\n", rc); 
     } 
    } 
} 
sqlite3_finalize(stmt1); 

ответ

1

Вы правы; you cannot bind the table name:

Вообще, нельзя использовать параметры SQL/заполнители для идентификаторов база данных (таблицы, столбцы, представление, схема и т.д.) или функция базы данных (например, CURRENT_DATE), но вместо того, чтобы только для связывания буквенных значений.

Вы могли бы тривиальный проверил эту гипотезу жесткого кодирования имени таблицы.

+0

Как я могу привязать идентификатор базы данных? – HSchmale

+1

@HSchmale: Не знаете, какая часть «вы не можете» неясна? В любом случае, если все эти таблицы имеют одну и ту же схему, почему они не являются _one_ table, а ваш столбец '? 1'? В общем, если вы считаете, что имя таблицы должно быть динамическим, это указывает на проблему с вашим дизайном, и это часть того, почему он не поддерживается. –

+0

Тогда какой лучший дизайн, если бы я хотел создать таблицу «на лету», а затем вставить в нее. – HSchmale

Смежные вопросы