Готовые операторы поддерживаются во встроенном MySQL - PullRequest
17 голосов
/ 29 марта 2012

Я обычно разрабатываю с живым сервером, но впервые я решил сделать прыжок и посмотреть, смогу ли я получить весь мой (C ++) код mysql, работающий как встроенный сервер.В частности, мне очень нравятся подготовленные операторы, поскольку они (IMHO) "в целом" превосходят неподготовленные варианты.

Я пытался использовать libmysqld из 5.5.22 и libmysqld из 5.6.4 ини одна из них не работает.

Соединение установлено, простые команды mysql_query / mysql_real_query работают нормально, но как только мой первый подготовленный оператор выдает mysql_stmt_fetch (), я получаю ненавистные команды 'error of sync'.1006 * Очень похожая проблема появляется на форумах оракулов (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 () вызывает 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();

Ответы [ 3 ]

3 голосов
/ 12 апреля 2012

Я боялся этого ... но после немалой работы у меня есть ответ на мой вопрос и решение проблемы. (да, я ленивый кодер ... я надеялся, что кто-то другой скажет мне, что все это необходимо ... хе-хе)

Вот мой собственный авторитетный ответ на встроенный сервер + подготовленные утверждения, не рабочий вопрос.

вопрос: поддерживаются ли stmts во встроенных? ответ ... они должны быть, но это не так.

Да, во встроенном mysql есть ошибка в отношении stmts. Увидеть: http://bugs.mysql.com/bug.php?id=62136

Мистер Ци Чжоу имеет все мое уважение. Он каким-то образом определил, что при запуске встроенного mysql_stmt_execute () неправильно устанавливал статус результата как «MYSQL_STATUS_GET_RESULT» вместо «MYSQL_STATUS_STATEMENT_GET_RESULT» (т. Е. Рассматривал stmt как нестатистический) ошибка. Так что это требует исправления самого исходного кода.

Как это сделать .. Страница MySql "Как построить на Windows" здесь: http://dev.mysql.com/doc/refman/5.5/en/source-installation.html

ссылается на это гораздо проще для чтения, КАК СТРОИТЬ: http://www.chriscalender.com/?p=689

Дополнительные HOW-TO примечания, которые я определил в процессе

Крис, как это для VS2008 Express. Я использую 2010 Pro и узнал, что cmake -G arg может быть опущен. Для меня 2010 год был автоматически определен как используемый компилятор.

Я только установил cmake и bison. Perl и Bazaar не требуются для этого. и я получил стандартный дистрибутив 5.5.22 вместо того, чтобы тянуть с базара.

re: установка бизона:

  • Обязательно установите бизон на путь без пробелов
  • НЕ разрешать установщику добавлять что-либо в меню «Пуск» (вызвано «m4.exe не обнаружена «ошибка»
  • вручную добавить папку bin бизона в системный PATH

re: signtool.exe

убедитесь, что путь к signtool добавлен в PATH. Пример (для меня)

  • c: \ Program Files \ Microsoft SDKs \ Windows \ v7.0A \ bin

Загрузить исходный дистрибутив MySql (http://dev.mysql.com/downloads/mysql/#downloads): Универсальный Linux (независимый от архитектуры), сжатый архив TAR (mysql-5.5.22.tar.gz)

Вам нужно отредактировать {D: \ your_path} \ mysql-5.5.22 \ libmysqld \ lib_sql.cc

В строке 340 вы увидите:

if (res)
{
    NET *net= &stmt->mysql->net;
    set_stmt_errmsg(stmt, net);
    DBUG_RETURN(1);
}
//ADD CODE HERE
DBUG_RETURN(0);

Вставьте между кодовым блоком if и DBUG_RETURN (0) следующее:

//kgk 2012/04/11 - see http://bugs.mysql.com/bug.php?id=62136
//  Qi Zhou's modification to allow prep'd stmts to work
else if (stmt->mysql->status == MYSQL_STATUS_GET_RESULT)
{
    stmt->mysql->status= MYSQL_STATUS_STATEMENT_GET_RESULT;
}

И создайте себе новую версию libmysqld.dll, libmysqld.lib, libmysqld.pdb

и проблема исправлена.

Когда вы собрали dll, не поступайте так, как я, и забудьте переместить новую DLL в папку вашего исполняемого файла и сядьте, размышляя, почему изменения ничего не сделали. Вздох.

К вашему сведению: комментарий к сообщению о технике оракула с тегом [20 февр. 18:34] Света Смирнова полная ерунда. serverARgs не имеет ничего общего.

0 голосов
/ 06 апреля 2012

http://dev.mysql.com/doc/refman/5.1/en/mysql-stmt-execute.html

извините за мой плохой английский, но проблема в том, что mysql_stmt_fetch открытый курсор, но mysql_stmt_execute только выполняет mysql_stmt_store_result работу с курсором ...

0 голосов
/ 30 марта 2012

Встроенный MySQL - это тот, который обычно не используется, и для этой проблемы я много раз искал в Интернете и подготовил отдельный проект. При этом я многому научился, и одна из них - сначала выполнить запрос, а затем сохранить результаты.

Чтобы избавиться от запросов разных типов, создайте объект для выполнения и верните результат, и в этом случае вам не нужно писать запрос на выполнение снова и снова.

В данном случае пользователь также не выполнил запрос и не попытался сохранить результаты, и это происходит только при попытке скопировать другие команды. Таким образом, решение проблемы состоит в том, чтобы выполнить mysql_stmt_execute и затем вызвать mysql_stmt_store_result

...