Skip to content

Commit 1962219

Browse files
committed
Add TempTableLoader
1 parent 0f0112d commit 1962219

File tree

1 file changed

+64
-37
lines changed

1 file changed

+64
-37
lines changed

src/SqlClient/DesignTime.fs

Lines changed: 64 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,48 @@ module Prefixes =
4545
let tempTable = "##SQLCOMMANDPROVIDER_"
4646
let tableVar = "@SQLCOMMANDPROVIDER_"
4747

48+
type TempTableLoader(fieldCount, items: obj seq) =
49+
let enumerator = items.GetEnumerator()
50+
51+
interface IDataReader with
52+
member this.FieldCount: int = fieldCount
53+
member this.Read(): bool = enumerator.MoveNext()
54+
member this.GetValue(i: int): obj =
55+
let row : obj[] = unbox enumerator.Current
56+
row.[i]
57+
member this.Dispose(): unit = ()
58+
59+
member __.Close(): unit = invalidOp "NotImplementedException"
60+
member __.Depth: int = invalidOp "NotImplementedException"
61+
member __.GetBoolean(i: int): bool = invalidOp "NotImplementedException"
62+
member __.GetByte(i: int): byte = invalidOp "NotImplementedException"
63+
member __.GetBytes(i: int, fieldOffset: int64, buffer: byte [], bufferoffset: int, length: int): int64 = invalidOp "NotImplementedException"
64+
member __.GetChar(i: int): char = invalidOp "NotImplementedException"
65+
member __.GetChars(i: int, fieldoffset: int64, buffer: char [], bufferoffset: int, length: int): int64 = invalidOp "NotImplementedException"
66+
member __.GetData(i: int): IDataReader = invalidOp "NotImplementedException"
67+
member __.GetDataTypeName(i: int): string = invalidOp "NotImplementedException"
68+
member __.GetDateTime(i: int): System.DateTime = invalidOp "NotImplementedException"
69+
member __.GetDecimal(i: int): decimal = invalidOp "NotImplementedException"
70+
member __.GetDouble(i: int): float = invalidOp "NotImplementedException"
71+
member __.GetFieldType(i: int): System.Type = invalidOp "NotImplementedException"
72+
member __.GetFloat(i: int): float32 = invalidOp "NotImplementedException"
73+
member __.GetGuid(i: int): System.Guid = invalidOp "NotImplementedException"
74+
member __.GetInt16(i: int): int16 = invalidOp "NotImplementedException"
75+
member __.GetInt32(i: int): int = invalidOp "NotImplementedException"
76+
member __.GetInt64(i: int): int64 = invalidOp "NotImplementedException"
77+
member __.GetName(i: int): string = invalidOp "NotImplementedException"
78+
member __.GetOrdinal(name: string): int = invalidOp "NotImplementedException"
79+
member __.GetSchemaTable(): DataTable = invalidOp "NotImplementedException"
80+
member __.GetString(i: int): string = invalidOp "NotImplementedException"
81+
member __.GetValues(values: obj []): int = invalidOp "NotImplementedException"
82+
member __.IsClosed: bool = invalidOp "NotImplementedException"
83+
member __.IsDBNull(i: int): bool = invalidOp "NotImplementedException"
84+
member __.Item with get (i: int): obj = invalidOp "NotImplementedException"
85+
member __.Item with get (name: string): obj = invalidOp "NotImplementedException"
86+
member __.NextResult(): bool = invalidOp "NotImplementedException"
87+
member __.RecordsAffected: int = invalidOp "NotImplementedException"
88+
89+
4890
type DesignTime private() =
4991
static member internal AddGeneratedMethod
5092
(sqlParameters: Parameter list, hasOutputParameters, executeArgs: ProvidedParameter list, erasedType, providedOutputType, name) =
@@ -663,41 +705,25 @@ type DesignTime private() =
663705
||> List.map2 (fun expr (typ, cols) ->
664706
let dest = typ.Name
665707

666-
let columnsNames, columnsTypeNames =
667-
cols
668-
|> List.map(fun c -> c.Name, c.TypeInfo.TypeName)
669-
|> List.toArray
670-
|> Array.unzip
671-
672-
<@@ (%%expr : _ seq)
673-
|> Seq.chunkBySize 5000
674-
|> Seq.iter(fun rows ->
675-
use table = new DataTable("Items");
676-
677-
(columnsNames, columnsTypeNames)
678-
||> Array.iter2(fun name typeName ->
679-
680-
let typ =
681-
match typeName with
682-
| "int" -> typedefof<int>
683-
| "string" -> typedefof<string>
684-
| "bit" -> typedefof<bool>
685-
| "binary" -> typedefof<byte[]>
686-
| _ -> invalidOp typeName
687-
688-
table.Columns.Add(name, typ) |> ignore
689-
)
690-
691-
rows
692-
|> Array.iter(fun row ->
693-
let row : obj[] = unbox row
694-
table.Rows.Add(row) |> ignore
695-
)
696-
697-
use bulkCopy = new SqlBulkCopy((%%connection : SqlConnection))
698-
bulkCopy.DestinationTableName <- "#" + dest
699-
bulkCopy.WriteToServer(table)
700-
) @@>
708+
//let columnsNames, columnsTypeNames =
709+
// cols
710+
// |> List.map(fun c -> c.Name, c.TypeInfo.TypeName)
711+
// |> List.toArray
712+
// |> Array.unzip
713+
714+
let len = cols.Length
715+
716+
<@@
717+
let items = (%%expr : obj seq)
718+
use reader = new TempTableLoader(len, items)
719+
720+
use bulkCopy = new SqlBulkCopy((%%connection : SqlConnection))
721+
bulkCopy.BulkCopyTimeout <- 0
722+
bulkCopy.BatchSize <- 5000
723+
bulkCopy.DestinationTableName <- "#" + dest
724+
bulkCopy.WriteToServer(reader)
725+
726+
@@>
701727
)
702728
|> List.fold (fun acc x -> Expr.Sequential(acc, x)) <@@ () @@>
703729

@@ -711,8 +737,9 @@ type DesignTime private() =
711737
<@@ let cmd = (%%command : ISqlCommand)
712738
cmd.Raw.Connection @@>
713739

714-
<@@ use create = new SqlCommand(tempTableDefinitions, (%%connection : SqlConnection))
715-
create.ExecuteScalar() |> ignore
740+
<@@ do
741+
use create = new SqlCommand(tempTableDefinitions, (%%connection : SqlConnection))
742+
create.ExecuteNonQuery() |> ignore
716743

717744
(%%loadValues exprArgs connection)
718745
ignore() @@>

0 commit comments

Comments
 (0)