Skip to content

Commit 4b26976

Browse files
committed
More agressive datareader closings
1 parent 807f02a commit 4b26976

12 files changed

Lines changed: 26 additions & 7 deletions

src/SQLProvider.Common/SqlRuntime.Linq.fs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,7 @@ module internal QueryImplementation =
302302
if con.State <> ConnectionState.Open then con.Open()
303303
use reader = cmd.ExecuteReader()
304304
let results = dc.ReadEntities(baseTable.FullName, columns, reader)
305+
reader.Close()
305306
if provider.CloseConnectionAfterQuery && con.State <> ConnectionState.Closed then con.Close() //else get 'COM object that has been separated from its underlying RCW cannot be used.'
306307
if not isGroypBy then
307308
invokeEntitiesListAvoidingDynamicInvoke results projector
@@ -326,6 +327,7 @@ module internal QueryImplementation =
326327
con.Open()
327328
use! reader = cmd.ExecuteReaderAsync()
328329
let! results = dc.ReadEntitiesAsync(baseTable.FullName, columns, reader)
330+
reader.Close()
329331
if provider.CloseConnectionAfterQuery then con.Close() //else get 'COM object that has been separated from its underlying RCW cannot be used.'
330332
return
331333
if not isGroypBy then

src/SQLProvider.Common/Utils.fs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -756,7 +756,7 @@ module Sql =
756756
open System
757757
open System.Data
758758

759-
let private collectfunc(reader:IDataReader) =
759+
let inline private collectfunc(reader:IDataReader) =
760760
[|
761761
for i = 0 to reader.FieldCount - 1 do
762762
let v = reader.GetValue i // if we would like to swallow unknown types errors: try reader.GetValue(i) with | :? System.IO.FileNotFoundException as ex -> box ex
@@ -780,10 +780,10 @@ module Sql =
780780
return res |> Seq.toArray
781781
}
782782

783-
let dbUnbox<'a> (v:obj) : 'a =
783+
let inline dbUnbox<'a> (v:obj) : 'a =
784784
if Convert.IsDBNull(v) then Unchecked.defaultof<'a> else unbox v
785785

786-
let dbUnboxWithDefault<'a> def (v:obj) : 'a =
786+
let inline dbUnboxWithDefault<'a> def (v:obj) : 'a =
787787
if Convert.IsDBNull(v) then def else unbox v
788788

789789
/// Note: SQLProvider reuses the connection through multiple instances, so you can't dispose it here.

src/SQLProvider.DesignTime/SqlDesignTime.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ module DesignTimeUtils =
177177
if con.State <> ConnectionState.Open then con.Open()
178178
use reader = com.ExecuteReader()
179179
let ret = (dcDone :> ISqlDataContext).ReadEntities(table.FullName+"_"+pkName, columns, reader)
180+
reader.Close()
180181
if (dbVendor <> DatabaseProviderTypes.MSACCESS) then con.Close()
181182
let mapped = ret |> Array.choose(fun e ->
182183
match (e :> IColumnHolder).GetColumn pkName with

src/SQLProvider.Runtime/Providers.DuckDb.fs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,12 +347,13 @@ module DuckDb =
347347
| [||] -> let! r = com.ExecuteNonQueryAsync()
348348
return Unit
349349
| [|retCol|] ->
350-
use! reader = com.ExecuteReaderAsync()
351350
match retCol.TypeMapping.ProviderTypeName with
352351
| ValueSome "cursor" ->
352+
use! reader = com.ExecuteReaderAsync()
353353
let! r = Sql.dataReaderToArrayAsync reader
354354
let result = SingleResultSet(retCol.Name, r)
355355
let! _ = reader.NextResultAsync()
356+
if not reader.IsClosed then reader.Close()
356357
return result
357358
| _ ->
358359
match outps |> Array.tryFind (fun (_,p) -> p.ParameterName = retCol.Name) with
@@ -361,6 +362,7 @@ module DuckDb =
361362
| cols ->
362363
use! reader = com.ExecuteReaderAsync()
363364
let! r = cols |> Array.toList |> Sql.evaluateOneByOne (processReturnColumnAsync reader outps)
365+
if not reader.IsClosed then reader.Close()
364366
return Set(r)
365367
}
366368

src/SQLProvider.Runtime/Providers.Firebird.fs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -442,12 +442,13 @@ module Firebird =
442442
| [||] -> let! r = com.ExecuteNonQueryAsync()
443443
return Unit
444444
| [|retCol|] ->
445-
use! reader = com.ExecuteReaderAsync()
446445
match retCol.TypeMapping.ProviderTypeName with
447446
| ValueSome "cursor" ->
447+
use! reader = com.ExecuteReaderAsync()
448448
let! r = Sql.dataReaderToArrayAsync reader
449449
let result = SingleResultSet(retCol.Name, r)
450450
let! _ = reader.NextResultAsync()
451+
if not reader.IsClosed then reader.Close()
451452
return result
452453
| _ ->
453454
match outps |> Array.tryFind (fun (_,p) -> p.ParameterName = retCol.Name) with
@@ -456,6 +457,7 @@ module Firebird =
456457
| cols ->
457458
use! reader = com.ExecuteReaderAsync()
458459
let! r = cols |> Array.toList |> Sql.evaluateOneByOne (processReturnColumnAsync reader outps)
460+
if not reader.IsClosed then reader.Close()
459461
return Set(r)
460462
}
461463

src/SQLProvider.Runtime/Providers.MsSqlServer.Dynamic.fs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,7 @@ module MSSqlServerDynamic =
420420
let! r = Sql.dataReaderToArrayAsync reader
421421
let result = SingleResultSet(retCol.Name, r)
422422
let! _ = reader.NextResultAsync()
423+
if not reader.IsClosed then reader.Close()
423424
return result
424425
| _ ->
425426
let! r = com.ExecuteNonQueryAsync()
@@ -429,6 +430,7 @@ module MSSqlServerDynamic =
429430
| cols ->
430431
use! reader = com.ExecuteReaderAsync()
431432
let! r = cols |> Array.toList |> Sql.evaluateOneByOne (processReturnColumnAsync com reader)
433+
if not reader.IsClosed then reader.Close()
432434
return Set(r |> List.toArray)
433435
}
434436

src/SQLProvider.Runtime/Providers.MsSqlServer.fs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,7 @@ module MSSqlServer =
347347
let! r = Sql.dataReaderToArrayAsync reader
348348
let result = SingleResultSet(retCol.Name, r)
349349
let! _ = reader.NextResultAsync()
350+
if not reader.IsClosed then reader.Close()
350351
return result
351352
| _ ->
352353
let! r = com.ExecuteNonQueryAsync()
@@ -356,6 +357,7 @@ module MSSqlServer =
356357
| cols ->
357358
use! reader = com.ExecuteReaderAsync()
358359
let! r = cols |> Array.toList |> Sql.evaluateOneByOne (processReturnColumnAsync com reader)
360+
if not reader.IsClosed then reader.Close()
359361
return Set(r |> List.toArray)
360362
}
361363

src/SQLProvider.Runtime/Providers.MySql.fs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,12 +391,13 @@ module MySql =
391391
| [||] -> let! r = com.ExecuteNonQueryAsync()
392392
return Unit
393393
| [|retCol|] ->
394-
use! reader = com.ExecuteReaderAsync()
395394
match retCol.TypeMapping.ProviderTypeName with
396395
| ValueSome "cursor" ->
396+
use! reader = com.ExecuteReaderAsync()
397397
let! r = Sql.dataReaderToArrayAsync reader
398398
let result = SingleResultSet(retCol.Name, r)
399399
let! _ = reader.NextResultAsync()
400+
if not reader.IsClosed then reader.Close()
400401
return result
401402
| _ ->
402403
match outps |> Array.tryFind (fun (_,p) -> p.ParameterName = retCol.Name) with
@@ -405,6 +406,7 @@ module MySql =
405406
| cols ->
406407
use! reader = com.ExecuteReaderAsync()
407408
let! r = cols |> Array.toList |> Sql.evaluateOneByOne (processReturnColumnAsync reader outps)
409+
if not reader.IsClosed then reader.Close()
408410
return Set(r)
409411
}
410412

src/SQLProvider.Runtime/Providers.Oracle.fs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -559,10 +559,11 @@ module internal Oracle =
559559
| [||] -> let! r = com.ExecuteNonQueryAsync()
560560
return Unit
561561
| [|col|] ->
562-
use! reader = com.ExecuteReaderAsync()
563562
match col.TypeMapping.ProviderTypeName with
564563
| ValueSome "REF CURSOR" ->
564+
use! reader = com.ExecuteReaderAsync()
565565
let! r = Sql.dataReaderToArrayAsync reader
566+
if not reader.IsClosed then reader.Close()
566567
return SingleResultSet(col.Name, r)
567568
| _ ->
568569
match outps |> Array.tryFind (fun (_,p) -> p.ParameterName = col.Name) with

src/SQLProvider.Runtime/Providers.Postgresql.fs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,7 @@ module PostgreSQL =
431431
task {
432432
use! reader = com.ExecuteReaderAsync()
433433
let! r = Sql.dataReaderToArrayAsync reader
434+
if not reader.IsClosed then reader.Close()
434435
return SingleResultSet(col.Name, r)
435436
}
436437
| ValueSome "refcursor" ->
@@ -442,6 +443,7 @@ module PostgreSQL =
442443
com.CommandType <- CommandType.Text
443444
use! reader = com.ExecuteReaderAsync()
444445
let! r = Sql.dataReaderToArrayAsync reader
446+
if not reader.IsClosed then reader.Close()
445447
return SingleResultSet(col.Name, r)
446448
}
447449
| ValueSome "SETOF refcursor" ->
@@ -454,6 +456,7 @@ module PostgreSQL =
454456
let! r = Sql.dataReaderToArrayAsync reader
455457
results := ResultSet("ReturnValue" + (string !i), r) :: !results
456458
incr(i)
459+
if not reader.IsClosed then reader.Close()
457460
return Set(!results)
458461
}
459462
| _ ->

0 commit comments

Comments
 (0)