Обычно я разрабатываю сервер с живыми, но в первый раз я решил, что сделаю прыжок и посмотрю, смогу ли я получить весь мой (С++) код mysql, работающий как встроенный сервер. В частности, я очень увлекаюсь подготовленными заявлениями, как они есть (ИМХО) "в целом", превосходящими неподготовленный сорт.
Я пробовал использовать libmysqld из 5.5.22 и libmysqld из 5.6.4 и не работал.
Соединение выполнено, простые команды mysql_query/mysql_real_query работают нормально, но как только мой первый подготовленный оператор выдает mysql_stmt_fetch(), я получаю ошибку "команды из синхронизации".
Очень похожая проблема появилась на форумах oracles (http://forums.mysql.com/read.php?168,507863,507863#msg-507863) без разрешения.
Я не вижу и не считаю, что мне не хватает команд между mysql_real_connect() и mysql_stmt_fetch().
Все мои поиски оказались пустыми для любого примера встроенного сервера, который использует подготовленные операторы. Я также не нашел фактическое предложение "вы не можете этого сделать".
Итак... это или не поддерживается?
Спасибо за ваш опыт.
//редактировать чтобы деактивировать это дальше (и при необходимости инструктировать) моя полная последовательность mysql cmd выглядит следующим образом:
mysql_library_init(); // as embedded
mysql_init();
mysql_options(MYSQL_SET_CHARSET_NAME); //to utf8
mysql_options(MYSQL_OPT_USE_EMBEDDED_CONNECTION);
mysql_real_connect();
mysql_real_query("SET NAMES 'utf8'");
mysql_real_query("SET CHARACTER SET 'utf8'");
mysql_set_character_set("utf8"); // yes, you really do need to set utf8 four times
mysql_autocommit( mAutocommit );
в этот момент mysql_real_query() вызывает DO. Я продолжаю...
//all this would only happen once for each stmt
{
mysql_stmt_init();
mysql_stmt_prepare(theQuery);
mysql_stmt_param_count(); // to assert input bind object (aka the predicates) has the same number of params as theQuery
mysql_stmt_result_metadata()
mysql_num_fields(); // to assert the output bind object has the same number of params as theQuery
mysql_free_result(metadata);
mysql_stmt_bind_param(); // called IF there are input params
mysql_stmt_bind_result(); // pretty much always called for the output params
}
// and at last
mysql_stmt_execute();
//mysql_stmt_store_result(); //{OPTIONAL: use if you want to buffer the fetch - I dont}
mysql_stmt_fetch(); // ERROR! commands out of sync.
// and for completeness,
mysql_stmt_free_result();
mysql_stmt_close();
// and the shutdown
mysql_close();
mysql_library_end();