Skip to content

Instantly share code, notes, and snippets.

@leflings
Created November 26, 2015 17:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save leflings/3df8ba4d82867ee770ab to your computer and use it in GitHub Desktop.
Save leflings/3df8ba4d82867ee770ab to your computer and use it in GitHub Desktop.
Slight modification of Tomas Petriceks dynamic sql data reader
open System
open System.Data
open System.Data.SqlClient
open MySql.Data.MySqlClient
type DynamicSqlDataReader(reader:MySqlDataReader) =
member private x.Reader = reader
member x.Read() = reader.Read()
static member (?) (dr:DynamicSqlDataReader, name:string) : 'R =
let typ = typeof<'R>
if typ.IsGenericType && typ.GetGenericTypeDefinition() = typedefof<option<_>> then
if dr.Reader.[name] = box DBNull.Value then
(box null) :?> 'R
else typ.GetMethod("Some").Invoke(null, [| dr.Reader.[name] |]) :?> 'R
else
unbox (dr.Reader.[name]) // :?> 'R
interface IDisposable with
member x.Dispose() = reader.Dispose()
type DynamicSqlCommand(cmd:MySqlCommand) =
member private x.Command = cmd
static member (?<-) (cmd:DynamicSqlCommand, name:string, value) =
cmd.Command.Parameters.Add(MySqlParameter("@" + name, box value)) |> ignore
member x.ExecuteNonQuery() = cmd.ExecuteNonQuery()
member x.ExecuteReader() = new DynamicSqlDataReader(cmd.ExecuteReader())
member x.ExecuteScalar() = cmd.ExecuteScalar()
member x.Parameters = cmd.Parameters
interface IDisposable with
member x.Dispose() = cmd.Dispose()
type DynamicSqlConnection(conn:MySqlConnection) =
member private x.Connection = conn
static member (?) (conn:DynamicSqlConnection, name) =
let command = new MySqlCommand(name, conn.Connection)
command.CommandType <- CommandType.StoredProcedure
new DynamicSqlCommand(command)
static member (%%) (conn:DynamicSqlConnection, query) =
let command = new MySqlCommand(query, conn.Connection)
new DynamicSqlCommand(command)
member x.Open() = conn.Open()
new (connStr:string) = new DynamicSqlConnection(new MySqlConnection(connStr))
interface IDisposable with
member x.Dispose() = conn.Dispose()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment