Usando SqlBulkCopy para insertar en SQL

sqlbulkcopy sql-server vb.net

Pregunta

No sé por qué los datos no entran en SQL. ¿Alguien puede revisar esto y ver qué está mal con mi código? Obtuve la mayor parte del código de abajo y de la página de MSDN: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy(v=vs.110).aspx

Dim connectionString As String = "Server= "<servername>"; integrated security=true"

    Using sourceConnection As SqlConnection = _

        New SqlConnection(connectionString)
        sourceConnection.Open()

        Dim commandSourceData As SqlCommand = New SqlCommand(<TSQL>), sourceConnection)
        Dim reader As SqlDataReader = commandSourceData.ExecuteReader

        Using destinationConnection As SqlConnection = _
            New SqlConnection(connectionString)
            destinationConnection.Open()

            Using bulkcopy As SqlBulkCopy = _
                New SqlBulkCopy(destinationConnection)
                bulkcopy.DestinationTableName = _
                    "<tableName>"

                Try
                    bulkcopy.WriteToServer(reader)
                Catch ex As Exception
                    Console.WriteLine(ex.Message)
                Finally
                    reader.Close()
                End Try

            End Using
        End Using
        sourceConnection.Close()
    End Using

Respuesta aceptada

En el sistema donde hago una copia masiva, configuro las asignaciones de columnas como se explica en la documentación Asignación de columnas - Copia masiva de SQL

La asignación se configura con los nombres de columna de origen y destino. Este ejemplo es de la documentación:

 Dim mapID As New _
              SqlBulkCopyColumnMapping("ProductID", "ProdID")
            bulkCopy.ColumnMappings.Add(mapID)

Cuando configuré esto por primera vez, recuerdo tener problemas sin configurar explícitamente las asignaciones de columnas en mi entorno.


Respuesta popular

Si los tipos de campo, orden de campo, recuento de campos de su fuente de datos, no coinciden con la tabla de destino. Tu volumetría volverá fallida.

En el caso anterior, debe especificar las ColumnMappings de cada campo en su datasoruce a su objeto sqlbulkcopy.

            SqlBulkCopy copy = new SqlBulkCopy(MySqlConn);
            copy.BulkCopyTimeout = 6000;
            copy.DestinationTableName = TableName;
            for (int i = 0; i < this.lstBulkFields.Count; i++) {
                // if the source fields name are the same with the targets.
                copy.ColumnMappings.Add(this.lstBulkFields[i], this.lstBulkFields[i]);
            }
            copy.BatchSize = BatchSize;
            copy.WriteToServer(MyDataSource);


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué