Skip to content

Instantly share code, notes, and snippets.

@chilversc
Created July 25, 2014 13:34
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 chilversc/55450f33f2f06e64a99f to your computer and use it in GitHub Desktop.
Save chilversc/55450f33f2f06e64a99f to your computer and use it in GitHub Desktop.
Dapper type handler nullable types
void Main()
{
SqlMapper.AddTypeHandler (typeof (Wrapper), WrapperHandler.Default);
SqlMapper.AddTypeHandler (typeof (Wrapper?), WrapperHandler.Default);
using (var db = new SqlConnection("Server=.;Database=tempdb;Integrated Security=SSPI")) {
db.Open();
db.Query<Foo> ("SELECT 1 AS A, NULL AS B, 2 AS C, 3 AS D, NULL AS E").Dump();
}
}
class Foo
{
public int A { get; set; }
public int? B { get; set; }
public Wrapper C { get; set; }
public Wrapper? D { get; set; }
public Wrapper? E { get; set; }
}
struct Wrapper
{
public int Item { get; set; }
}
class WrapperHandler : ValueTypeHandler<Wrapper>
{
public static readonly WrapperHandler Default = new WrapperHandler ();
public override Wrapper Parse (object value)
{
return new Wrapper { Item = (int) value };
}
public override void SetValue (IDbDataParameter parameter, Wrapper value)
{
parameter.DbType = DbType.Int32;
parameter.Value = value.Item;
}
}
void Main()
{
SqlMapper.AddTypeHandler<Wrapper> (WrapperHandler.Default);
SqlMapper.AddTypeHandler<Wrapper?> (NullableWrapperHandler.Default);
using (var db = new SqlConnection("Server=.;Database=tempdb;Integrated Security=SSPI")) {
db.Open();
db.Query<Foo> ("SELECT 1 AS A, NULL AS B, 2 AS C, 3 AS D, NULL AS E").Dump();
}
}
class Foo
{
public int A { get; set; }
public int? B { get; set; }
public Wrapper C { get; set; }
public Wrapper? D { get; set; }
public Wrapper? E { get; set; }
}
struct Wrapper
{
public int Item { get; set; }
}
class WrapperHandler : SqlMapper.TypeHandler<Wrapper>
{
public static readonly WrapperHandler Default = new WrapperHandler ();
public override Wrapper Parse (object value)
{
return new Wrapper { Item = (int) value };
}
public override void SetValue (IDbDataParameter parameter, Wrapper value)
{
parameter.DbType = DbType.Int32;
parameter.Value = value.Item;
}
}
class NullableWrapperHandler : SqlMapper.TypeHandler<Wrapper?>
{
public static readonly NullableWrapperHandler Default = new NullableWrapperHandler ();
public override Wrapper? Parse (object value)
{
if (value == null || value == DBNull.Value) {
return null;
} else {
return new Wrapper { Item = (int) value };
}
}
public override void SetValue (IDbDataParameter parameter, Wrapper? value)
{
parameter.DbType = DbType.Int32;
if (value == null) {
parameter.Value = value.Value.Item;
} else {
parameter.Value = DBNull.Value;
}
}
}
abstract class ValueTypeHandler<T> : SqlMapper.ITypeHandler where T : struct
{
public abstract T Parse (object value);
public abstract void SetValue(IDbDataParameter parameter, T value);
object SqlMapper.ITypeHandler.Parse (Type destinationType, object value)
{
if (value == null) {
return null;
} else if (value is DBNull) {
return null;
} else {
return Parse (value);
}
}
void SqlMapper.ITypeHandler.SetValue (IDbDataParameter parameter, object value)
{
if (value is DBNull) {
parameter.Value = value;
} else {
SetValue (parameter, (T) value);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment