Ver Mensaje Individual
  #1 (permalink)  
Antiguo 26/09/2007, 08:56
mankel
 
Fecha de Ingreso: marzo-2007
Ubicación: Celayork
Mensajes: 38
Antigüedad: 17 años, 2 meses
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