Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

MySQL con InnoDB

Estas en el tema de MySQL con InnoDB en el foro de Mysql en Foros del Web. Hola como estan? Pues tengo un par de dudas... bueno son mas jejeje Estoy desarrollando una aplicacion para mi trabajo, VB .net + MySQL con ...
  #1 (permalink)  
Antiguo 26/09/2007, 08:56
 
Fecha de Ingreso: marzo-2007
Ubicación: Celayork
Mensajes: 38
Antigüedad: 17 años, 1 mes
Puntos: 3
Pregunta MySQL con InnoDB

Hola como estan?

Pues tengo un par de dudas... bueno son mas jejeje

Estoy desarrollando una aplicacion para mi trabajo, VB .net + MySQL con el motor de almacenamiento InnoDB, para poder hacer uso de transacciones y otras cosas.

En primer lugar, quiero manejar lo que son stored procedures, solo que me quede estancado a la hora de usar transacciones, ya que no se como hacer uso de las excepciones en MySQL (que al momento de que no pueda insertar un registro a una tabla por X motivo, me haga el rollback). Aqui les pongo parte de mi codigo:

En VB llamo a una funcion la cual ejecuta mi codigo MySQL:
Código:
Ejecuta("call ProcInsCta('" & numcta & "','" & txtnombre.Text & "','" & tcuenta & "','" & ctamayor & "','" & fechacuenta & "','" & clase & "','" & subcuenta & "')")
Funcion ejecuta
Código:
Public Sub Ejecuta(ByVal sComando As String)
        Dim commmySQL As MySqlCommand
        Try
            commmySQL = New MySqlCommand(sComando, cn)
            commmySQL.ExecuteNonQuery()
        Catch e As MySqlException
            MessageBox.Show("No se puede llevar a cabo la operación. Detalle del error: " & e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop)
            merr = True
        Finally
        End Try
    End Sub
Hasta ahi, al parecer todo bien... igual tendria que modificar la funcion. Eso ustedes me lo podrian sugerir.

En mi BD tengo un stored procedure llamado ProcInsCta:
Código:
CREATE DEFINER=`root`@`localhost` PROCEDURE `ProcInsCta`(numcta char(9),nombcta varchar(90),tcuenta char(1),ctamayor char(1),fechacuenta char(10),clase char(1), subcta char(9))
BEGIN
	declare numerocta char(9);
	declare subctade char(9);
	select cuenta from `cont-cuenta` into numerocta where `cuenta`=numcta; #me marca error aqui... no se porque :S
	if numerocta <> NULL then 
		return 'La cuenta que intenta agregar ya existe'; #mi idea aqui es que regrese este mensaje y se despliegue en mi messagebox... alguien sabe como lo podria hacer?
	else
		select cuenta from `cont-cuenta` into subctade where `cuenta`=subcta;
		if subcta = NULL then
			return 'El numero de la cuenta superior no existe';#mi idea aqui es que regrese este mensaje y se despliegue en mi messagebox... alguien sabe como lo podria hacer?
	else
		else
			set autocommit=0;
			start transaction WITH CONSISTENT SNAPSHOT;
			insert into `cont-cuenta` (cuenta,nombre,tipo,mayor,fechalta,clase) values (numcta,nombcta,tcuenta,ctamayor,fechacuenta,clase);
			if #en este if, la idea es que recupere el mensaje de la consulta anterior, si hay error haga el rollback, sino, que se pase al else para hacer commit
				rollback;
			else
				commit;
			end if
			if ctamayor<>'3' then
				insert into `cont-ctasoc` (ctasup,subcta) values (numcta,subcta);
			end if;
		end if;
	end if;
END

Mas que nada quisiera saber si la sintaxis de mi procedimiento esta bien, como manejo los errores en MySQL, si la sintaxis del uso de transacciones esta bien y si me hace falta algo mas para que funcione mejor.

Se daran cuenta que la aplicacion esta en Windows. El servidor de MySQL corre en Windows 2003 Server, la aplicacion la estoy programando en VB.net 2005 en Windows XP.

Saludos y espero sus comentarios :D
  #2 (permalink)  
Antiguo 26/09/2007, 11:39
 
Fecha de Ingreso: marzo-2007
Ubicación: Celayork
Mensajes: 38
Antigüedad: 17 años, 1 mes
Puntos: 3
De acuerdo Re: MySQL con InnoDB

Que onda

Despues de leer un buen rato el manual de MySQL, cambie algunos detalles y agregue otros que me hacian falta y ya camina mi procedimiento.

Lo que necesito saber es ahora como puedo regresarle a VB.net el valor de una variable tipo bandera (con un solo caracter), para que este me despliegue un mensaje.

Les dejo el codigo de mi procedimiento:
Código:
CREATE DEFINER=`root`@`localhost` PROCEDURE `ProcInsCta`(numcta char(9), nombcta varchar(90), tcuenta char(1), ctamayor char(1), fechacuenta char(10), clase char(1), subcta char(9))
BEGIN
	set @numerocta= NULL, @subctade= NULL;
	set autocommit=0;
	start transaction WITH CONSISTENT SNAPSHOT;
	select cuenta into @numerocta from `cont-cuenta` where `cuenta`=numcta;
	if @numerocta <> NULL then
		select 'La cuenta que intenta agregar ya existe';
	else
		insert into `cont-cuenta` (cuenta,nombre,tipo,mayor,fechalta,clase) values (numcta,nombcta,tcuenta,ctamayor,fechacuenta,clase);
		show count(*) errors;
		if @@error_count > 0 then
			rollback;
			select 'Error al insertar registro en cont-cuenta. No se agrego el registro';
		else
			if ctamayor<>'3' then
				select cuenta into @subctade from `cont-cuenta` where `cuenta`=subcta;
				if @subctade = NULL then
					rollback;
					select 'El numero de la cuenta superior no existe';
				else
					insert into `cont-ctasoc` (ctasup,subcta) values (numcta,subcta);
					show count(*) errors;
					if @@error_count > 0 then
						rollback;
						select 'Error al insertar registro en cont-ctasoc. No se agrego el registro';
					else
						commit;
						select 'El registro se ha guardado con exito. cont-cuenta y cont-ctasoc';
					end if;
				end if;
			else
				commit;
				select 'El registro se ha guardado con exito. cont-cuenta';
			end if;
		end if;
	end if;
END
  #3 (permalink)  
Antiguo 01/10/2007, 08:57
 
Fecha de Ingreso: marzo-2007
Ubicación: Celayork
Mensajes: 38
Antigüedad: 17 años, 1 mes
Puntos: 3
Re: MySQL con InnoDB

Hola foreros, como les va?

Pues sigo con la misma duda...

He intentado retornar el valor de una variable de tipo INT de un stored procedure en MySQL a una aplicación de VB .net 2005. Ya tengo la conexión y todo el rollo, ya puedo grabar en mi BD sin problemas.

Desde VB hago la llamada del stored procedure con esta linea:
Código:
Ejecuta("call ProcInsCta('" & numcta & "','" & txtnombre.Text & "','" & tcuenta & "','" & ctamayor & "','" & fechacuenta & "','" & clase & "','" & subcuenta & "','" & msg & "')")
Donde msg es el parametro OUT de tipo entero para el stored procedure... aqui les paso el procedimiento:

Código:
CREATE DEFINER=`root`@`localhost` PROCEDURE `ProcInsCta`(numcta char(9), nombcta varchar(90), tcuenta char(1), ctamayor int, fechacuenta char(10), clase char(1), subcta char(9), OUT mensaje int)
BEGIN
        #declare mensaje int;
        set @numerocta= NULL, @subctade= NULL, @cmayscta=NULL;
	set autocommit=0;
	start transaction WITH CONSISTENT SNAPSHOT;
	select cuenta into @numerocta from `cont-cuenta` where `cuenta`=numcta;
	if @numerocta = numcta then
                set mensaje = 0;
	else
		insert into `cont-cuenta` (cuenta,nombre,tipo,mayor,fechalta,clase) values (numcta,nombcta,tcuenta,ctamayor,fechacuenta,clase);
		show count(*) errors;
		if @@error_count > 0 then
			rollback;
                        set mensaje = 1;
		else
			if ctamayor<>1 then
				if @subctade <> subcta then
					rollback;
                                        set mensaje = 2;
				else
					if @cmayscta <= ctamayor then
						show count(*) errors;
						if @@error_count > 0 then
							rollback;
                                                        set mensaje = 3;
						else
							commit;
                                                        set mensaje = 4;
						end if;
					else
						rollback;
                                                set mensaje = 5;
					end if; ########
				end if;
			else
				commit;
                                set mensaje = 6;
			end if;
		end if;
	end if;
END
Dentro del procedimiento le asigno a mensaje (parametro de salida de tipo INT) un valor entero, y ese valor lo quiero de regreso en mi aplicacion VB dentro de la variable msg... pero me marca un error, el cual no se si sea por cuestion de MySQL que aun ande mal en el paso de parametros de salida o sea en la forma en la cual llamo al procedimiento... este es el error que me manda:

Código:
OUT or INOUT argument 8 for routine sglamesa.ProcInsCta is not a variable or NEW pseudo-variable in BEFORE trigger
Espero su ayuda :D

Saludos

Última edición por mankel; 01/10/2007 a las 11:09
  #4 (permalink)  
Antiguo 02/10/2007, 08:22
 
Fecha de Ingreso: marzo-2007
Ubicación: Celayork
Mensajes: 38
Antigüedad: 17 años, 1 mes
Puntos: 3
Re: MySQL con InnoDB

Foreros, pues despues de mucho buscar encontre lo que parece ser la solución al error que marcaba:
Código:
OUT or INOUT argument 8 for routine sglamesa.ProcInsCta is not a variable or NEW pseudo-variable in BEFORE trigger
No entindi porque devuelve ese error, pero esto fue lo que hice siguiendo un ejemplo que encontre en el foro oficial de mysql:

Agregue un nuevo SP, el cual seria llamado desde la aplicacion VB, este solamente recibiria los valores que serian evaluados y posteriormente grabados en la BD si todo salia bien. Este SP a su vez llamaba a otro SP al cual enviaba esos mismos parametros y ademas agregaba un parametro INOUT (la cual era la que marcaba error):

Código:
CREATE DEFINER=`root`@`localhost` PROCEDURE `ProcGetMsg`(numcta char(9), nombcta varchar(90), tcuenta char(1), ctamayor int, fechacuenta char(10), clase char(1), subcta char(9))
BEGIN
	DECLARE a INT DEFAULT 0;
	CALL ProcInsCta(numcta, nombcta, tcuenta, ctamayor, fechacuenta, clase, subcta, a);
	SELECT a;
END

Aca esta el otro SP que llama ProcGetMsg:

Código:
CREATE DEFINER=`root`@`localhost` PROCEDURE `ProcInsCta`(numcta char(9), nombcta varchar(90), tcuenta char(1), ctamayor int, fechacuenta char(10), clase char(1), subcta char(9), INOUT mensaje int(1))
BEGIN
        #declare mensaje int;
        set @numerocta= NULL, @subctade= NULL, @cmayscta=NULL;
	set autocommit=0;
	start transaction WITH CONSISTENT SNAPSHOT;
	select cuenta into @numerocta from `cont-cuenta` where `cuenta`=numcta;
	if @numerocta = numcta then
		#select 'La cuenta que intenta agregar ya existe';
                set mensaje = 1;
	else
		insert into `cont-cuenta` (cuenta,nombre,tipo,mayor,fechalta,clase) values (numcta,nombcta,tcuenta,ctamayor,fechacuenta,clase);
		show count(*) errors;
		if @@error_count > 0 then
			rollback;
                        set mensaje = 2;
		else
			if ctamayor<>1 then
				select cuenta, mayor into @subctade, @cmayscta from `cont-cuenta` where `cuenta`=subcta;
				if @subctade <> subcta then
					rollback;
                                        set mensaje = 3;
				else
					if @cmayscta <= ctamayor then
						insert into `cont-ctasoc` (ctasup,subcta) values (subcta,numcta);
						show count(*) errors;
						if @@error_count > 0 then
							rollback;
							#select 'Error al insertar registro en cont-ctasoc. No se agrego el registro';
                                                        set mensaje = 4;
						else
							commit;
							#select 'El registro se ha guardado con exito. cont-cuenta y cont-ctasoc';
                                                        set mensaje = 5;
						end if;
					else
						rollback;
						#select 'La cuenta superior no puede ser de menor rango que la cuenta que intenta agregar';
                                                set mensaje = 6;
					end if; ########
				end if;
			else
				commit;
				#select 'El registro se ha guardado con exito. cont-cuenta';
                                set mensaje = 7;
			end if;
		end if;
	end if;
END
Sorpresivamente ya no me marca error, y obviamente ya graba en la BD si los valores son validos.

Ahora lo que si me gustaria saber, es como demonios rescato ese valor de "a" que esta en el SP ProcGetMsg y lo tome VB... alguien sabe?

Se supone que en consola, esta instruccion despliega en pantalla el valor de la variable "a":

Código:
SELECT a;
Como rescato ese valor y vaya a VB????

Gracias
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:46.