【问题标题】:Using SqlBulkCopy with F# to export matrix in SQL使用带有 F# 的 SqlBulkCopy 在 SQL 中导出矩阵
【发布时间】:2012-01-20 12:03:01
【问题描述】:

我想将大量数据从 F# 传输到 SQL 表。基本上,我的 F# 代码创建了一个包含三列 (UserID, ProductID and price) 和 N 行的矩阵。我想“复制/粘贴”到数据库中 我尝试了几个选项,但最后,从 F# 传输数据真的很慢(10000 行大约需要一个小时)。

感谢上一个问题How to include a stored procedure in F# 的回答,解决此问题的一个有趣方法是使用SqlBulkCopy

SqlBulkCopyWritetoServer 方法需要数据库类型,但我没有找到任何现有代码或将矩阵转换为数据库的简单方法。 你有什么建议或想法吗?

【问题讨论】:

  • 你的“矩阵”是什么类型的?

标签: sql f# matrix sqlbulkcopy


【解决方案1】:

这应该可以帮助您入门(并参考documentation 以获取有关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)

【讨论】:

  • 谢谢斯蒂芬,它完美地完成了这项工作。
【解决方案2】:

如果您对第三方库没问题,fastmember 在这里可能真的很有用。

module DB =
    open System.Data
    open System.Data.SqlClient
    open FastMember

    // val bulk : conn:SqlConnection -> table:string -> columns:seq<string*string> -> items:seq<a'>
    let bulk conn table columns items =        
        use bcp = new SqlBulkCopy(connection = conn)
        bcp.EnableStreaming <- true
        bcp.DestinationTableName <- table
        for n,v in columns do   
            bcp.ColumnMappings.Add(new SqlBulkCopyColumnMapping(sourceColumn = n, destinationColumn = v))               
            |> ignore
        bcp.WriteToServer(items |> ObjectReader.Create)

这为您提供了一个通用方法,您可以将任何seq&lt;a'&gt; 汇集到其中。除了一些配置参数,您当然可以根据需要进行配置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2012-09-23
    相关资源
    最近更新 更多