[C con Clase] winapi y mysql

Steven Davidson steven en conclase.net
Mar Jun 5 19:48:05 CEST 2007


Hola Walter,

El pasado 2007-06-05 15:00:13, walter escribió:

w> Hola a Todos!
w> Gracias Steven, me ayudo muchas gracias, me dio alguna idea es

De nada; para eso estamos.

[CORTE]

w> Pero me falla al poner el código de mas de bajo, ( no me marco ningún
w> error el ide, sencillamente me fijo por mysql
w>  y no carga el dato en la tabla ) cuando el usuario llena el control
w> de edit y le de en aceptar párese que no ejecuta el código.
w> modifique el código del ejemplo 5 (
w> http://winapi.conclase.net/curso/index.php?cap=007b#EJEMPLO5 )
w> en BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
w> lo remplace por este código:

Veamos el código.

w> BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
w> {
w>      static DATOS *Datos;
w> /*-------------------------------------------------------------------------------------------------------------------*/
w> MYSQL *myData;
w> char szDatos[128]="";
w> myData = mysql_init(0);
w> char szComando[1024] = "INSERT into genero (cod_g,genero_d) values (55,'";
w> mysql_real_connect(myData, NULL, "root", "", "libreria", MYSQL_PORT, NULL, 0);
w> mysql_select_db(myData, "libreria");
w>  /*el ultimo dato cargado en la tabla genero es el 54 a si que el
w> proximo a cargar es el 55*/

Esto es un error. Aquí estás ejecutando estas sentencias casi sin parar. Ten presente que el procedimiento del diálogo es invocado cada vez que se produzca un mensaje enviado al diálogo. Por ejemplo, cada vez que actives y desactives el cuadro, muevas el ratón o pinches uno de sus botones, pulses cualquier tecla, etc..

El otro matiz a destacar es que inicializas 'mysql' y abres una conexión al servidor de MySQL. Sin embargo, no cierras la conexión ni tampoco liberas la memoria de 'mysql'. Como este código es ejecutado varias veces, vas a experimentar pérdidas de memoria, ya que 'mysql_init()' seguirá creando memoria dinámicamente.

Por último, inicializar y abrir una conexión a MySQL requiere tiempo, y hacer esto muchas veces ralentiza la aplicación.


Todo este código debería hacerse dentro de algún procesamiento de mensaje. En cuanto a la inicialización y apertura, sugiero hacerlas al crear el cuadro de diálogo o bien antes de su creación o bien al procesar el mensaje WM_INITDIALOG. Esto implica que el cierre y liberación de memoria se hacen al finalizar el cuadro de diálogo: antes de invocar 'EndDialog()'.


Espero que esto te sirva.

Steven


Más información sobre la lista de distribución Cconclase