提交 4fa4705c 编写于 作者: M mgravell

add Binary support

上级 aa98265b
......@@ -36,6 +36,7 @@
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Data" />
<Reference Include="System.Data.Linq" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\Dapper\Properties\AssemblyInfo.cs">
......
......@@ -36,6 +36,7 @@
<Reference Include="System.Core" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Data.Linq" />
</ItemGroup>
<ItemGroup>
<Compile Include="SqlMapper.cs" />
......
......@@ -183,6 +183,7 @@ static SqlMapper()
typeMap[typeof(Guid?).TypeHandle] = DbType.Guid;
typeMap[typeof(DateTime?).TypeHandle] = DbType.DateTime;
typeMap[typeof(DateTimeOffset?).TypeHandle] = DbType.DateTimeOffset;
typeMap[typeof(System.Data.Linq.Binary).TypeHandle] = DbType.Binary;
}
private static DbType LookupDbType(Type type, string name)
......@@ -669,7 +670,7 @@ private static CacheInfo GetCacheInfo(Identity identity)
}
#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);
}
......@@ -1032,6 +1033,10 @@ private static IEnumerable<PropertyInfo> FilterParameters(IEnumerable<PropertyIn
il.MarkLabel(lenDone);
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);
// relative stack [boxed value or DBNull]
}
......@@ -1099,6 +1104,10 @@ private static int ExecuteCommand(IDbConnection cnn, IDbTransaction tranaction,
{
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
return r =>
{
......@@ -1253,7 +1262,15 @@ static readonly MethodInfo
il.MarkLabel(isNotString);
}
il.Emit(OpCodes.Unbox_Any, unboxType); // stack is now [target][target][typed-value]
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]
}
if (nullUnderlyingType != null && nullUnderlyingType.IsEnum)
{
il.Emit(OpCodes.Newobj, memberType.GetConstructor(new[] { nullUnderlyingType }));
......@@ -1267,6 +1284,7 @@ static readonly MethodInfo
{
il.Emit(OpCodes.Stfld, item.Field); // stack is now [target]
}
il.Emit(OpCodes.Br_S, finishLabel); // stack is now [target]
il.MarkLabel(isDbNullLabel); // incoming stack: [target][target][value]
......
......@@ -1036,5 +1036,32 @@ public void TestDynamicParamNullSupport()
p.Get<int?>("@b").IsNull();
}
public void TestLinqBinaryToClass()
{
byte[] orig = new byte[20];
new Random(123456).NextBytes(orig);
var input = new System.Data.Linq.Binary(orig);
var output = connection.Query<WithBinary>("select @input as [Value]", new { input }).First().Value;
output.ToArray().IsSequenceEqualTo(orig);
}
public void TestLinqBinaryRaw()
{
byte[] orig = new byte[20];
new Random(123456).NextBytes(orig);
var input = new System.Data.Linq.Binary(orig);
var output = connection.Query<System.Data.Linq.Binary>("select @input as [Value]", new { input }).First();
output.ToArray().IsSequenceEqualTo(orig);
}
class WithBinary
{
public System.Data.Linq.Binary Value { get; set; }
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册