Actualizado: 14/Jul/2004
Autor: Guillermo 'guille' Som
Volver al índice de Generar clases para acceder a una tabla o al de la librería
El código de la librería: CrearClase, CrearClaseOleDb, CrearClaseSQL, ConvLang
El código de Visual Basic .NET
'------------------------------------------------------------------------------ ' Clase genérica para crear una clase (13/Jul/04) ' Esta clase se usará como base de las de SQL y OleDb ' ' ©Guillermo 'guille' Som, 2004 '------------------------------------------------------------------------------ Option Strict On Option Explicit On ' Imports Microsoft.VisualBasic Imports System Imports System.Collections ' Imports System.Data Imports System.Data.SqlClient Imports System.Data.OleDb Namespace elGuille.Data.CodeGenerator Public Class CrearClase ' Protected Shared mDataTable As New DataTable Protected Shared cadenaConexion As String Protected Shared nombreTabla As String = "Tabla1" ' Public Shared Conectado As Boolean ' ' Campos para usar desde las clases derivadas ' para usar con SQL Private Shared dataSource As String Private Shared initialCatalog As String Private Shared userId As String Private Shared usarSeguridadSQL As Boolean ' ' para usar con OleDb (Access) Private Shared baseDeDatos As String Private Shared provider As String ' ' para ambos tipos de bases de datos Private Shared usarCommandBuilder As Boolean = True Private Shared dbPrefix As String = "Sql" Private Shared password As String Private Shared esSQL As Boolean Private Shared lang As eLenguaje Private Shared nombreClase As String Private Shared cadenaSelect As String ' ' estos métodos sólo se usarán desde las clases derivadas Protected Shared Function GenerarClaseOleDb(ByVal lang As eLenguaje, _ ByVal usarCommandBuilder As Boolean, _ ByVal nombreClase As String, _ ByVal baseDeDatos As String, _ ByVal cadenaSelect As String, _ ByVal password As String, _ ByVal provider As String) As String esSQL = False If provider = "" Then provider = "Microsoft.Jet.OLEDB.4.0" End If CrearClase.lang = lang CrearClase.usarCommandBuilder = usarCommandBuilder CrearClase.baseDeDatos = baseDeDatos CrearClase.nombreClase = nombreClase CrearClase.cadenaSelect = cadenaSelect CrearClase.password = password CrearClase.provider = provider dbPrefix = "OleDb" ' Return generarClase() End Function ' Protected Shared Function GenerarClaseSQL(ByVal lang As eLenguaje, _ ByVal usarCommandBuilder As Boolean, _ ByVal nombreClase As String, _ ByVal dataSource As String, _ ByVal initialCatalog As String, _ ByVal cadenaSelect As String, _ ByVal userId As String, _ ByVal password As String, _ ByVal usarSeguridadSQL As Boolean) As String esSQL = True CrearClase.lang = lang CrearClase.usarCommandBuilder = usarCommandBuilder CrearClase.nombreClase = nombreClase CrearClase.dataSource = dataSource CrearClase.initialCatalog = initialCatalog CrearClase.cadenaSelect = cadenaSelect CrearClase.userId = userId CrearClase.password = password CrearClase.usarSeguridadSQL = usarSeguridadSQL dbPrefix = "Sql" ' Return generarClase() End Function ' Private Shared Function generarClase() As String ' generar la clase a partir de la tabla seleccionada, ' las columnas son los campos a usar ' '////////////////////////////////////////////////////////////////// ' TODO: Algunas cosas a mejorar (12/Jul/04) ' +No usar de forma predeterminada "ID" como campo índice ' intentar buscar el campo "AutoIncrement" o "Unique" ' +Dejar de forma predeterminada el CommandBuilder ' aunque el resto de comandos dejarlos comentados para revisar ' +Que esta función sirva tanto para SQL como para OleDb ' aunque haya que hacer dos funciones "intermedias" ' para que no haya que pasar parámetros no usados, como usarSeguridadSQL ' -Arreglar cuando sean datos "LongBinary -> Byte()" ' -Tener en cuenta que los nombres de los campos pueden tener ' caractes no válidos '////////////////////////////////////////////////////////////////// ' Dim sb As New System.Text.StringBuilder Dim s As String Dim sb1 As System.Text.StringBuilder Dim sb2 As System.Text.StringBuilder Dim sb3 As System.Text.StringBuilder Dim campoIDnombre As String = "ID" Dim campoIDtipo As String = "System.Int32" Dim campos As New Hashtable Dim novalidos As String = " -ºª!|@#$%&/()=?¿*+^'¡-<>,.;:{}[]Çç€\" & Chr(34) & vbTab ' ' buscar el campo autoincremental de la tabla (12/Jul/04) ' también se buscará si es Unique For Each col As DataColumn In mDataTable.Columns ' comprobar si tiene caracteres no válidos (14/Jul/04) ' en caso de que sea así, sustituirlos por un guión bajo Dim i As Integer s = col.ColumnName Do i = s.IndexOfAny(novalidos.ToCharArray) If i > -1 Then If i = s.Length - 1 Then s = s.Substring(0, i) & "_" ElseIf i > 0 Then s = s.Substring(0, i) & "_" & s.Substring(i + 1) Else s = "_" & s.Substring(i + 1) End If End If Loop While i > -1 campos.Add(col.ColumnName, s) ' ' No siempre el predeterminado es AutoIncrement If col.AutoIncrement OrElse col.Unique Then campoIDnombre = s 'col.ColumnName campoIDtipo = col.DataType.ToString 'Exit For End If Next ' ' ConvLang.Lang = lang sb.AppendFormat("{0}{1}", ConvLang.Comentario("------------------------------------------------------------------------------"), vbCrLf) If esSQL Then sb.AppendFormat("{0} Clase {1} generada automáticamente con CrearClaseSQL{2}", ConvLang.Comentario(), nombreClase, vbCrLf) sb.AppendFormat("{0} de la tabla '{1}' de la base '{2}'{3}", ConvLang.Comentario(), nombreTabla, initialCatalog, vbCrLf) Else sb.AppendFormat("{0} Clase {1} generada automáticamente con CrearClaseOleDb{2}", ConvLang.Comentario(), nombreClase, vbCrLf) sb.AppendFormat("{0} de la tabla '{1}' de la base '{2}'{3}", ConvLang.Comentario(), nombreTabla, baseDeDatos, vbCrLf) End If sb.AppendFormat("{0} Fecha: {1}{2}", ConvLang.Comentario(), DateTime.Now.ToString("dd/MMM/yyyy HH:mm:ss"), vbCrLf) sb.AppendFormat("{0}{1}", ConvLang.Comentario(), vbCrLf) If DateTime.Now.Year > 2004 Then sb.AppendFormat("{0}{1}", ConvLang.Comentario(String.Format(" ©Guillermo 'guille' Som, 2004-{0}", DateTime.Now.Year)), vbCrLf) Else sb.AppendFormat("{0}{1}", ConvLang.Comentario(" ©Guillermo 'guille' Som, 2004"), vbCrLf) End If sb.AppendFormat("{0}{1}", ConvLang.Comentario("------------------------------------------------------------------------------"), vbCrLf) ' If lang = eLenguaje.eVBNET Then sb.AppendFormat("Option Strict On{0}", vbCrLf) sb.AppendFormat("Option Explicit On{0}", vbCrLf) sb.AppendFormat("{0}{1}", ConvLang.Comentario(), vbCrLf) End If ' las importaciones de espacios de nombres sb.AppendFormat("{0}{1}", ConvLang.Imports("System"), vbCrLf) sb.AppendFormat("{0}{1}", ConvLang.Imports("System.Data"), vbCrLf) If esSQL Then sb.AppendFormat("{0}{1}", ConvLang.Imports("System.Data.SqlClient"), vbCrLf) Else sb.AppendFormat("{0}{1}", ConvLang.Imports("System.Data.OleDb"), vbCrLf) End If sb.AppendFormat("{0}{1}", ConvLang.Comentario(), vbCrLf) ' ' declaración clase sb.AppendFormat("{0}{1}", ConvLang.Class("Public", nombreClase), vbCrLf) ' '------------------------------------------------------------------ ' los campos privados para usar con las propiedades '------------------------------------------------------------------ sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" Las variables privadas"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" TODO: Revisar los tipos de los campos"), vbCrLf) For Each col As DataColumn In mDataTable.Columns 'sb.AppendFormat(" {0}{1}", ConvLang.Variable("Private", "_" & col.ColumnName, col.DataType.ToString), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Variable("Private", "_" & campos(col.ColumnName).ToString, col.DataType.ToString), vbCrLf) Next sb.AppendFormat(" {0}{1}", ConvLang.Comentario(""), vbCrLf) ' ' ajustarAncho: método privado para ajustar los caracteres de los campos de tipo String sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" Este método se usará para ajustar los anchos de las propiedades"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Function("Private", "ajustarAncho", "String", "cadena", "String", "ancho", "Integer"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.VariableNewParam("Dim", "sb", "System.Text.StringBuilder", "New String("" ""c, ancho)"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" devolver la cadena quitando los espacios en blanco"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" esto asegura que no se devolverá un tamaño mayor ni espacios ""extras"""), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Return("(cadena & sb.ToString()).Substring(0, ancho).Trim()"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndFunction(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) ' ' Propiedades públicas de instancia ' '------------------------------------------------------------------ ' propiedades públicas mapeadas a cada columna de la tabla '------------------------------------------------------------------ sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" Las propiedades públicas"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" TODO: Revisar los tipos de las propiedades"), vbCrLf) For Each col As DataColumn In mDataTable.Columns If col.DataType.ToString = "System.Byte[]" Then sb.AppendFormat(" {0}{1}", ConvLang.Property("Public", "System.Byte()", campos(col.ColumnName).ToString), vbCrLf) Else sb.AppendFormat(" {0}{1}", ConvLang.Property("Public", col.DataType.ToString, campos(col.ColumnName).ToString), vbCrLf) End If sb.AppendFormat(" {0}{1}", ConvLang.Get(), vbCrLf) If col.DataType.ToString <> "System.String" Then sb.AppendFormat(" {0}{1}", ConvLang.Return(" _" & campos(col.ColumnName).ToString), vbCrLf) Else If col.MaxLength > 255 Then sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" Seguramente sería mejor sin ajustar el ancho..."), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(ConvLang.Return(String.Format("ajustarAncho(_{0},{1})", campos(col.ColumnName).ToString, col.MaxLength))), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Return(" _" & campos(col.ColumnName).ToString), vbCrLf) Else sb.AppendFormat(" {0}{1}", ConvLang.Return(String.Format("ajustarAncho(_{0},{1})", campos(col.ColumnName).ToString, col.MaxLength)), vbCrLf) End If End If sb.AppendFormat(" {0}{1}", ConvLang.EndGet(), vbCrLf) If col.DataType.ToString = "System.Byte[]" Then sb.AppendFormat(" {0}{1}", ConvLang.Set("System.Byte()"), vbCrLf) Else sb.AppendFormat(" {0}{1}", ConvLang.Set(col.DataType.ToString), vbCrLf) End If sb.AppendFormat(" {0}{1}", ConvLang.Asigna("_" & campos(col.ColumnName).ToString, "value"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndSet(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndProperty(), vbCrLf) Next sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) ' '------------------------------------------------------------------ ' Item: propiedad predeterminada (indizador) ' permite acceder a los campos mediante un índice numérico '------------------------------------------------------------------ sb.AppendFormat(" {0}{1}", ConvLang.Property("Public", "String", "index", "Integer"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" Devuelve el contenido del campo indicado en index"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" (el índice corresponde con la columna de la tabla)"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Get(), vbCrLf) For i As Integer = 0 To mDataTable.Columns.Count - 1 Dim col As DataColumn = mDataTable.Columns(i) If i = 0 Then sb.AppendFormat(" {0}{1}", ConvLang.If("index", "=", "0"), vbCrLf) Else sb.AppendFormat(" {0}{1}", ConvLang.ElseIf("index", "=", i.ToString), vbCrLf) End If If col.DataType.ToString = "System.Byte[]" Then ' TODO: convertir el array de bytes en una cadena... sb.AppendFormat(" {0}{1}", ConvLang.Return("<Binario largo>"), vbCrLf) Else sb.AppendFormat(" {0}{1}", ConvLang.Return("Me." & campos(col.ColumnName).ToString & ".ToString()"), vbCrLf) End If Next sb.AppendFormat(" {0}{1}", ConvLang.EndIf(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" Para que no de error el compilador de C#"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Return(Chr(34) & Chr(34)), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndGet(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Set("String"), vbCrLf) For i As Integer = 0 To mDataTable.Columns.Count - 1 Dim col As DataColumn = mDataTable.Columns(i) If i = 0 Then sb.AppendFormat(" {0}{1}", ConvLang.If("index", "=", "0"), vbCrLf) Else sb.AppendFormat(" {0}{1}", ConvLang.ElseIf("index", "=", i.ToString), vbCrLf) End If ' Select Case col.DataType.ToString Case "System.String" sb.AppendFormat(" {0}{1}", ConvLang.Asigna("Me." & campos(col.ColumnName).ToString, "value"), vbCrLf) Case "System.DateTime" sb.AppendFormat(" {0}{1}", ConvLang.Try(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Asigna("Me." & campos(col.ColumnName).ToString, "System.DateTime.Parse(value)"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Catch(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" TODO: Usa el valor de fecha que quieras predeterminar"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" Una fecha ficticia:"), vbCrLf) sb.AppendFormat(" {0}{1}{2}", ConvLang.Comentario(), ConvLang.AsignaNew("Me." & campos(col.ColumnName).ToString, "System.DateTime", "1900, 1, 1"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" o la fecha de hoy:"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Asigna("Me." & campos(col.ColumnName).ToString, "System.DateTime.Now"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndTry(), vbCrLf) Case "System.Int16", "System.Int32", "System.Int64", _ "System.Single", "System.Decimal", "System.Double", _ "System.Byte", "System.SByte", "System.UInt16", "System.UInt32", "System.UInt64" sb.AppendFormat(" {0}{1}", ConvLang.Try(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Asigna("Me." & campos(col.ColumnName).ToString, col.DataType.ToString & ".Parse(""0"" & value)"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Catch(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Asigna("Me." & campos(col.ColumnName).ToString, col.DataType.ToString & ".Parse(""0"")"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndTry(), vbCrLf) Case "System.Boolean" sb.AppendFormat(" {0}{1}", ConvLang.Try(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Asigna("Me." & campos(col.ColumnName).ToString, col.DataType.ToString & ".Parse(value)"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Catch(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Asigna("Me." & campos(col.ColumnName).ToString, "False"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndTry(), vbCrLf) Case "System.Byte[]" sb.AppendFormat(" {0} Es un Binario largo (array de Byte){1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0} y por tanto no se le puede asignar el contenido de una cadena...{1}", ConvLang.Comentario(), vbCrLf) Case Else sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" TODO: Comprobar la conversión a realizar"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(String.Format(" con el tipo {0}", col.DataType.ToString)), vbCrLf) sb.AppendFormat(" {2}{0}{1}", ConvLang.Asigna("Me." & campos(col.ColumnName).ToString, "value"), vbCrLf, ConvLang.Comentario()) sb.AppendFormat(" {0}{1}", ConvLang.Asigna("Me." & campos(col.ColumnName).ToString, col.DataType.ToString & ".Parse(value)"), vbCrLf) End Select Next sb.AppendFormat(" {0}{1}", ConvLang.EndIf(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndSet(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndProperty(), vbCrLf) ' '------------------------------------------------------------------ ' La propiedad Item usando el nombre de la columna (11/Jul/04) '------------------------------------------------------------------ sb.AppendFormat(" {0}{1}", ConvLang.Property("Public", "String", "index", "String"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" Devuelve el contenido del campo indicado en index"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" (el índice corresponde al nombre de la columna)"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Get(), vbCrLf) For i As Integer = 0 To mDataTable.Columns.Count - 1 Dim col As DataColumn = mDataTable.Columns(i) If i = 0 Then sb.AppendFormat(" {0}{1}", ConvLang.If("index", "=", Chr(34) & campos(col.ColumnName).ToString & Chr(34)), vbCrLf) Else sb.AppendFormat(" {0}{1}", ConvLang.ElseIf("index", "=", Chr(34) & campos(col.ColumnName).ToString & Chr(34)), vbCrLf) End If If col.DataType.ToString = "System.Byte[]" Then ' TODO: convertir el array de bytes en una cadena... sb.AppendFormat(" {0}{1}", ConvLang.Return("<Binario largo>"), vbCrLf) Else sb.AppendFormat(" {0}{1}", ConvLang.Return("Me." & campos(col.ColumnName).ToString & ".ToString()"), vbCrLf) End If Next sb.AppendFormat(" {0}{1}", ConvLang.EndIf(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" Para que no de error el compilador de C#"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Return(Chr(34) & Chr(34)), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndGet(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Set("String"), vbCrLf) For i As Integer = 0 To mDataTable.Columns.Count - 1 Dim col As DataColumn = mDataTable.Columns(i) If i = 0 Then sb.AppendFormat(" {0}{1}", ConvLang.If("index", "=", Chr(34) & campos(col.ColumnName).ToString & Chr(34)), vbCrLf) Else sb.AppendFormat(" {0}{1}", ConvLang.ElseIf("index", "=", Chr(34) & campos(col.ColumnName).ToString & Chr(34)), vbCrLf) End If ' Select Case col.DataType.ToString Case "System.String" sb.AppendFormat(" {0}{1}", ConvLang.Asigna("Me." & campos(col.ColumnName).ToString, "value"), vbCrLf) Case "System.DateTime" sb.AppendFormat(" {0}{1}", ConvLang.Try(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Asigna("Me." & campos(col.ColumnName).ToString, "System.DateTime.Parse(value)"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Catch(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" TODO: Usa el valor de fecha que quieras predeterminar"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" Una fecha ficticia:"), vbCrLf) sb.AppendFormat(" {0}{1}{2}", ConvLang.Comentario(), ConvLang.AsignaNew("Me." & campos(col.ColumnName).ToString, "System.DateTime", "1900, 1, 1"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" o la fecha de hoy:"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Asigna("Me." & campos(col.ColumnName).ToString, "System.DateTime.Now"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndTry(), vbCrLf) Case "System.Int16", "System.Int32", "System.Int64", _ "System.Single", "System.Decimal", "System.Double", _ "System.Byte", "System.SByte", "System.UInt16", "System.UInt32", "System.UInt64" sb.AppendFormat(" {0}{1}", ConvLang.Try(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Asigna("Me." & campos(col.ColumnName).ToString, col.DataType.ToString & ".Parse(""0"" & value)"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Catch(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Asigna("Me." & campos(col.ColumnName).ToString, col.DataType.ToString & ".Parse(""0"")"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndTry(), vbCrLf) Case "System.Boolean" sb.AppendFormat(" {0}{1}", ConvLang.Try(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Asigna("Me." & campos(col.ColumnName).ToString, col.DataType.ToString & ".Parse(value)"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Catch(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Asigna("Me." & campos(col.ColumnName).ToString, "False"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndTry(), vbCrLf) Case "System.Byte[]" ' sb.AppendFormat(" {0} Es un Binario largo (array de Byte){1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0} y por tanto no se le puede asignar el contenido de una cadena...{1}", ConvLang.Comentario(), vbCrLf) Case Else sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" TODO: Comprobar la conversión a realizar"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(String.Format(" con el tipo {0}", col.DataType.ToString)), vbCrLf) sb.AppendFormat(" {2}{0}{1}", ConvLang.Asigna("Me." & campos(col.ColumnName).ToString, "value"), vbCrLf, ConvLang.Comentario()) sb.AppendFormat(" {0}{1}", ConvLang.Asigna("Me." & campos(col.ColumnName).ToString, col.DataType.ToString & ".Parse(value)"), vbCrLf) End Select Next sb.AppendFormat(" {0}{1}", ConvLang.EndIf(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndSet(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndProperty(), vbCrLf) ' ' sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" Campos y métodos compartidos (estáticos) para gestionar la base de datos"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) ' '------------------------------------------------------------------ ' la cadena de conexión '------------------------------------------------------------------ sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" La cadena de conexión a la base de datos"), vbCrLf) sb1 = New System.Text.StringBuilder If lang = eLenguaje.eCS Then sb1.Append("@") End If If esSQL Then sb1.AppendFormat("""Data Source={0};", dataSource) sb1.AppendFormat(" Initial Catalog={0};", initialCatalog) If usarSeguridadSQL Then sb1.AppendFormat(" user id={0}; password={1}", userId, password) Else sb1.Append(" Integrated Security=yes;") End If Else If password <> "" Then sb1.AppendFormat("{0}Provider={1}; Data Source={2}; Jet OLEDB:Database Password={3}", Chr(34), provider, baseDeDatos, password) Else sb1.AppendFormat("{0}Provider={1}; Data Source={2}", Chr(34), provider, baseDeDatos) End If End If sb1.Append(Chr(34)) sb.AppendFormat(" {0}{1}", ConvLang.DeclaraVariable("Private Shared", "cadenaConexion", "String", sb1.ToString), vbCrLf) ' '------------------------------------------------------------------ ' la cadena de selección (campo público) '------------------------------------------------------------------ sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" La cadena de selección"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.DeclaraVariable("Public Shared", "CadenaSelect", "String", Chr(34) & cadenaSelect & Chr(34)), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) ' '------------------------------------------------------------------ ' constructores ' Uno sin parámetros y otro que recibe la cadena de conexión '------------------------------------------------------------------ sb.AppendFormat(" {0}{1}", ConvLang.Constructor("Public", nombreClase), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndSub(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Constructor("Public", nombreClase, "conex", "String"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Asigna("cadenaConexion", "conex"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndSub(), vbCrLf) ' sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" Métodos compartidos (estáticos) privados"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) ' '------------------------------------------------------------------ ' row2<nombreClase>: asigna una fila de la tabla a un objeto del tipo de la clase '------------------------------------------------------------------ sb.AppendFormat(" {0} asigna una fila de la tabla a un objeto {1}{2}", ConvLang.Comentario(), nombreClase, vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Function("Private Shared", "row2" & nombreClase, nombreClase, "r", "DataRow"), vbCrLf) sb.AppendFormat(" {2} asigna a un objeto {0} los datos del dataRow indicado{1}", nombreClase, vbCrLf, ConvLang.Comentario()) sb.AppendFormat(" {0}{1}", ConvLang.VariableNew("Dim", "o" & nombreClase, nombreClase), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) For Each col As DataColumn In mDataTable.Columns Select Case col.DataType.ToString Case "System.String" sb.AppendFormat(" {0}{1}", ConvLang.Asigna(String.Format("o{0}.{1}", nombreClase, campos(col.ColumnName).ToString), String.Format("r[""{0}""].ToString()", col.ColumnName)), vbCrLf) Case "System.DateTime" sb.AppendFormat(" {0}{1}", ConvLang.Try(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Asigna(String.Format("o{0}.{1}", nombreClase, campos(col.ColumnName).ToString), String.Format("DateTime.Parse(r[""{0}""].ToString())", col.ColumnName)), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Catch(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" TODO: Usa el valor de fecha que quieras predeterminar"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" Una fecha ficticia:"), vbCrLf) sb.AppendFormat(" {0}{1}{2}", ConvLang.Comentario(), ConvLang.AsignaNew(String.Format("o{0}.{1}", nombreClase, campos(col.ColumnName).ToString), "DateTime", "1900, 1, 1"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" o la fecha de hoy:"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Asigna(String.Format("o{0}.{1}", nombreClase, campos(col.ColumnName).ToString), "DateTime.Now"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndTry(), vbCrLf) Case "System.Int16", "System.Int32", "System.Int64", _ "System.Single", "System.Decimal", "System.Double", _ "System.Byte", "System.SByte", "System.UInt16", "System.UInt32", "System.UInt64" sb.AppendFormat(" {0}{1}", ConvLang.Asigna(String.Format("o{0}.{1}", nombreClase, campos(col.ColumnName).ToString), String.Format("{1}.Parse(""0"" & r[""{0}""].ToString())", col.ColumnName, col.DataType.ToString)), vbCrLf) Case "System.Boolean" sb.AppendFormat(" {0}{1}", ConvLang.Try(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Asigna(String.Format("o{0}.{1}", nombreClase, campos(col.ColumnName).ToString), String.Format("System.Boolean.Parse(r[""{0}""].ToString())", col.ColumnName)), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Catch(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Asigna(String.Format("o{0}.{1}", nombreClase, campos(col.ColumnName).ToString), "False"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndTry(), vbCrLf) Case "System.Byte[]" sb.AppendFormat(" {2}{0}{1}", ConvLang.Asigna(String.Format("o{0}.{1}", nombreClase, campos(col.ColumnName).ToString), String.Format("r[""{0}""]", col.ColumnName)), vbCrLf, ConvLang.Comentario()) Case Else ' Char, TimeSpan sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" TODO: Comprobar la conversión a realizar"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(String.Format(" con el tipo {0}", col.DataType.ToString)), vbCrLf) sb.AppendFormat(" {2}{0}{1}", ConvLang.Asigna(String.Format("o{0}.{1}", nombreClase, campos(col.ColumnName).ToString), String.Format("r[""{0}""]", col.ColumnName)), vbCrLf, ConvLang.Comentario()) sb.AppendFormat(" {0}{1}", ConvLang.Asigna(String.Format("o{0}.{1}", nombreClase, campos(col.ColumnName).ToString), String.Format("{1}.Parse(r[""{0}""].ToString())", col.ColumnName, col.DataType.ToString)), vbCrLf) End Select Next sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Return("o" & nombreClase), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndFunction(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) ' '------------------------------------------------------------------ ' <nombreClase>2Row: asigna un objeto de la clase a la fila indicada '------------------------------------------------------------------ sb.AppendFormat(" {0} asigna un objeto {1} a la fila indicada{2}", ConvLang.Comentario(), nombreClase, vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Sub("Private Shared", String.Format("{0}2Row", nombreClase), "o" & nombreClase, nombreClase, "r", "DataRow"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(String.Format(" asigna un objeto {0} al dataRow indicado", nombreClase)), vbCrLf) For Each col As DataColumn In mDataTable.Columns ' Si es AutoIncrement no asignarle un valor (10/Jul/04) ' si es Unique y no AutoIncrement se debe asignar (13/Jul/04) If col.AutoIncrement Then 'OrElse col.Unique Then sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" TODO: Comprueba si esta asignación debe hacerse"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" pero mejor lo dejas comentado ya que es un campo autoincremental o único"), vbCrLf) sb.AppendFormat(" {2}{0}{1}", ConvLang.Asigna(String.Format("r[""{0}""]", col.ColumnName), String.Format("o{0}.{1}", nombreClase, campos(col.ColumnName).ToString)), vbCrLf, ConvLang.Comentario()) Else sb.AppendFormat(" {0}{1}", ConvLang.Asigna(String.Format("r[""{0}""]", col.ColumnName), String.Format("o{0}.{1}", nombreClase, campos(col.ColumnName).ToString)), vbCrLf) End If Next sb.AppendFormat(" {0}{1}", ConvLang.EndSub(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) ' '------------------------------------------------------------------ ' nuevo<nombreClase>: crea una nueva fila y la asigna a un objeto de la clase '------------------------------------------------------------------ sb.AppendFormat(" {0} crea una nueva fila y la asigna a un objeto {1}{2}", ConvLang.Comentario(), nombreClase, vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Sub("Private Shared", "nuevo" & nombreClase, "dt", "DataTable", "o" & nombreClase, nombreClase), vbCrLf) sb.AppendFormat(" {2} Crear un nuevo {0}{1}", nombreClase, vbCrLf, ConvLang.Comentario()) sb.AppendFormat(" {0}{1}", ConvLang.DeclaraVariable("Dim", "dr", "DataRow", "dt.NewRow()"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.DeclaraVariable("Dim", "o" & nombreClase.Substring(0, 1), nombreClase, "row2" & nombreClase & "(dr)"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) For Each col As DataColumn In mDataTable.Columns sb.AppendFormat(" o{0}.{1} = o{2}.{1}{3}{4}", nombreClase.Substring(0, 1), campos(col.ColumnName).ToString, nombreClase, ConvLang.FinInstruccion(), vbCrLf) Next sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}2Row(o{1}, dr){2}{3}", nombreClase, nombreClase.Substring(0, 1), ConvLang.FinInstruccion(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Instruccion("dt.Rows.Add(dr)"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndSub(), vbCrLf) ' ' Métodos públicos compartidos (estáticos) ' sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" Métodos públicos"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) ' '------------------------------------------------------------------ ' Tabla: devuelve una tabla con los datos indicados en la cadena de selección ' hay dos sobrecargas: una sin parámetros y ' otra en la que se indica la cadena de selección a usar '------------------------------------------------------------------ sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" devuelve una tabla con los datos indicados en la cadena de selección"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Function("Public Shared", "Tabla", "DataTable"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Return("Tabla(CadenaSelect)"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndFunction(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Function("Public Shared", "Tabla", "DataTable", "sel", "String"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(String.Format(" devuelve una tabla con los datos de la tabla {0}", nombreTabla)), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Variable("Dim", "da", dbPrefix & "DataAdapter"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.VariableNewParam("Dim", "dt", "DataTable", String.Format("{0}{1}{0}", Chr(34), nombreClase)), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Try(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.AsignaNew("da", dbPrefix & "DataAdapter(sel, cadenaConexion)"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Instruccion("da.Fill(dt)"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Catch(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Return("Nothing"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndTry(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Return("dt"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndFunction(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) ' '------------------------------------------------------------------ ' Buscar (10/Jul/04) '------------------------------------------------------------------ sb.AppendFormat(" {0}{1}", ConvLang.Function("Public Shared", "Buscar", nombreClase, "sWhere", "String"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" Busca en la tabla los datos indicados en el parámetro"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" el parámetro contendrá lo que se usará después del WHERE"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.DeclaraVariable("Dim", "o" & nombreClase, nombreClase, "Nothing"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Variable("Dim", "da", dbPrefix & "DataAdapter"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.VariableNewParam("Dim", "dt", "DataTable", String.Format("{0}{1}{0}", Chr(34), nombreClase)), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Variable("Dim", "sel", "String", String.Format("{0}SELECT * FROM {1} WHERE {0} & sWhere", Chr(34), nombreTabla)), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.AsignaNew("da", dbPrefix & "DataAdapter(sel, cadenaConexion)"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Instruccion("da.Fill(dt)"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.If("dt.Rows.Count", ">", "0"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Asigna("o" & nombreClase, "row2" & nombreClase & "(dt.Rows(0))"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndIf(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Return("o" & nombreClase), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndFunction(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) ' ' Métodos públicos de instancia ' '------------------------------------------------------------------ ' Actualizar: Actualiza los datos en la tabla usando la instancia actual '------------------------------------------------------------------ sb.AppendFormat(" {0} Actualizar: Actualiza los datos en la tabla usando la instancia actual{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0} Si la instancia no hace referencia a un registro existente, se creará uno nuevo{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0} Para comprobar si el objeto en memoria coincide con uno existente,{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0} se comprueba si el {2} existe en la tabla.{1}", ConvLang.Comentario(), vbCrLf, campoIDnombre) sb.AppendFormat(" {0} TODO: Si en lugar de {2} usas otro campo, indicalo en la cadena SELECT{1}", ConvLang.Comentario(), vbCrLf, campoIDnombre) sb.AppendFormat(" {0} También puedes usar la sobrecarga en la que se indica la cadena SELECT a usar{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Function("Public", "Actualizar", "String"), vbCrLf) sb.AppendFormat(" {0} TODO: Poner aquí la selección a realizar para acceder a este registro{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0} yo uso el {2} que es el identificador único de cada registro{1}", ConvLang.Comentario(), vbCrLf, campoIDnombre) If campoIDtipo.IndexOf("String") > -1 Then sb.AppendFormat(" {0}{1}", ConvLang.DeclaraVariable("Dim", "sel", "String", String.Format("{0}SELECT * FROM {1} WHERE {2} = '{0} & Me.{2} & {0}'{0}", Chr(34), nombreTabla, campoIDnombre)), vbCrLf) Else sb.AppendFormat(" {0}{1}", ConvLang.DeclaraVariable("Dim", "sel", "String", String.Format("{0}SELECT * FROM {1} WHERE {2} = {0} & Me.{2}.ToString()", Chr(34), nombreTabla, campoIDnombre)), vbCrLf) End If sb.AppendFormat(" {0}{1}", ConvLang.Return("Actualizar(sel)"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndFunction(), vbCrLf) ' sb.AppendFormat(" {0}{1}", ConvLang.Function("Public", "Actualizar", "String", "sel", "String"), vbCrLf) sb.AppendFormat(" {1} Actualiza los datos indicados{0}", vbCrLf, ConvLang.Comentario()) sb.AppendFormat(" {1} El parámetro, que es una cadena de selección, indicará el criterio de actualización{0}", vbCrLf, ConvLang.Comentario()) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {1} En caso de error, devolverá la cadena empezando por ERROR.{0}", vbCrLf, ConvLang.Comentario()) sb.AppendFormat(" {0}{1}", ConvLang.DeclaraVariable("Dim", "cnn", dbPrefix & "Connection"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.DeclaraVariable("Dim", "da", dbPrefix & "DataAdapter"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.DeclaraVariableNewParam("Dim", "dt", "DataTable", String.Format("{0}{1}{0}", Chr(34), nombreClase)), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.AsignaNew("cnn", dbPrefix & "Connection", "cadenaConexion"), vbCrLf) sb.AppendFormat(" {0}{1}{2}", ConvLang.Comentario(), ConvLang.AsignaNew("da", dbPrefix & "DataAdapter", "CadenaSelect" & ", cnn"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.AsignaNew("da", dbPrefix & "DataAdapter", "sel, cnn"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Asigna("da.MissingSchemaAction", "MissingSchemaAction.AddWithKey"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario("-------------------------------------------"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" Esta no es la más óptima, pero funcionará"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario("-------------------------------------------"), vbCrLf) sb.AppendFormat(" {2}{0}{1}", ConvLang.DeclaraVariableNewParam("Dim", "cb", dbPrefix & "CommandBuilder", "da"), vbCrLf, ConvLang.Comentario(Not usarCommandBuilder)) sb.AppendFormat(" {2}{0}{1}", ConvLang.Asigna("da.UpdateCommand", "cb.GetUpdateCommand()"), vbCrLf, ConvLang.Comentario(Not usarCommandBuilder)) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) ' sb.AppendFormat(" {0}{1}", ConvLang.Comentario("--------------------------------------------------------------------"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" Esta está más optimizada pero debes comprobar que funciona bien..."), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario("--------------------------------------------------------------------"), vbCrLf) sb.AppendFormat(" {2}{0}{1}", ConvLang.DeclaraVariable("Dim", "sCommand", "String"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) sb.AppendFormat(" {2}{0}{1}", ConvLang.Comentario(), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) sb.AppendFormat(" {2}{1} El comando UPDATE{0}", vbCrLf, ConvLang.Comentario(), ConvLang.Comentario(usarCommandBuilder)) sb.AppendFormat(" {2}{1} TODO: Comprobar cual es el campo de índice principal (sin duplicados){0}", vbCrLf, ConvLang.Comentario(), ConvLang.Comentario(usarCommandBuilder)) sb.AppendFormat(" {3}{1} Yo compruebo que sea un campo llamado {2}, pero en tu caso puede ser otro{0}", vbCrLf, ConvLang.Comentario(), campoIDnombre, ConvLang.Comentario(usarCommandBuilder)) sb.AppendFormat(" {3}{1} Ese campo, (en mi caso {2}) será el que hay que poner al final junto al WHERE.{0}", vbCrLf, ConvLang.Comentario(), campoIDnombre, ConvLang.Comentario(usarCommandBuilder)) ' sb1 = New System.Text.StringBuilder sb2 = New System.Text.StringBuilder ' sb1.AppendFormat("{0}UPDATE {1} SET ", Chr(34), nombreTabla) ' s = "" For i As Integer = 0 To mDataTable.Columns.Count - 1 Dim col As DataColumn = mDataTable.Columns(i) ' si el campo tiene caracteres no válidos (14/Jul/04) ' ponerlo entre corchetes s = col.ColumnName If campos(col.ColumnName).ToString <> s Then s = "[" & col.ColumnName & "]" End If If campos(col.ColumnName).ToString <> campoIDnombre Then If esSQL Then sb2.AppendFormat("{0} = @{0}, ", s) Else sb2.AppendFormat("{0} = ?, ", s) End If End If Next s = sb2.ToString.TrimEnd If s.EndsWith(",") Then sb1.AppendFormat("{0} ", s.Substring(0, s.Length - 1)) Else sb1.AppendFormat("{0} ", s) End If If esSQL Then sb1.AppendFormat(" WHERE ({1} = @{1}){0}", Chr(34), campoIDnombre) Else sb1.AppendFormat(" WHERE ({1} = ?){0}", Chr(34), campoIDnombre) End If ' sb.AppendFormat(" {2}{0}{1}", ConvLang.Asigna("sCommand", sb1.ToString), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) sb.AppendFormat(" {2}{0}{1}", ConvLang.AsignaNew("da.UpdateCommand", dbPrefix & "Command", "sCommand, cnn"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) ' If esSQL Then For Each col As DataColumn In mDataTable.Columns Select Case col.DataType.ToString Case "System.String" If col.MaxLength > 255 Then sb.AppendFormat(" {3}{2} TODO: Este campo seguramente es MEMO y el valor debería ser cero en lugar de {0}{1}", col.MaxLength, vbCrLf, ConvLang.Comentario(), ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{2}@{0}{2}, SqlDbType.NText, {1}, {2}{0}{2}", col.ColumnName, col.MaxLength, Chr(34)) sb.AppendFormat(" {3}{0}{1}{2}", ConvLang.Comentario(), ConvLang.Instruccion("da.UpdateCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{2}@{0}{2}, SqlDbType.NText, {1}, {2}{0}{2}", col.ColumnName, 0, Chr(34)) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.UpdateCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) Else s = String.Format("{2}@{0}{2}, SqlDbType.NVarChar, {1}, {2}{0}{2}", col.ColumnName, col.MaxLength, Chr(34)) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.UpdateCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) End If Case Else sb.AppendFormat(" {2}{1} TODO: Comprobar el tipo de datos a usar...{0}", vbCrLf, ConvLang.Comentario(), ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{1}@{0}{1}, {2}, 0, {1}{0}{1}", col.ColumnName, Chr(34), tipoSQL(col.DataType.ToString)) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.UpdateCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) End Select Next Else Dim j As Integer = mDataTable.Columns.Count Dim k As Integer Dim sp(j) As String For k = 0 To j sp(k) = "p" & (k + 1).ToString Next k = 0 Dim sp1 As String Dim colID As DataColumn For Each col As DataColumn In mDataTable.Columns If campos(col.ColumnName).ToString = campoIDnombre Then colID = col Else sp1 = sp(k) k += 1 Select Case col.DataType.ToString Case "System.String" If col.MaxLength > 255 Then sb.AppendFormat(" {3}{2} TODO: Este campo seguramente es MEMO y el valor debería ser cero en lugar de {0}{1}", col.MaxLength, vbCrLf, ConvLang.Comentario(), ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{2}@{3}{2}, OleDbType.VarWChar, {1}, {2}{0}{2}", col.ColumnName, col.MaxLength, Chr(34), sp1) sb.AppendFormat(" {3}{0}{1}{2}", ConvLang.Comentario(), ConvLang.Instruccion("da.UpdateCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{2}@{3}{2}, OleDbType.VarWChar, {1}, {2}{0}{2}", col.ColumnName, 0, Chr(34), sp1) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.UpdateCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) Else s = String.Format("{2}@{3}{2}, OleDbType.VarWChar, {1}, {2}{0}{2}", col.ColumnName, col.MaxLength, Chr(34), sp1) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.UpdateCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) End If Case Else sb.AppendFormat(" {2}{1} TODO: Comprobar el tipo de datos a usar...{0}", vbCrLf, ConvLang.Comentario(), ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{1}@{3}{1}, {2}, 0, {1}{0}{1}", col.ColumnName, Chr(34), tipoOleDb(col.DataType.ToString), sp1) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.UpdateCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) End Select End If Next sp1 = sp(j - 1) Select Case colID.DataType.ToString Case "System.String" If colID.MaxLength > 255 Then sb.AppendFormat(" {3}{2} TODO: Este campo seguramente es MEMO y el valor debería ser cero en lugar de {0}{1}", colID.MaxLength, vbCrLf, ConvLang.Comentario(), ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{2}@{3}{2}, OleDbType.VarWChar, {1}, {2}{0}{2}", colID.ColumnName, colID.MaxLength, Chr(34), sp1) sb.AppendFormat(" {3}{0}{1}{2}", ConvLang.Comentario(), ConvLang.Instruccion("da.UpdateCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{2}@{3}{2}, OleDbType.VarWChar, {1}, {2}{0}{2}", colID.ColumnName, 0, Chr(34), sp1) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.UpdateCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) Else s = String.Format("{2}@{3}{2}, OleDbType.VarWChar, {1}, {2}{0}{2}", colID.ColumnName, colID.MaxLength, Chr(34), sp1) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.UpdateCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) End If Case Else sb.AppendFormat(" {2}{1} TODO: Comprobar el tipo de datos a usar...{0}", vbCrLf, ConvLang.Comentario(), ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{1}@{3}{1}, {2}, 0, {1}{0}{1}", colID.ColumnName, Chr(34), tipoOleDb(colID.DataType.ToString), sp1) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.UpdateCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) End Select s = String.Format("{0}@{2}{0}, {1}, 0, {0}{0}", Chr(34), "OleDbType.Integer", sp(j)) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.UpdateCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) End If ' sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Try(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Instruccion("da.Fill(dt)"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Catch("ex", "Exception"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Return("""ERROR: "" & ex.Message"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndTry(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) ' sb.AppendFormat(" {0}{1}", ConvLang.If("dt.Rows.Count", "=", "0"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" crear uno nuevo"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Return("Crear()"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Else(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Instruccion(nombreClase & "2Row(Me, dt.Rows(0))"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndIf(), vbCrLf) ' sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Try(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Instruccion("da.Update(dt)"), vbCrLf) sb.AppendFormat(" dt.AcceptChanges(){0}{1}", ConvLang.FinInstruccion(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Return("""Actualizado correctamente"""), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Catch("ex", "Exception"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Return("""ERROR: "" & ex.Message"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndTry(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndFunction(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) ' '------------------------------------------------------------------ ' Crear: Crea un nuevo registro usando el contenido de la instancia '------------------------------------------------------------------ sb.AppendFormat(" {0}{1}", ConvLang.Function("Public", "Crear", "String"), vbCrLf) sb.AppendFormat(" {1} Crear un nuevo registro{0}", vbCrLf, ConvLang.Comentario()) sb.AppendFormat(" {1} En caso de error, devolverá la cadena de error empezando por ERROR:.{0}", vbCrLf, ConvLang.Comentario()) sb.AppendFormat(" {0}{1}", ConvLang.DeclaraVariable("Dim", "cnn", dbPrefix & "Connection"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.DeclaraVariable("Dim", "da", dbPrefix & "DataAdapter"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.DeclaraVariableNewParam("Dim", "dt", "DataTable", String.Format("{0}{1}{0}", Chr(34), nombreClase)), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.AsignaNew("cnn", dbPrefix & "Connection", "cadenaConexion"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.AsignaNew("da", dbPrefix & "DataAdapter", "CadenaSelect" & ", cnn"), vbCrLf) sb.AppendFormat(" {0}{1}{2}", ConvLang.Comentario(), ConvLang.AsignaNew("da", dbPrefix & "DataAdapter", "CadenaSelect" & ", cadenaConexion"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Asigna("da.MissingSchemaAction", "MissingSchemaAction.AddWithKey"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario("-------------------------------------------"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" Esta no es la más óptima, pero funcionará"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario("-------------------------------------------"), vbCrLf) sb.AppendFormat(" {2}{0}{1}", ConvLang.DeclaraVariableNewParam("Dim", "cb", dbPrefix & "CommandBuilder", "da"), vbCrLf, ConvLang.Comentario(Not usarCommandBuilder)) sb.AppendFormat(" {2}{0}{1}", ConvLang.Asigna("da.InsertCommand", "cb.GetInsertCommand()"), vbCrLf, ConvLang.Comentario(Not usarCommandBuilder)) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario("--------------------------------------------------------------------"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" Esta está más optimizada pero debes comprobar que funciona bien..."), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario("--------------------------------------------------------------------"), vbCrLf) sb.AppendFormat(" {2}{0}{1}", ConvLang.DeclaraVariable("Dim", "sCommand", "String"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) sb.AppendFormat(" {2}{0}{1}", ConvLang.Comentario(), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) sb.AppendFormat(" {2}{0} El comando INSERT{1}", ConvLang.Comentario(), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) sb.AppendFormat(" {2}{0} TODO: No incluir el campo de clave primaria incremental{1}", ConvLang.Comentario(), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) sb.AppendFormat(" {3}{0} Yo compruebo que sea un campo llamado {2}, pero en tu caso puede ser otro{1}", ConvLang.Comentario(), vbCrLf, campoIDnombre, ConvLang.Comentario(usarCommandBuilder)) ' sb1 = New System.Text.StringBuilder sb2 = New System.Text.StringBuilder sb3 = New System.Text.StringBuilder sb1.AppendFormat("{0}INSERT INTO {1} (", Chr(34), nombreTabla) ' For i As Integer = 0 To mDataTable.Columns.Count - 1 Dim col As DataColumn = mDataTable.Columns(i) s = col.ColumnName If campos(col.ColumnName).ToString <> s Then s = "[" & col.ColumnName & "]" End If ' si no es AutoIncrement debe estar en los parámetros If col.AutoIncrement = False Then 'If col.ColumnName <> campoIDnombre Then sb2.AppendFormat("{0}, ", s) If esSQL Then sb3.AppendFormat("@{0}, ", s) Else sb3.Append("?, ") End If End If Next s = sb2.ToString.TrimEnd If s.EndsWith(",") Then sb1.AppendFormat("{0}", s.Substring(0, s.Length - 1)) Else sb1.AppendFormat("{0}", s) End If sb1.Append(") ") ' s = sb3.ToString.TrimEnd If s.EndsWith(",") Then sb1.AppendFormat(" VALUES({0})", s.Substring(0, s.Length - 1)) Else sb1.AppendFormat(" VALUES({0})", s) End If ' sb1.AppendFormat("{0}", Chr(34)) ' sb.AppendFormat(" {2}{0}{1}", ConvLang.Asigna("sCommand", sb1.ToString), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) sb.AppendFormat(" {2}{0}{1}", ConvLang.AsignaNew("da.InsertCommand", dbPrefix & "Command", "sCommand, cnn"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) ' If esSQL Then For Each col As DataColumn In mDataTable.Columns Select Case col.DataType.ToString Case "System.String" If col.MaxLength > 255 Then sb.AppendFormat(" {3}{2} TODO: Este campo seguramente es MEMO y el valor debería ser cero en lugar de {0}{1}", col.MaxLength, vbCrLf, ConvLang.Comentario(), ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{2}@{0}{2}, SqlDbType.NText, {1}, {2}{0}{2}", col.ColumnName, col.MaxLength, Chr(34)) sb.AppendFormat(" {3}{0}{1}{2}", ConvLang.Comentario(), ConvLang.Instruccion("da.InsertCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{2}@{0}{2}, SqlDbType.NText, {1}, {2}{0}{2}", col.ColumnName, 0, Chr(34)) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.InsertCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) Else s = String.Format("{2}@{0}{2}, SqlDbType.NVarChar, {1}, {2}{0}{2}", col.ColumnName, col.MaxLength, Chr(34)) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.InsertCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) End If Case Else sb.AppendFormat(" {2}{1} TODO: Comprobar el tipo de datos a usar...{0}", vbCrLf, ConvLang.Comentario(), ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{1}@{0}{1}, {2}, 0, {1}{0}{1}", col.ColumnName, Chr(34), tipoSQL(col.DataType.ToString)) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.InsertCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) End Select Next Else Dim j As Integer = mDataTable.Columns.Count Dim k As Integer Dim sp(j) As String For k = 0 To j sp(k) = "p" & (k + 1).ToString Next k = 0 Dim sp1 As String Dim colID As DataColumn For Each col As DataColumn In mDataTable.Columns If campos(col.ColumnName).ToString = campoIDnombre Then colID = col Else sp1 = sp(k) k += 1 Select Case col.DataType.ToString Case "System.String" If col.MaxLength > 255 Then sb.AppendFormat(" {3}{2} TODO: Este campo seguramente es MEMO y el valor debería ser cero en lugar de {0}{1}", col.MaxLength, vbCrLf, ConvLang.Comentario(), ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{2}@{3}{2}, OleDbType.VarWChar, {1}, {2}{0}{2}", col.ColumnName, col.MaxLength, Chr(34), sp1) sb.AppendFormat(" {3}{0}{1}{2}", ConvLang.Comentario(), ConvLang.Instruccion("da.UpdateCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{2}@{3}{2}, OleDbType.VarWChar, {1}, {2}{0}{2}", col.ColumnName, 0, Chr(34), sp1) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.InsertCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) Else s = String.Format("{2}@{3}{2}, OleDbType.VarWChar, {1}, {2}{0}{2}", col.ColumnName, col.MaxLength, Chr(34), sp1) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.InsertCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) End If Case Else sb.AppendFormat(" {2}{1} TODO: Comprobar el tipo de datos a usar...{0}", vbCrLf, ConvLang.Comentario(), ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{1}@{3}{1}, {2}, 0, {1}{0}{1}", col.ColumnName, Chr(34), tipoOleDb(col.DataType.ToString), sp1) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.InsertCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) End Select End If Next sp1 = sp(j - 1) Select Case colID.DataType.ToString Case "System.String" If colID.MaxLength > 255 Then sb.AppendFormat(" {3}{2} TODO: Este campo seguramente es MEMO y el valor debería ser cero en lugar de {0}{1}", colID.MaxLength, vbCrLf, ConvLang.Comentario(), ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{2}@{3}{2}, OleDbType.VarWChar, {1}, {2}{0}{2}", colID.ColumnName, colID.MaxLength, Chr(34), sp1) sb.AppendFormat(" {3}{0}{1}{2}", ConvLang.Comentario(), ConvLang.Instruccion("da.InsertCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{2}@{3}{2}, OleDbType.VarWChar, {1}, {2}{0}{2}", colID.ColumnName, 0, Chr(34), sp1) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.InsertCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) Else s = String.Format("{2}@{3}{2}, OleDbType.VarWChar, {1}, {2}{0}{2}", colID.ColumnName, colID.MaxLength, Chr(34), sp1) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.InsertCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) End If Case Else sb.AppendFormat(" {2}{1} TODO: Comprobar el tipo de datos a usar...{0}", vbCrLf, ConvLang.Comentario(), ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{1}@{3}{1}, {2}, 0, {1}{0}{1}", colID.ColumnName, Chr(34), tipoOleDb(colID.DataType.ToString), sp1) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.InsertCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) End Select s = String.Format("{0}@{2}{0}, {1}, 0, {0}{0}", Chr(34), "OleDbType.Integer", sp(j)) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.InsertCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) End If ' sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Try(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Instruccion("da.Fill(dt)"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Catch("ex", "Exception"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Return("""ERROR: "" & ex.Message"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndTry(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Instruccion("nuevo" & nombreClase & "(dt, Me)"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Try(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Instruccion("da.Update(dt)"), vbCrLf) sb.AppendFormat(" dt.AcceptChanges(){0}{1}", ConvLang.FinInstruccion(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Return("""Se ha creado un nuevo " & nombreClase & Chr(34)), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Catch("ex", "Exception"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Return("""ERROR: "" & ex.Message"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndTry(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndFunction(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) ' '------------------------------------------------------------------ ' Borrar: Borra el registro con el mismo ID que tenga la clase ' En caso de que quieras usar otro criterio para comprobar cual es el registro actual ' cambia la comparación '------------------------------------------------------------------ sb.AppendFormat(" {0}{1}", ConvLang.Function("Public", "Borrar", "String"), vbCrLf) sb.AppendFormat(" {0} TODO: Poner aquí la selección a realizar para acceder a este registro{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0} yo uso el {2} que es el identificador único de cada registro{1}", ConvLang.Comentario(), vbCrLf, campoIDnombre) If campoIDtipo.IndexOf("String") > -1 Then sb.AppendFormat(" {0}{1}", ConvLang.DeclaraVariable("Dim", "sel", "String", String.Format("{0}SELECT * FROM {1} WHERE {2} = '{0} & Me.{2} & {0}'{0}", Chr(34), nombreTabla, campoIDnombre)), vbCrLf) Else sb.AppendFormat(" {0}{1}", ConvLang.DeclaraVariable("Dim", "sel", "String", String.Format("{0}SELECT * FROM {1} WHERE {2} = {0} & Me.{2}.ToString()", Chr(34), nombreTabla, campoIDnombre)), vbCrLf) End If sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Return("Borrar(sel)"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.EndFunction(), vbCrLf) ' sb.AppendFormat(" {0}{1}", ConvLang.Function("Public", "Borrar", "String", "sel", "String"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" Borrar el registro al que apunta esta clase"), vbCrLf) sb.AppendFormat(" {1} En caso de error, devolverá la cadena de error empezando por ERROR:.{0}", vbCrLf, ConvLang.Comentario()) sb.AppendFormat(" {0}{1}", ConvLang.DeclaraVariable("Dim", "cnn", dbPrefix & "Connection"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.DeclaraVariable("Dim", "da", dbPrefix & "DataAdapter"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.DeclaraVariableNewParam("Dim", "dt", "DataTable", String.Format("{0}{1}{0}", Chr(34), nombreClase)), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.AsignaNew("cnn", dbPrefix & "Connection", "cadenaConexion"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.AsignaNew("da", dbPrefix & "DataAdapter", "sel, cnn"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Asigna("da.MissingSchemaAction", "MissingSchemaAction.AddWithKey"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) ' sb.AppendFormat(" {0}{1}", ConvLang.Comentario("-------------------------------------------"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" Esta no es la más óptima, pero funcionará"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario("-------------------------------------------"), vbCrLf) sb.AppendFormat(" {2}{0}{1}", ConvLang.DeclaraVariableNewParam("Dim", "cb", dbPrefix & "CommandBuilder", "da"), vbCrLf, ConvLang.Comentario(Not usarCommandBuilder)) sb.AppendFormat(" {2}{0}{1}", ConvLang.Asigna("da.DeleteCommand", "cb.GetDeleteCommand()"), vbCrLf, ConvLang.Comentario(Not usarCommandBuilder)) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario("--------------------------------------------------------------------"), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario(" Esta está más optimizada pero debes comprobar que funciona bien..."), vbCrLf) sb.AppendFormat(" {0}{1}", ConvLang.Comentario("--------------------------------------------------------------------"), vbCrLf) sb.AppendFormat(" {2}{0}{1}", ConvLang.DeclaraVariable("Dim", "sCommand", "String"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) sb.AppendFormat(" {2}{0}{1}", ConvLang.Comentario(), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) sb.AppendFormat(" {2}{0} El comando DELETE{1}", ConvLang.Comentario(), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) sb.AppendFormat(" {2}{0} TODO: Sólo incluir el campo de clave primaria incremental{1}", ConvLang.Comentario(), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) sb.AppendFormat(" {3}{0} Yo compruebo que sea un campo llamado {2}, pero en tu caso puede ser otro{1}", ConvLang.Comentario(), vbCrLf, campoIDnombre, ConvLang.Comentario(usarCommandBuilder)) ' sb1 = New System.Text.StringBuilder If esSQL Then sb1.AppendFormat("{0}DELETE FROM {1} WHERE ({2} = @p1){0}", Chr(34), nombreTabla, campoIDnombre) Else sb1.AppendFormat("{0}DELETE FROM {1} WHERE ({2} = ?){0}", Chr(34), nombreTabla, campoIDnombre) End If sb.AppendFormat(" {2}{0}{1}", ConvLang.Asigna("sCommand", sb1.ToString), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) sb.AppendFormat(" {2}{0}{1}", ConvLang.AsignaNew("da.DeleteCommand", dbPrefix & "Command", "sCommand, cnn"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) ' If esSQL Then For Each col As DataColumn In mDataTable.Columns If campos(col.ColumnName).ToString = campoIDnombre Then Select Case col.DataType.ToString Case "System.String" If col.MaxLength > 255 Then sb.AppendFormat(" {3}{2} TODO: Este campo seguramente es MEMO y el valor debería ser cero en lugar de {0}{1}", col.MaxLength, vbCrLf, ConvLang.Comentario(), ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{2}@p1{2}, SqlDbType.NText, {1}, {2}{0}{2}", col.ColumnName, col.MaxLength, Chr(34)) sb.AppendFormat(" {3}{0}{1}{2}", ConvLang.Comentario(), ConvLang.Instruccion("da.InsertCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{2}@p1{2}, SqlDbType.NText, {1}, {2}{0}{2}", col.ColumnName, 0, Chr(34)) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.DeleteCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) Else s = String.Format("{2}@p1{2}, SqlDbType.NVarChar, {1}, {2}{0}{2}", col.ColumnName, col.MaxLength, Chr(34)) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.DeleteCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) End If Case Else sb.AppendFormat(" {2}{1} TODO: Comprobar el tipo de datos a usar...{0}", vbCrLf, ConvLang.Comentario(), ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{1}@p1{1}, {2}, 0, {1}{0}{1}", col.ColumnName, Chr(34), tipoSQL(col.DataType.ToString)) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.DeleteCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) End Select Exit For End If Next s = String.Format("{0}@p2{0}, {1}, 0, {0}{0}", Chr(34), "SqlDbType.Int") sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.DeleteCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) Else For Each col As DataColumn In mDataTable.Columns If campos(col.ColumnName).ToString = campoIDnombre Then Select Case col.DataType.ToString Case "System.String" If col.MaxLength > 255 Then sb.AppendFormat(" {3}{2} TODO: Este campo seguramente es MEMO y el valor debería ser cero en lugar de {0}{1}", col.MaxLength, vbCrLf, ConvLang.Comentario(), ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{2}@p1{2}, OleDbType.VarWChar, {1}, {2}{0}{2}", col.ColumnName, col.MaxLength, Chr(34)) sb.AppendFormat(" {3}{0}{1}{2}", ConvLang.Comentario(), ConvLang.Instruccion("da.DeleteCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{2}@p1{2}, OleDbType.VarWChar, {1}, {2}{0}{2}", col.ColumnName, 0, Chr(34)) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.DeleteCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) Else s = String.Format("{2}@p1{2}, OleDbType.VarWChar, {1}, {2}{0}{2}", col.ColumnName, col.MaxLength, Chr(34)) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.DeleteCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) End If Case Else sb.AppendFormat(" {2}{1} TODO: Comprobar el tipo de datos a usar...{0}", vbCrLf, ConvLang.Comentario(), ConvLang.Comentario(usarCommandBuilder)) s = String.Format("{1}@p1{1}, {2}, 0, {1}{0}{1}", col.ColumnName, Chr(34), tipoOleDb(col.DataType.ToString)) sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.DeleteCommand.Parameters.Add(" & s & ")"), vbCrLf, ConvLang.Comentario(usarCommandBuilder)) End Select Exit For End If Next s = String.Format("{0}@p2{0}, {1}, 0, {0}{0}", Chr(34), "OleDbType.Integer") sb.AppendFormat(" {2}{0}{1}", ConvLang.Instruccion("da.DeleteCommand.Paramete