F # DataTable을 SqlBulkCopy를 사용하여 SQL로 변환

f# sqlbulkcopy sql-server

문제

DataTable 을 만들고 한 행으로 채우고 대량 삽입 ( SqlBulkCopy )을 사용하여 SQL Server에 데이터를 쓰는 F # 프로그램이 있습니다.

작동하지만 실제로 한 번에 한 행을 대량 삽입하는 대신 하나의 명령문에 삽입 할 수있는 여러 목록 항목 / 데이터 행을 생성하는 루프를 포함하는 방법을 알아낼 수는 없습니다 ( 현재의 경우)

여기에 내 코드가있다.

open System
open System.Data
open System.Data.SqlClient

let lcpSqlConnection = new SqlConnection("<my-connection-string>")
lcpSqlConnection.Open()
let bulkLoadEsgData (conn:SqlConnection) (esgTable: list<byte * byte * int * byte * byte * single>) =
    use sbc = new SqlBulkCopy(conn, SqlBulkCopyOptions.TableLock, null, BatchSize=10000, BulkCopyTimeout=1200, DestinationTableName="dbo.myTable")
    sbc.WriteToServer(
        let dt = new DataTable()
        ["Measure", typeof<byte>
        "Identifier", typeof<byte>
        "Simulation", typeof<int>
        "Time", typeof<byte>
        "Duration", typeof<byte>
         "Result", typeof<single>]
        |> List.iter (dt.Columns.Add>>ignore)

        for esgData in esgTable do
            let esg_measure, identifier, simulation, time, duration, result = esgData
            let dr = dt.NewRow()
            dr.["Measure"] <- esg_measure
            dr.["Identifier"] <- identifier
            dr.["Simulation"] <- simulation
            dr.["Time"] <- time
            dr.["Duration"] <- duration
            dr.["Result"] <- result
            dt.Rows.Add(dr)

        dt)


let myList: list<byte * byte * int * byte * byte * single> = [(byte)1,(byte)1,1, (byte)1,(byte)1,(single)0.111]

// Call method to bulk insert data row
bulkLoadEsgData lcpSqlConnection myList

lcpSqlConnection.Close()

나는 코드를 효율적으로 실행하기 위해 bulkLoadEsgData 메서드 안에 for 루프를 포함시켜야한다고 생각한다. 내가 무엇을해야할지 / 쓸 곳을 모르겠다.

수락 된 답변

나는 이것을 해결할 수 있었다.

sbc.WriteToServer(
    let dt = new DataTable()
    dt.Columns.Add("Measure", typeof<byte>) |> ignore
    dt.Columns.Add("Identifier", typeof<byte>) |> ignore
    dt.Columns.Add("Simulation", typeof<int>) |> ignore
    dt.Columns.Add("Time", typeof<byte>) |> ignore
    dt.Columns.Add("Duration", typeof<byte>) |> ignore
    dt.Columns.Add("Result", typeof<single>) |> ignore

    for i= 1 to 100 do
        dt.Rows.Add(i, i, i, i, i, (float)i*0.11) |> ignore

    dt)


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.