InicioInfoMultiples Transacciones en MySQL (VB.Net 2010)

Multiples Transacciones en MySQL (VB.Net 2010)

Info8/23/2011
Hola amigos, éste es mi primer Post y quise compartir algunos de mis conocimientos en Programación con VB.NET Estoy desarrollando algunas aplicaciones en VB.Net y necesitaba utilizar transacciones para asegurarme de las operaciones se ejecutaran correctamente (operaciones contables mas que todo), luego de estudiar bien el código, fui puliéndolo un poco para hacerlo mas práctico a la hora de usarlo. Básicamente son 2 sub procedimientos públicos que corren dentro de un modulo para poderlos llamar desde cualquier parte de los formularios, acá está el código que utilicé: PARA MySQL o MariaDB USAR ESTE CÓDIGO: OJO: para que el código funcione correctamente debemos agregar al proyecto la librería de "ADO.NET Driver for MySQL (Connector/NET)" que pueden descargar libremente desde la pagina de Oracle Enlace Principal principal de la pagina: http://www.mysql.com/downloads/connector/net/ Enlace del paquete sin instalación con las librerías básicas necesarias: http://mysql.mirror.iweb.ca/Downloads/Connector-Net/mysql-connector-net-6.4.3-noinstall.zip El archivo a importar se llama "mysql.data.dll" y se debe agregar al proyecto en el menú: Proyecto-> Agregar Referencia-> Buscar Agregar un Módulo al proyecto (en este caso lo llamé "MySQL.vb" ) y le agregamos el siguiente código: --------------------------------------------------------------------------------------------------------------------------------------------- Imports MySql.Data.MySqlClient Module MySQL Public Data_Adapter_MySQL As MySqlDataAdapter Public Conexion_MySQL As MySqlConnection Public Cadena_de_Conexion As String = Cadena_de_Conexion = "Server=123.123.123.123;Port=3306;database=BASE_DE_DATOS;Uid=USUARIO;Pwd=CONTRASEÑA;" 'Los datos de la cadena de conexión normalmente se guardan en la configuración del pograma como la IP del servidor, el puerto etc... 'Acá deben completarlos manualmente Public Sub Ejecutar_Transaccion_MySQL(ByRef Consultas As String) Try Dim Conexion_MySQL As MySqlConnection = New MySqlConnection(Cadena_de_Conexion) Conexion_MySQL.Open() Dim transaccion As MySqlTransaction Dim comando As MySqlCommand 'Crear un arreglo de memoria y cargar en cada vector las consultas separadas por punto y coma Dim Array_Consultas() As String Array_Consultas = Split(Consultas, ";"; ) transaccion = Conexion_MySQL.BeginTransaction For i = LBound(Array_Consultas) To UBound(Array_Consultas) - 1 comando = New MySqlCommand(Array_Consultas(i), Conexion_MySQL) comando.Transaction = transaccion comando.ExecuteNonQuery() Next transaccion.Commit() Conexion_MySQL.Close() MsgBox("Transacción Finalizada con Exito!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "Transacción Procesada"; ) Catch ex As Exception MsgBox("No se pudo ejecutar la transacción!", MsgBoxStyle.Exclamation + MsgBoxStyle.OkOnly, "Error en la transacción"; ) MsgBox(ex.ToString, MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "Detalles del error"; ) End Try End Sub Public Sub Consultar_Tabla_MySQL(ByVal Consulta As String) Try Dim conexion As New MySqlConnection(Cadena_de_Conexion) Conexion_MySQL.Open() Data_Adapter_MySQL = New MySqlDataAdapter(Consulta, conexion) Tabla = New DataTable Data_Adapter_MySQL.Fill(Tabla) conexion.Close() Catch exSql As MySqlException MsgBox(exSql.Message.ToString) Catch ex As Exception MsgBox(ex.Message.ToString) End Try End Sub End Module -------------------------------------------------------------------------------------------------------------------------------- Para utilizar ejecutar multiples transacciones debemos llamar al sub procedimiento "Ejecutar_Transaccion_MySQL" y pasarle las cadenas SQL (Solamente para INSERT, UPDATE y DELETE), Ejemplo: Ejecutar_Transaccion_MySQL("INSERT INTO `tabla1`(campo1, campo2) VALUES ('valor1', 'valor2'); " + "INSERT INTO `tabla2 (campo1, campo2) VALUES ('valor1', 'valor2');" + "CONSULTA 3;" + "CONSULTA 4;"; ) OJO: -Todas las consultas van separadas por punto y coma -Se deben respetar las comillas simples en los campos que lo amerite -Si una sola consulta falla o no puede ser ejecutada entonces no se va a ejecutar ninguna -El procedimiento se encarga de separar todas las consultas, subirlas una por una y luego ejecutar la transacción completa -Se pueden ejecutar tantas transacciones como se quiera -Las transacciones se pueden ejecutar sobre diferentes tablas y pueden ser diferentes tipos juntos (INSERT + UPDATE + INSERT + ...) -Ademas de estas 3 operaciones básicas también se pueden usar los comandos TRUNCATE, DROP, CREATE y ALTER TABLE Para consultar una tabla debemos llamar el procedimiento Consultar_Tabla_MySQL y pasarle la consulta SELECT, el resultado se cargará en la variable "Tabla" de tipo DataTable, que puede ser cargada en listas o data grids o ser leída localmente con el código respectivo, Ejemplo: Consultar_Tabla_MySQL("Select * from `tabla`"; ) 'para llenar un data grid con la tabla consultada debemos usar este codigo: DataGridView1.DataSource = Tabla 'Si queremos limpiar o descargar la tabla de la memoria podemos usar: Tabla.Clear() ó Tabla.Dispose() 'Si queremos contar los registros cargados en la tabla usamos las funciones básicas de cualquier RecordSet: Variable = Tabla.Rows.Count.ToString 'Si queremos extraer el campo de una fila usaremos el siguiente código: Variable = Tabla.Rows(N1).Item(N2) 'Donde N1 es la fila de la tabla y N2 es el indice de la columna de base cero 'Si queremos leer el registro ubicado entre la primera fila y la tercera columna podemos usar cualquiera de estas 2 linea de codigo: Variable = Tabla.Rows(0).Item(2) 'ó Variable = Tabla.Rows(0).Item("nombre_columna") 'Noten que como ambos indices son de base cero la primera posición empieza en 0 y la tercera columna será referenciada con el numero 2 Para cargar varios registros en un ComboBox podemos usar algo como esto: For i = 0 To Tabla.Rows.Count - 1 Combobox1.Items.Add(Tabla.Rows(i).Item("columna1").ToString + " " + Tabla.Rows(i).Item("columna2").ToString) Next OJO: -Solo se puede hacer una consulta para recoger los datos pero la consulta puede ser anidada y seleccionar de varias tablas -No es necesario limpiar o desechar el DataTable cada vez que se quiera consultar otra tabla ya que se limpia automáticamente al ejecutar otra consulta, solo se limpia para quitarla de la memoria en los casos en los que sea demasiado grande. -La consulta a ejecutar siempre debe terminar en punto y coma Bueno, creo que por ahora eso es suficiente por hoy, como pueden ver el codigo es sencillo y lo simplifiqué para solo se tengan que llamar a cualquiera de los 2 sub procedimientos para ejecutar cualquier consulta SQL y ademas se pueden usar las consultas DDL como DROP o CREATE sin problemas y en modo transacción. Hay muchas otras mejoras y optimizaciones que no utilicé porque no estaban tan relacionadas con el tema tratado como por ejemplo: -Guardar los datos de conexión (servidor, puerto, base de datos) en la configuración de la aplicación -Usar un procedimiento para generar la cadena de conexión con la información de la configuración y los datos introducidos por el usuario. -La conexión solo se debería de abrir al ejecutar la primera consulta y cerrarla al finalizar la aplicación, no abrirla y cerrarla en cada consulta. -Este código sirve también para Visual Basic.Net 2003/2005/2008. Si quieren leer un poco acerca de como funcionan las transacciones en SQL y su importancia podemos ver este ejemplo en Wikipedia: http://es.wikipedia.org/wiki/Transacción_(informática) Si me dejan unos puntitos no me molesto, quisiera crear una comunidad para compartir mas códigos y ayudar a otros colegas con sus dudas, por ahora, cualquier duda o código que necesiten dejen un comentario. ACTUALIZADO: Si tienen alguna duda puedo ayudarlos directamente si entran al area de soporte on line de mi sitio web: www.solucionesrys.com Aca el proyecto hecho en Visual Studio 2012: https://www.dropbox.com/s/in7rkfu9d4recsl/Acceso%20a%20Datos%20MySQL.zip
Datos archivados del Taringa! original
51puntos
7,095visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
2visitas
0comentarios
Dar puntos:

Dejá tu comentario

0/2000

Autor del Post

r
reyxv16🇦🇷
Usuario
Puntos0
Posts1
Ver perfil →
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.