F# - FSharp.Data.SqlClient – How to specify timeout for Update

428 Views Asked by At

I use FSharp.Data.SqlClient type providers to access SQL server database. So, I set up the types in F# something as follows:

type ClmDB = SqlProgrammabilityProvider<ClmSqlProviderName, ConfigFile = AppConfigFile>
type ResultDataTable = ClmDB.dbo.Tables.ResultData
type ResultDataTableRow = ResultDataTable.Row

and then I use it something like that:

let saveResultData (r : ResultData) (conn : SqlConnection) =
    let t = new ResultDataTable()
    let newRow = r.addRow t
    t.Update(conn) |> ignore
    newRow.resultDataId

where ResultData is some type, which "knows" how to convert itself into a row of ResultDataTable (ResultDataTableRow). The extension r.addRow t does that.

Everything is great, except that the row that I am inserting might be fairly large (25-30 MB in size) and so, I have a bad feeling that t.Update(conn) might randomly time out especially due to nearly 100% processor load (the computational system core is designed to consume all processing resources, though at low priority). Hovering over t.Update does not show any way to specify a timeout and any timeout at the level of connection is related, well, to a connection, not to the insert transaction ☹.

So, the question is how to specify timeout for an Update transaction.

Thanks a lot!

20190116 update - So far t.Update(conn) above is holding up without timeouts on my machine while inserting 95MB data rows at 100% below normal load of some other stuff running there. I have not yet measured the actual time for such transactions. If I do, then I will update this.

1

There are 1 best solutions below

6
On BEST ANSWER

You cannot specify timeout for Update method of a provided DataTable because the current Type Provider implementation does not provision for such feature.

However, as the documentation notes you may have few options for customizing the default behavior.

In addition, as your use case resembles an insert of a single row into the table I'd stick to an implementation with the help of SqlCommandProvider using its constructor's commandTimeOut optional parameter for setting the desired timeout value timespan, as in a snippet below:

type AddRow = SqlCommandProvider<"path to the parameterized INSERT statement", designTimeConnection> 
..............................
(new AddRow(runTimeConnection, commandTimeOut=timespan)).Execute(...arg=value...) |> ignore