c++ - ejemplos - sentencias preparadas php mysqli
Se preparan las declaraciones preparadas en MySQL incrustado (3)
MySQL incrustado es el que normalmente no se usa y para este problema he buscado en la web muchas veces y he preparado un proyecto por separado. Al hacerlo, he aprendido muchas cosas y una de ellas es que primero ejecute la consulta y luego almacene los resultados.
Para deshacerse de los diferentes tipos de consulta, cree un objeto para la ejecución y devuelva el resultado y, en este caso, no tiene que escribir la consulta de ejecución una y otra vez.
En el caso presente, el usuario tampoco ejecutó la consulta y trató de almacenar los resultados, y esto solo ocurre cuando intenta copiar otros comandos. Por lo tanto, la solución al problema es ejecutar mysql_stmt_execute
y luego llamar a mysql_stmt_store_result
Normalmente desarrollo con un servidor en vivo, pero por primera vez pensé que daría el salto y vería si podía hacer que todo mi código mysql (C ++) funcionara como un servidor integrado. Particularmente, me encantan las declaraciones preparadas, ya que son (IMHO) "generalmente" superiores a la variedad no preparada.
He intentado usar libmysqld desde 5.5.22 y libmysqld desde 5.6.4 y ninguno funciona.
Se realiza la conexión, los comandos simples mysql_query / mysql_real_query funcionan bien, pero tan pronto como mi primera instrucción preparada emite un error mysql_stmt_fetch (), obtengo el error de "comandos desincronizados".
Apareció un problema muy similar en los foros de oráculos ( http://forums.mysql.com/read.php?168,507863,507863#msg-507863 ) sin resolución.
No veo, ni creo que me falten los comandos entre mysql_real_connect () y mysql_stmt_fetch ().
Todas mis búsquedas han quedado vacías para cualquier ejemplo de un servidor incorporado que utiliza declaraciones preparadas. Tampoco he encontrado una frase real "no puedes hacer esto".
Entonces ... ¿es o no es compatible?
Gracias por su experiencia.
// edite para desmitificar esto (e instruir si es necesario) mi secuencia completa de cmd de mysql es la siguiente:
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 );
en este punto, mysql_real_query () las llamadas funcionan. Continúo...
//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();
Tenía miedo de esto ... pero después de poco trabajo, tengo una respuesta a mi pregunta y una solución al problema. (sí, soy un programador perezoso ... esperaba que alguien más me hubiera dicho que todo esto era necesario ... jeje)
Aquí está mi propia respuesta autorizada al servidor integrado + declaraciones preparadas que no funcionan.
la pregunta: ¿están soportados los stmts incrustados? La respuesta ... deberían ser pero NO lo son.
Sí, hay un error en mysql incrustado con respecto a stmts. Consulte: http://bugs.mysql.com/bug.php?id=62136
El Sr. Qi Zhou tiene todo mi respeto. De alguna manera, determinó que al ejecutar incrustado, mysql_stmt_execute () estaba configurando incorrectamente el estado del resultado en "MYSQL_STATUS_GET_RESULT" en lugar de "MYSQL_STATUS_STATEMENT_GET_RESULT" (es decir, tratar un estado como una no declaración). error. Por lo tanto, requiere parchear el código fuente en sí.
Cómo hacer eso. La página de MySQL "cómo construir en Windows" aquí: http://dev.mysql.com/doc/refman/5.5/en/source-installation.html
hace referencia a este CÓMO DE CONSTRUIR mucho más fácil de leer: http://www.chriscalender.com/?p=689
Notas adicionales de COMO HACER que determiné en el proceso
Chris es cómo hacerlo para VS2008 express. Utilizo 2010 Pro y aprendí el cmake -G arg se puede omitir. Para mí, 2010 fue auto-determinante para ser el compilador a usar.
Solo instalé cmake y bisonte. Perl y Bazar no son requeridos para esto. y obtuve la fuente estándar 5.5.22 distro en lugar de tirar del bazar.
re: instalando bison:
- Asegúrate de instalar bisonte en un camino sin espacios.
- NO permita que el instalador agregue nada al menú de inicio (causó el error "m4.exe no encontrado")
- añadir manualmente la carpeta bin de bison al sistema PATH
re: signtool.exe
Asegúrate de que la ruta a signtool se agrega a PATH. Ejemplo (para mi)
- c: / Archivos de programa / Microsoft SDKs / Windows / v7.0A / bin
Descargue la distribución de código fuente de MySql ( http://dev.mysql.com/downloads/mysql/#downloads ): Linux genérico (independiente de la arquitectura), archivo comprimido de TAR (mysql-5.5.22.tar.gz)
Debe editar {D: / su_ruta} / mysql-5.5.22 / libmysqld / lib_sql.cc
En la línea 340 verá:
if (res)
{
NET *net= &stmt->mysql->net;
set_stmt_errmsg(stmt, net);
DBUG_RETURN(1);
}
//ADD CODE HERE
DBUG_RETURN(0);
Insertar entre el bloque de código if y DBUG_RETURN (0) lo siguiente:
//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;
}
Y cree una nueva versión de lanzamiento de libmysqld.dll, libmysqld.lib, libmysqld.pdb
y el problema está arreglado.
Cuando haya creado la dll, no haga como yo y olvide mover la nueva DLL a la carpeta de tiempo de ejecución de su binario y siéntese preguntándose por qué el cambio no hizo nada. Suspiro.
FYI: el comentario del informe de errores de oracle''s techie etiquetado con [20 Feb 18:34] Sveta Smirnova es un completo disparate. El serverARgs no tiene nada que ver con nada.
http://dev.mysql.com/doc/refman/5.1/en/mysql-stmt-execute.html
Lo siento por mi mal inglés, pero el problema es que mysql_stmt_fetch open cursor, pero mysql_stmt_execute solo ejecuta mysql_stmt_store_result trabaja con el cursor ...