Commit c6e14685 authored by mgravell's avatar mgravell
parents c312bba0 3ce97f74
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Data.Linq" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="..\Dapper\Properties\AssemblyInfo.cs"> <Compile Include="..\Dapper\Properties\AssemblyInfo.cs">
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Data.Linq" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="SqlMapper.cs" /> <Compile Include="SqlMapper.cs" />
......
...@@ -183,6 +183,7 @@ static SqlMapper() ...@@ -183,6 +183,7 @@ static SqlMapper()
typeMap[typeof(Guid?).TypeHandle] = DbType.Guid; typeMap[typeof(Guid?).TypeHandle] = DbType.Guid;
typeMap[typeof(DateTime?).TypeHandle] = DbType.DateTime; typeMap[typeof(DateTime?).TypeHandle] = DbType.DateTime;
typeMap[typeof(DateTimeOffset?).TypeHandle] = DbType.DateTimeOffset; typeMap[typeof(DateTimeOffset?).TypeHandle] = DbType.DateTimeOffset;
typeMap[typeof(System.Data.Linq.Binary).TypeHandle] = DbType.Binary;
} }
private static DbType LookupDbType(Type type, string name) private static DbType LookupDbType(Type type, string name)
...@@ -702,7 +703,7 @@ private static CacheInfo GetCacheInfo(Identity identity) ...@@ -702,7 +703,7 @@ private static CacheInfo GetCacheInfo(Identity identity)
} }
#endif #endif
if (type.IsClass && type != typeof(string) && type != typeof(byte[])) if (type.IsClass && type != typeof(string) && type != typeof(byte[]) && type != typeof(System.Data.Linq.Binary))
{ {
return GetClassDeserializer<T>(reader, startBound, length, returnNullIfFirstMissing); return GetClassDeserializer<T>(reader, startBound, length, returnNullIfFirstMissing);
} }
...@@ -1065,6 +1066,10 @@ private static IEnumerable<PropertyInfo> FilterParameters(IEnumerable<PropertyIn ...@@ -1065,6 +1066,10 @@ private static IEnumerable<PropertyInfo> FilterParameters(IEnumerable<PropertyIn
il.MarkLabel(lenDone); il.MarkLabel(lenDone);
il.Emit(OpCodes.Stloc_1); // [string] il.Emit(OpCodes.Stloc_1); // [string]
} }
if (prop.PropertyType == typeof(System.Data.Linq.Binary))
{
il.EmitCall(OpCodes.Callvirt, typeof(System.Data.Linq.Binary).GetMethod("ToArray", BindingFlags.Public | BindingFlags.Instance), null);
}
if (allDone != null) il.MarkLabel(allDone.Value); if (allDone != null) il.MarkLabel(allDone.Value);
// relative stack [boxed value or DBNull] // relative stack [boxed value or DBNull]
} }
...@@ -1132,6 +1137,10 @@ private static int ExecuteCommand(IDbConnection cnn, IDbTransaction tranaction, ...@@ -1132,6 +1137,10 @@ private static int ExecuteCommand(IDbConnection cnn, IDbTransaction tranaction,
{ {
return (Func<IDataReader, T>)(object)new Func<IDataReader, char?>(r => SqlMapper.ReadNullableChar(r.GetValue(index))); return (Func<IDataReader, T>)(object)new Func<IDataReader, char?>(r => SqlMapper.ReadNullableChar(r.GetValue(index)));
} }
if (typeof(T) == typeof(System.Data.Linq.Binary))
{
return (Func<IDataReader, T>)(object)new Func<IDataReader, System.Data.Linq.Binary>(r => new System.Data.Linq.Binary((byte[])r.GetValue(index)));
}
#pragma warning restore 618 #pragma warning restore 618
return r => return r =>
{ {
...@@ -1303,7 +1312,15 @@ static List<FieldInfo> GetSettableFields(Type t) ...@@ -1303,7 +1312,15 @@ static List<FieldInfo> GetSettableFields(Type t)
il.MarkLabel(isNotString); il.MarkLabel(isNotString);
} }
if (memberType == typeof(System.Data.Linq.Binary))
{
il.Emit(OpCodes.Unbox_Any, typeof(byte[])); // stack is now [target][target][byte-array]
il.Emit(OpCodes.Newobj, typeof(System.Data.Linq.Binary).GetConstructor(new Type[] { typeof(byte[]) }));// stack is now [target][target][binary]
}
else
{
il.Emit(OpCodes.Unbox_Any, unboxType); // stack is now [target][target][typed-value] il.Emit(OpCodes.Unbox_Any, unboxType); // stack is now [target][target][typed-value]
}
if (nullUnderlyingType != null && nullUnderlyingType.IsEnum) if (nullUnderlyingType != null && nullUnderlyingType.IsEnum)
{ {
il.Emit(OpCodes.Newobj, memberType.GetConstructor(new[] { nullUnderlyingType })); il.Emit(OpCodes.Newobj, memberType.GetConstructor(new[] { nullUnderlyingType }));
...@@ -1317,6 +1334,7 @@ static List<FieldInfo> GetSettableFields(Type t) ...@@ -1317,6 +1334,7 @@ static List<FieldInfo> GetSettableFields(Type t)
{ {
il.Emit(OpCodes.Stfld, item.Field); // stack is now [target] il.Emit(OpCodes.Stfld, item.Field); // stack is now [target]
} }
il.Emit(OpCodes.Br_S, finishLabel); // stack is now [target] il.Emit(OpCodes.Br_S, finishLabel); // stack is now [target]
il.MarkLabel(isDbNullLabel); // incoming stack: [target][target][value] il.MarkLabel(isDbNullLabel); // incoming stack: [target][target][value]
......
...@@ -1037,21 +1037,24 @@ public void TestDynamicParamNullSupport() ...@@ -1037,21 +1037,24 @@ public void TestDynamicParamNullSupport()
p.Get<int?>("@b").IsNull(); p.Get<int?>("@b").IsNull();
} }
class Foo1
{ {
public int Id; var input = new System.Data.Linq.Binary(orig);
public int BarId { get; set; }
var output = connection.Query<WithBinary>("select @input as [Value]", new { input }).First().Value;
output.ToArray().IsSequenceEqualTo(orig);
} }
class Bar1
{ {
public int BarId; var input = new System.Data.Linq.Binary(orig);
public string Name { get; set; }
var output = connection.Query<System.Data.Linq.Binary>("select @input as [Value]", new { input }).First();
output.ToArray().IsSequenceEqualTo(orig);
} }
public void TestMultiMapperIsNotConfusedWithUnorderedCols()
{ {
public System.Data.Linq.Binary Value { get; set; }
var result = connection.Query<Foo1,Bar1, Tuple<Foo1,Bar1>>("select 1 as Id, 2 as BarId, 3 as BarId, 'a' as Name", (f,b) => Tuple.Create(f,b), splitOn: "BarId").First(); var result = connection.Query<Foo1,Bar1, Tuple<Foo1,Bar1>>("select 1 as Id, 2 as BarId, 3 as BarId, 'a' as Name", (f,b) => Tuple.Create(f,b), splitOn: "BarId").First();
result.Item1.Id.IsEqualTo(1); result.Item1.Id.IsEqualTo(1);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment