@@ -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+
4890type 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