Ver Mensaje Individual
  #18 (permalink)  
Antiguo 24/05/2009, 16:10
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Manual de Vb.NET 2005

Propongo una colaboración (para aquel a quién le sea útil):

Código para enviar una carga masiva de un DataTable en forma dinámica a MySQL.
Recibe:
1. Un DataTable con los registros a cargar.
2. Una variable Integer con el valor de la cantidad de registros a enviar a la base por cada ejecución de un INSERT.

Requiere:
1. Que los campos del DataTable tengan los mismos nombres de los de la tabla.
2. Que el DataTable tenga el mismo nombre de la Tabla en la base.
3. Un método adicional que convierta los datos en el tipo de string necesario.
4. Un método conectar() que administre el estado de la conexión al MySQL.
5. El uso del MySQL Connector.Net, cargado como referencia.
6. Variables de clase que manejen los objetos ADO propios de MySQL.
7. La referencia a Globalization, para cargar correctamente los valore sde punto flotante o decimales.
8. Un objeto NumberFormat (en este caso: nFI As NumberFormatInfo = New CultureInfo("en-US", False).NumberFormat) para especificar el punto decimal en forma correcta.
Código vb.net:
Ver original
  1. Private Function EscribirTabla(ByRef tabla As DataTable, ByRef oCant As Integer) As Boolean
  2.         conectar()
  3.         Dim sSql, sSql2 As String
  4.         Dim j, i, ciclo As Integer
  5.         sSql = "INSERT INTO " & tabla.TableName & "("
  6.         For j = 0 To tabla.Columns.Count - 2
  7.             sSql += tabla.Columns(j).ColumnName & ", "
  8.         Next
  9.         sSql += tabla.Columns(tabla.Columns.Count - 1).ColumnName & ") "
  10.         sSql += " VALUES"
  11.         For i = 0 To tabla.Rows.Count - 1
  12.             sSql2 += "("
  13.             For j = 0 To tabla.Columns.Count - 1
  14.                 sSql2 += CampoDeSql(tabla.Rows(i).Item(j))
  15.                 If j < (tabla.Columns.Count - 1) Then
  16.                     sSql2 += ", "
  17.                 End If
  18.             Next j
  19.             sSql2 += ")"
  20.             If ciclo = oCant Or i = tabla.Rows.Count - 1 Then
  21.                 ciclo = 0
  22.                 sSql2 += ";"
  23.                 sentencias = New MySqlCommand(sSql & sSql2, conexion)
  24.                 Try
  25.                     sentencias.ExecuteNonQuery()
  26.                     sSql2 = ""
  27.                 Catch ex As Exception
  28.                     Return False
  29.                 End Try
  30.             Else
  31.                 sSql2 += ", "
  32.             End If
  33.             ciclo += 1
  34.         Next i
  35.         Return True
  36.     End Function

Código de la función de conversión:
Código vb.net:
Ver original
  1. Public Function CampoDeSql(ByVal campo As Object) As String
  2.         nFI.NumberGroupSeparator = 0
  3.         Dim dato As Double
  4.         Select Case campo.GetType.Name
  5.             Case Is = "DateTime"
  6.                 Return "'" & Format(campo, "yyyy-MM-dd HH:mm:ss") & "' "
  7.             Case Is = "Date"
  8.                 Return "'" & Format(campo, "yyyy-MM-dd") & "' "
  9.             Case Is = "DBNull"
  10.                 Return " NULL"
  11.             Case Is = "Integer"
  12.                 Return Convert.ToString(campo)
  13.             Case Is = "Int16"
  14.                 Return Convert.ToString(campo, nFI)
  15.             Case Is = "Int32"
  16.                 Return Convert.ToString(campo, nFI)
  17.             Case Is = "Int64"
  18.                 Return Convert.ToString(campo, nFI)
  19.             Case Is = "Double"
  20.                 dato = campo
  21.                 Return dato.ToString("f", nFI)
  22.             Case Is = "Single"
  23.                 Return Convert.ToString(campo, nFI)
  24.             Case Is = "Decimal"
  25.                 Return Convert.ToString(campo, nFI)
  26.             Case Is = "UInt16"
  27.                 Return Convert.ToString(Convert.ToInt32(campo), nFI)
  28.             Case Is = "UInt32"
  29.                 Return Convert.ToString(Convert.ToInt32(campo), nFI)
  30.             Case Is = "UInt64"
  31.                 Return Convert.ToString(Convert.ToInt32(campo), nFI)
  32.             Case Is = "String"
  33.                 If campo = "\N" Then
  34.                     Return " NULL"
  35.                 Else
  36.                     Return "'" & campo & "' "
  37.                 End If
  38.             Case Is = "TimeSpan"
  39.                 Return "'" & campo.ToString & "' "
  40.             Case Is = "Byte"
  41.                 Return "'" & Convert.ToString(campo) & "' "
  42.             Case Else
  43.                 Return "'" & Convert.ToString(campo) & "' "
  44.         End Select
  45.     End Function
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 24/05/2009 a las 16:20