Skip to content

Instantly share code, notes, and snippets.

@marcingolenia
Created June 14, 2020 17:45
Show Gist options
  • Save marcingolenia/b038ac49ccfd308dcd775ae0fa0c74dd to your computer and use it in GitHub Desktop.
Save marcingolenia/b038ac49ccfd308dcd775ae0fa0c74dd to your computer and use it in GitHub Desktop.
FSharpDapperWrapper
namespace FSharpDapperWrapper
open System.Data
module DapperFSharp =
open System.Data.SqlClient
open Dapper
let dbQuery<'Result> (query: string) (connection: SqlConnection): Async<'Result seq> =
connection.QueryAsync<'Result>(query) |> Async.AwaitTask
let dbQueryMultiple (query: string) (connection: SqlConnection): Async<SqlMapper.GridReader> =
connection.QueryMultipleAsync(query) |> Async.AwaitTask
let dbParametrizedQueryMultiple (query: string) (param: obj) (connection: SqlConnection): Async<SqlMapper.GridReader> =
connection.QueryMultipleAsync(query, param) |> Async.AwaitTask
let dbParamatrizedQuery<'Result> (query: string) (param: obj) (connection: SqlConnection): Async<'Result seq> =
connection.QueryAsync<'Result>(query, param) |> Async.AwaitTask
let dbParamatrizedExecute (sql: string) (param: obj) (connection: SqlConnection) =
connection.ExecuteAsync(sql, param)
|> Async.AwaitTask
|> Async.Ignore
let createSqlConnection connectionString =
OptionHandler.RegisterTypes()
async {
let connection = new SqlConnection(connectionString)
if connection.State <> ConnectionState.Open then do! connection.OpenAsync() |> Async.AwaitTask
return connection
}
type Dapper.SqlMapper.GridReader with
member reader.Read<'a>() = reader.ReadAsync<'a>() |> Async.AwaitTask
namespace FSharpDapperWrapper
open Dapper
open System
type OptionHandler<'T> () =
inherit SqlMapper.TypeHandler<option<'T>> ()
override __.SetValue (param, value) =
let valueOrNull =
match value with
| Some x -> box x
| None -> null
param.Value <- valueOrNull
override __.Parse value =
if Object.ReferenceEquals(value, null) || value = box DBNull.Value
then None
else Some (value :?> 'T)
module OptionHandler =
let RegisterTypes () =
SqlMapper.AddTypeHandler (OptionHandler<bool>())
SqlMapper.AddTypeHandler (OptionHandler<byte>())
SqlMapper.AddTypeHandler (OptionHandler<sbyte>())
SqlMapper.AddTypeHandler (OptionHandler<int16>())
SqlMapper.AddTypeHandler (OptionHandler<uint16>())
SqlMapper.AddTypeHandler (OptionHandler<int32>())
SqlMapper.AddTypeHandler (OptionHandler<uint32>())
SqlMapper.AddTypeHandler (OptionHandler<int64>())
SqlMapper.AddTypeHandler (OptionHandler<uint64>())
SqlMapper.AddTypeHandler (OptionHandler<single>())
SqlMapper.AddTypeHandler (OptionHandler<float>())
SqlMapper.AddTypeHandler (OptionHandler<double>())
SqlMapper.AddTypeHandler (OptionHandler<decimal>())
SqlMapper.AddTypeHandler (OptionHandler<char>())
SqlMapper.AddTypeHandler (OptionHandler<string>())
SqlMapper.AddTypeHandler (OptionHandler<Guid>())
SqlMapper.AddTypeHandler (OptionHandler<DateTime>())
SqlMapper.AddTypeHandler (OptionHandler<DateTimeOffset>())
SqlMapper.AddTypeHandler (OptionHandler<TimeSpan>())
SqlMapper.AddTypeHandler (OptionHandler<DateTimeOffset>())
SqlMapper.AddTypeHandler (OptionHandler<obj>())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment