MySQL: Stored procedures y transacciones
Publicado por Miguel Angel (4 intervenciones) el 26/09/2007 16:32:04
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:
[CODE]Ejecuta("call ProcInsCta('" & numcta & "','" & txtnombre.Text & "','" & tcuenta & "','" & ctamayor & "','" & fechacuenta & "','" & clase & "','" & subcuenta & "')")[/CODE]
Funcion ejecuta
[CODE]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[/CODE]
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:
[CODE]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[/CODE]
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
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:
[CODE]Ejecuta("call ProcInsCta('" & numcta & "','" & txtnombre.Text & "','" & tcuenta & "','" & ctamayor & "','" & fechacuenta & "','" & clase & "','" & subcuenta & "')")[/CODE]
Funcion ejecuta
[CODE]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[/CODE]
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:
[CODE]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[/CODE]
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
Valora esta pregunta


0