Использование SqlBulkCopy с F # для экспорта матрицы в SQL - PullRequest
2 голосов
/ 20 января 2012

Я хочу перенести большой объем данных из F # в таблицу SQL. В основном мой код F # создает матрицу из трех столбцов (UserID, ProductID and price) и N строк. Я хотел бы "скопировать / запатентовать" в базу данных Я перепробовал несколько вариантов, но в конце передача данных из F # очень медленная (около одного часа на 10000 строк).

Благодаря ответам на предыдущий вопрос Как включить хранимую процедуру в F # , интересным способом решения этой проблемы является использование SqlBulkCopy.

SqlBulkCopy требует тип базы данных для метода WritetoServer, но я не нашел ни существующего кода, ни простого способа преобразования матрицы в базу данных. Есть ли у вас какие-либо предложения или идеи?

1 Ответ

5 голосов
/ 20 января 2012

Это должно помочь вам начать работу (и обратиться к документации для получения дополнительной информации о 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)
...