Обычно я разрабатываю с работающим сервером, но в первый раз я решил сделать скачок и посмотреть, смогу ли я заставить весь мой (C++) код mysql работать как встроенный сервер. В частности, я очень люблю подготовленные утверждения, поскольку они (ИМХО) «в целом» превосходят неподготовленное разнообразие.
Я пробовал использовать libmysqld из версии 5.5.22 и libmysqld из версии 5.6.4, и ни одна из них не работает.
Соединение установлено, простые команды mysql_query / mysql_real_query работают нормально, но как только мой первый подготовленный оператор вызывает mysql_stmt_fetch(), я получаю ненавистную ошибку «команды не синхронизированы».
Очень похожая проблема появилась на форумах оракулов ( http://forums.mysql.com/read.php?168,507863,507863#msg-507863) без решения.
Я не вижу и не думаю, что пропущены какие-либо команды между mysql_real_connect() и mysql_stmt_fetch().
Все мои поиски ни одного примера встроенного сервера, использующего подготовленные операторы, не дали результатов. Я также не нашел фактического предложения «вы не можете этого сделать».
Так... поддерживается или нет?
Спасибо за ваш опыт.
//редактировать чтобы еще больше демистифицировать это (и проинструктировать, если необходимо), моя полная последовательность команд mysql выглядит следующим образом:
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() вызывает работу. Продолжаю...
//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();