Поддерживаются ли подготовленные операторы во встроенном MySQL

Обычно я разрабатываю с работающим сервером, но в первый раз я решил сделать скачок и посмотреть, смогу ли я заставить весь мой (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();

17
задан MPelletier 5 May 2012 в 15:51
поделиться