Uso de SqlBulkCopy con F # para exportar la matriz en SQL

f# matrix sql sqlbulkcopy

Pregunta

Quiero transferir una gran cantidad de datos de F # a una tabla SQL. Básicamente, mi código F # crea una matriz de tres columnas ( UserID, ProductID and price ) y N líneas. Me gustaría "copiarlo / compilarlo" en una base de datos. Probé varias opciones, pero al final, la transferencia de datos desde F # es realmente lenta (alrededor de una hora para 10000 líneas).

Gracias a las respuestas de una pregunta anterior Cómo incluir un procedimiento almacenado en F # , una forma interesante de resolver este problema es usar SqlBulkCopy .

SqlBulkCopy requiere un tipo de base de datos para su método WritetoServer pero no encontré ningún código existente o una forma simple de convertir una matriz en una base de datos. ¿Tienes alguna sugerencia o idea?

Respuesta aceptada

Esto debería comenzar (y consultar la documentación para obtener más información sobre SqlBulkCopy ):

//you must reference System.Data and System.Xml
open System.Data
open System.Data.SqlClient

let bulkLoadUserPurchases (conn:SqlConnection) (userPurchases: list<int * int * float>) =
    use sbc = new SqlBulkCopy(conn, SqlBulkCopyOptions.TableLock, null, BatchSize=500, BulkCopyTimeout=1200, DestinationTableName="YOUR_TABLE_NAME_HERE")
    sbc.WriteToServer(
        let dt = new DataTable()
        ["UserID", typeof<int>
         "ProductID", typeof<int>
         "Price", typeof<float>]
        |> List.iter (dt.Columns.Add>>ignore)

        for userPurchase in userPurchases do
            let userId, productId, price = userPurchase
            let dr = dt.NewRow()
            dr.["UserID"] <- userId
            dr.["ProductID"] <- productId
            dr.["Price"] <- price
            dt.Rows.Add(dr)

        dt)


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é