Colabora .NET |
Crear clases y colecciones automáticamente desde MySQLComo crear clases, colecciones y stored procedures automáticamente conectándose a Mysql y .NET, acelera el desarrollo
Fecha: 27/Ago/2006 (24 agosto 2006)
|
IntroducciónMuchas veces, cuando desarrollo, muy en particular, prefiero invertir un poco de tiempo en cosas que me ahorren un mucho de tiempo en el futuro. Como mis aplicaciones casi siempre se llevan de piquete en el ombligo con las bases de datos, mucho de mi tiempo se va en estar creando los procedimientos y las clases que se comunican con esas bases de datos. Además, soy un fiel seguidor de la reutilización de código; por tanto, eso de escribir en cada aplicación/pagina de .net los controles y código para conectarme a una bd (dataadapter, dataset, commands, etc etc) se me hace un poco grotesco. En mi muy humilde opinión, es mejor diseñar clases reutilizables y apoyarse en estos objetos cuando convenga. Así que, crear clases y colecciones + procedimientos de la BD es simplemente muy costoso en tiempo.
El código:
Pues si, debido a mis problemas existenciales, me generé una aplicación que se conecta a mysql y me crea mis clases y mis colecciones basados en las tablas de la base de datos que escoja :p.
Como es esto. Primero, pues hay que entender como esta formada una clase y una colección; pero, eso es harina de otro costal, aquí te explico las cosas que hice para lograr formar “esa estructura”.
Los detalles de cómo se va armando tomando en cuenta llaves primarias y esas artes oscuras lo puedes checar en la colección CMiembrosMySQL.
El funcionamiento básicamente sería:
#Region "Variables" 'Esta es mi conexion mysql Private objConexion As CConexionMySQL Private ds As DataSet 'Aqui guardo los campos de la bd, 'y también guardo el nombre de la propiedad publica de la clase Private dtCampos As DataTable 'Esta va a ser la colección que tendrá todos los elemntos para crear: '1) La clase '2) La coleccion '3) Los stored procedures ' (NOTA: esto brinda un stored procedure básico de guardado/Editado y lectura) ' Las personalizaciones de lectura con subcatalogos ' o cosas similares, deberás programarla tu hehe Private objMiembros As New CMiembrosMySQL #End Region Para conectarnos a la BD necesitamos algo como esto: 'Esto me da una conexion a la bd Private Sub btnConectar_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnConectar.Click Dim bConectado As Boolean 'Esta es una clase que hice para hacer conexiones a base de datos, 'en este caso es de mysql objConexion = New CConexionMySQL(txtUser.Text, _ txtPassword.Text, _ txtDB.Text, _ txtServer.Text) 'Aqui simplemente nos conectamos bConectado = objConexion.ConnectToDatabase() If bConectado Then If ds Is Nothing Then ds = New DataSet 'Carga las tablas disponibles del servidor en el dataset 'Esto lo hace con instrucciones de mysql If objConexion.Consulta("show tables", "tablas", ds) Then With cmbTablas .DataSource = ds.Tables("tablas") .ValueMember = ds.Tables("tablas").Columns(0).Caption .DisplayMember = .ValueMember End With btnConsultaTabla.Enabled = True Else btnConsultaTabla.Enabled = False End If Else MessageBox.Show("No se pudo conectar con la base de datos", "Avner", _ MessageBoxButtons.OK) End If End Sub
Para hacer la transformación de tipos de mysql a vb.net necesitamos una interface, esta función nos sirve (editala para agregar todos los tipos y su equivalencia, solo puse los más comunes para mí)
'Esta funcion busca el tipo equivalente de vb.net para el tipo almacenado en mysql Private Sub TiposVB(ByRef objMiembro As CMiembroMySQL, ByRef strPrefijo As String) 'Modificar esta seccion para incluir los tipos que se utilizarán en MySQL 'Esto con el fin de crear el tipo de dato en la clase que pueda almacenar 'la información, el prefijo solo es para armar la clase 'NOTA: si tienes campos BLOB o alguno que no veas en la lista, solo agregalo en otro ' case para que asignes el tipo de dato correcto en vb.net Dim arr1(), arr2(), arr3() As String Dim strTipo As String Try 'Con esto separamos el tipo de la precisión arr1 = Split(objMiembro.TipoBD, "(") 'invariablemente, en el elemento cero, esta el tipo, halla o no 'tamaño y precision objMiembro.TipoBD = arr1(0).ToUpper() 'De acuerdo al tipo de mysql, sacamos el tipo de VB 'Recuerda, agregale los tipos que consideres necesarios Select Case objMiembro.TipoBD Case "TINYINT", "SMALLINT", "BIT" strTipo = "Short" strPrefijo = "s" Case "VARCHAR", "CHAR" strTipo = "String" strPrefijo = "str" Case "BOOLEAN" strTipo = "Boolean" strPrefijo = "bol" Case "FLOAT", "DECIMAL", "DOUBLE" strTipo = "Decimal" strPrefijo = "dec" Case "INTEGER", "MEDIUMINT", "INT" strTipo = "Integer" strPrefijo = "int" Case "BIGINT" strTipo = "Long" strPrefijo = "lng" Case "DATETIME", "DATE" strTipo = "DateTime" strPrefijo = "dt" Case Else strTipo = "Object" strPrefijo = "obj" End Select objMiembro.Tipo = strTipo objMiembro.Prefijo = strPrefijo 'Si el tamaño del arreglo es 2, quiere decir que hay tamaño y/o precision, 'nos interesa solo el tamaño (VG puede ser varchar(200), decimal(10,3) If arr1.Length = 2 Then arr2 = Split(arr1(1), ")") 'tenemos ya sea el tamaño o el tamaño y precision en el elemento 0, 'nos interesa solo el tamaño para los stored procedures que piden tipo y tamaño arr3 = Split(arr2(0), ",") 'Ahora, el tamaño esta en la posición 0 de arr3 objMiembro.Tamano = arr3(0) End If Catch ex As Exception strPrefijo = "obj" End Try End Sub
'Si puede leer las columnas de la tabla, entonces las muestra y permite editar el 'nombre de la propiedad que representará la columna, la tabla dtCampos tendrá solo 'los datos que necesitamos (field, property, type, ESPK -nos dice si usamos los campos ' llave para hacer las selecciones-) If objConexion.Consulta("SHOW columns from " & Me.cmbTablas.SelectedValue, _ "campos", ds) Then
'Aqui es donde realmente se genera nuestra clase y colección Private Sub btnGenerar_Click_1( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnGenerar.Click Dim objMiembro As CMiembroMySQL Dim strPrefijo As String = "" Dim strClase As String Try objMiembros = New CMiembrosMySQL dtCampos.AcceptChanges() For Each drow As DataRow In dtCampos.Rows objMiembro = New CMiembroMySQL 'obtenemos el tipo, 'se asigna tambien un 'tipo completo' porque: ' 1) TipoDB tendrá el tipo de la base de datos ' 2) TipoDBCompleto incluirá el tamaño y la precisión (si aplica) ' -- esto nos sirve en los stored procedures objMiembro.TipoBD = drow("Type") objMiembro.TipoBDCompleto = drow("type") 'Indicador de si es llave primaria objMiembro.EsPK = IIf(drow("key") = "PRI", True, False) 'Del tipo mysql, saca el tipo VB y asigna el tipo correcto 'y tamaño desglosado de mysql TiposVB(objMiembro, strPrefijo) objMiembro.Propiedad = drow("property") objMiembro.NombreCompleto = "m_" & strPrefijo & "_" & drow("property") objMiembro.Prefijo = strPrefijo 'por default pone los datos privados con propiedades publicas, ' edita al final si consideras necesario objMiembro.Ambito = "private" objMiembro.CampoBD = drow("field") objMiembros.Agregar(objMiembro) objMiembro = Nothing Next 'Los nombres de la clase y la coleccion los proporciona el usuario 'Para mis estándares XD siempre antepongo a las clases la letra C 'Asi, mi clase para el catalogo de Cheques, sera CCheque y la coleccion CCheques 'El programa antepone esta C, entonces los nombres que proporciono son 'Cheque y Cheques (que tambien se usa para crear los nombres de los stored procedures) objMiembros.NombreClase = txtNombreClase.Text objMiembros.NombreColeccion = txtNombreColeccion.Text 'Aqui se genera la clase tal cual, checate el archivo 'CCREACLASESMYSQL (clase CMiembrosMysql, funcion genera clase) 'Ahi esta la verdad absoluta de esto, solamente genera la cadena basado en los datos 'es algo tedioso y largo pero ahorra mucho tiempo en proyectos que tienes 80 catalogos 'y al igual que yo tal vez prefieras diseñar tus clases ' para reutilizar objetos en diferentes 'partes de tu programa, 'LO QUE GENERA ES: '1) La clase del objeto individual con ' 1.1) Una region de datos miembro ' 1.2) Una region de propiedades ' 1.3) Una region de funciones (Lectura, guardado, ' si quieres incluir el borrado, ' basicamente duplica la lectura pero con un sp diferente) ' 1.4) El constructor '2) La coleccion (para que manejes tus objetos y puedas asignar datagrids y cosas asi ' 1.1) funciones para manejar la coleccion ' 1.2) Guardado ' 1.3) Lectura ' 1.4) Ordenamiento (comentado, ya que esto hay que personalizarlo) ' 1.5) Filtrado (comentado, ya que esto hay que personalizarlo) strClase = objMiembros.GeneraClase() btnGeneraSP.Enabled = True rtxtClase.Text = strClase Dim sfdGuardar As New System.Windows.Forms.SaveFileDialog With sfdGuardar .DefaultExt = "vb" .Title = "Escoge el archivo para guardar la clase" .FileName = objMiembros.NombreColeccion + "." + .DefaultExt If .ShowDialog() = DialogResult.OK Then rtxtClase.SaveFile(.FileName, _ RichTextBoxStreamType.PlainText) End If End With btnGeneraSP.Enabled = True Catch ex As Exception btnGeneraSP.Enabled = False End Try End Sub
'Este genera los Stored procedures, 'no saben cuanto tiempo de desarrollo me he ahorrado por que 'me genere toda la lista de inserciones, actualizaciones y lectura 'al menos elimino todos los errores de tipear mal el nombre de los campos y cosas asi Private Sub btnGeneraSP_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnGeneraSP.Click If objMiembros Is Nothing Then MessageBox.Show("Genere primero la clase", "Atencion", MessageBoxButtons.OK) Exit Sub End If 'Aqui se genera la clase tal cual, checate el archivo 'CCREACLASESMYSQL (clase CMiembrosMysql, funcion GeneraSPs) rtxtClase.Text = objMiembros.GeneraSPs() Dim sfdGuardar As New System.Windows.Forms.SaveFileDialog With sfdGuardar .DefaultExt = "sql" .Title = "Escoge el archivo para guardar el script" .FileName = objMiembros.NombreColeccion + "." + .DefaultExt If .ShowDialog() = DialogResult.OK Then rtxtClase.SaveFile(.FileName, _ RichTextBoxStreamType.PlainText) End If End With End Sub
NOTA IMPORTANTE:Necesitas bajarte el driver de MySQL para .NET, lo encuentras en www.mysql.com, lo instalas y lo agregas a las referencias del proyecto
LISTO, ESPERO QUE ESTO LES SIRVA COMO ME HA SERVIDO A MÍ Y SI TIENEN DUDA DE ALGO, ME PREGUNTAN. Saludos cordiales,Omar Jonguitud
Espacios de nombres usados en el código de este artículo:MySQL.Data
|
Código de ejemplo (ZIP): |
Fichero con el código de ejemplo: ojonguitud_coleccionesmysql.zip - 31.7 KB
|