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 originalPrivate Function EscribirTabla(ByRef tabla As DataTable, ByRef oCant As Integer) As Boolean
conectar()
Dim sSql, sSql2 As String
Dim j, i, ciclo As Integer
sSql = "INSERT INTO " & tabla.TableName & "("
For j = 0 To tabla.Columns.Count - 2
sSql += tabla.Columns(j).ColumnName & ", "
Next
sSql += tabla.Columns(tabla.Columns.Count - 1).ColumnName & ") "
sSql += " VALUES"
For i = 0 To tabla.Rows.Count - 1
sSql2 += "("
For j = 0 To tabla.Columns.Count - 1
sSql2 += CampoDeSql(tabla.Rows(i).Item(j))
If j < (tabla.Columns.Count - 1) Then
sSql2 += ", "
End If
Next j
sSql2 += ")"
If ciclo = oCant Or i = tabla.Rows.Count - 1 Then
ciclo = 0
sSql2 += ";"
sentencias = New MySqlCommand(sSql & sSql2, conexion)
Try
sentencias.ExecuteNonQuery()
sSql2 = ""
Catch ex As Exception
Return False
End Try
Else
sSql2 += ", "
End If
ciclo += 1
Next i
Return True
End Function
Código de la función de conversión:
Código vb.net:
Ver originalPublic Function CampoDeSql(ByVal campo As Object) As String
nFI.NumberGroupSeparator = 0
Dim dato As Double
Select Case campo.GetType.Name
Case Is = "DateTime"
Return "'" & Format(campo,
"yyyy-MM-dd HH:mm:ss") & "' " Case Is = "Date"
Return "'" & Format(campo,
"yyyy-MM-dd") & "' " Case Is = "DBNull"
Return " NULL"
Case Is = "Integer"
Return Convert.ToString(campo)
Case Is = "Int16"
Return Convert.ToString(campo, nFI)
Case Is = "Int32"
Return Convert.ToString(campo, nFI)
Case Is = "Int64"
Return Convert.ToString(campo, nFI)
Case Is = "Double"
dato = campo
Return dato.ToString("f", nFI)
Case Is = "Single"
Return Convert.ToString(campo, nFI)
Case Is = "Decimal"
Return Convert.ToString(campo, nFI)
Case Is = "UInt16"
Return Convert.ToString(Convert.ToInt32(campo), nFI)
Case Is = "UInt32"
Return Convert.ToString(Convert.ToInt32(campo), nFI)
Case Is = "UInt64"
Return Convert.ToString(Convert.ToInt32(campo), nFI)
Case Is = "String"
If campo = "\N" Then
Return " NULL"
Else
Return "'" & campo & "' "
End If
Case Is = "TimeSpan"
Return "'" & campo.ToString & "' "
Case Is = "Byte"
Return "'" & Convert.ToString(campo) & "' "
Case Else
Return "'" & Convert.ToString(campo) & "' "
End Select
End Function