Commit 1e27c363 authored by Marc Gravell's avatar Marc Gravell

Merge branch 'sqmgh-master'

parents 83b47e31 c547543e
...@@ -770,7 +770,8 @@ static SqlMapper() ...@@ -770,7 +770,8 @@ static SqlMapper()
typeMap[typeof(object)] = DbType.Object; typeMap[typeof(object)] = DbType.Object;
#if !DNXCORE50 #if !DNXCORE50
AddTypeHandlerImpl(typeof(DataTable), new DataTableHandler(), false); AddTypeHandlerImpl(typeof(DataTable), new DataTableHandler(), false);
#endif AddTypeHandlerImpl(typeof(IEnumerable<Microsoft.SqlServer.Server.SqlDataRecord>), new SqlDataRecordHandler(), false);
#endif
} }
/// <summary> /// <summary>
...@@ -781,7 +782,8 @@ public static void ResetTypeHandlers() ...@@ -781,7 +782,8 @@ public static void ResetTypeHandlers()
typeHandlers = new Dictionary<Type, ITypeHandler>(); typeHandlers = new Dictionary<Type, ITypeHandler>();
#if !DNXCORE50 #if !DNXCORE50
AddTypeHandlerImpl(typeof(DataTable), new DataTableHandler(), true); AddTypeHandlerImpl(typeof(DataTable), new DataTableHandler(), true);
#endif AddTypeHandlerImpl(typeof(IEnumerable<Microsoft.SqlServer.Server.SqlDataRecord>), new SqlDataRecordHandler(), true);
#endif
} }
/// <summary> /// <summary>
/// Configure the specified type to be mapped to a given db-type /// Configure the specified type to be mapped to a given db-type
...@@ -4562,6 +4564,19 @@ public static string GetTypeName(this DataTable table) ...@@ -4562,6 +4564,19 @@ public static string GetTypeName(this DataTable table)
{ {
return table == null ? null : table.ExtendedProperties[DataTableTypeNameKey] as string; return table == null ? null : table.ExtendedProperties[DataTableTypeNameKey] as string;
} }
/// <summary>
/// Used to pass a IEnumerable&lt;SqlDataRecord&gt; as a TableValuedParameter
/// </summary>
public static ICustomQueryParameter AsTableValuedParameter(this IEnumerable<Microsoft.SqlServer.Server.SqlDataRecord> list, string typeName
#if !CSHARP30
= null
#endif
)
{
return new SqlDataRecordListTVPParameter(list, typeName);
}
#endif #endif
// one per thread // one per thread
...@@ -4820,16 +4835,16 @@ protected void AddParameters(IDbCommand command, SqlMapper.Identity identity) ...@@ -4820,16 +4835,16 @@ protected void AddParameters(IDbCommand command, SqlMapper.Identity identity)
SqlMapper.ITypeHandler handler = null; SqlMapper.ITypeHandler handler = null;
if (dbType == null && val != null && !isCustomQueryParameter) dbType = SqlMapper.LookupDbType(val.GetType(), name, true, out handler); if (dbType == null && val != null && !isCustomQueryParameter) dbType = SqlMapper.LookupDbType(val.GetType(), name, true, out handler);
if (dbType == DynamicParameters.EnumerableMultiParameter) if (isCustomQueryParameter)
{
((SqlMapper.ICustomQueryParameter)val).AddParameter(command, name);
}
else if (dbType == DynamicParameters.EnumerableMultiParameter)
{ {
#pragma warning disable 612, 618 #pragma warning disable 612, 618
SqlMapper.PackListParameters(command, name, val); SqlMapper.PackListParameters(command, name, val);
#pragma warning restore 612, 618 #pragma warning restore 612, 618
} }
else if (isCustomQueryParameter)
{
((SqlMapper.ICustomQueryParameter)val).AddParameter(command, name);
}
else else
{ {
...@@ -5125,6 +5140,63 @@ public void SetValue(IDbDataParameter parameter, object value) ...@@ -5125,6 +5140,63 @@ public void SetValue(IDbDataParameter parameter, object value)
} }
} }
sealed class SqlDataRecordHandler : Dapper.SqlMapper.ITypeHandler
{
public object Parse(Type destinationType, object value)
{
throw new NotImplementedException();
}
public void SetValue(IDbDataParameter parameter, object value)
{
SqlDataRecordListTVPParameter.Set(parameter, value as IEnumerable<Microsoft.SqlServer.Server.SqlDataRecord>, null);
}
}
/// <summary>
/// Used to pass a IEnumerable&lt;SqlDataRecord&gt; as a SqlDataRecordListTVPParameter
/// </summary>
sealed partial class SqlDataRecordListTVPParameter : Dapper.SqlMapper.ICustomQueryParameter
{
private readonly IEnumerable<Microsoft.SqlServer.Server.SqlDataRecord> data;
private readonly string typeName;
/// <summary>
/// Create a new instance of SqlDataRecordListTVPParameter
/// </summary>
public SqlDataRecordListTVPParameter(IEnumerable<Microsoft.SqlServer.Server.SqlDataRecord> data, string typeName)
{
this.data = data;
this.typeName = typeName;
}
static readonly Action<System.Data.SqlClient.SqlParameter, string> setTypeName;
static SqlDataRecordListTVPParameter()
{
var prop = typeof(System.Data.SqlClient.SqlParameter).GetProperty("TypeName", BindingFlags.Instance | BindingFlags.Public);
if(prop != null && prop.PropertyType == typeof(string) && prop.CanWrite)
{
setTypeName = (Action<System.Data.SqlClient.SqlParameter, string>)
Delegate.CreateDelegate(typeof(Action<System.Data.SqlClient.SqlParameter, string>), prop.GetSetMethod());
}
}
void SqlMapper.ICustomQueryParameter.AddParameter(IDbCommand command, string name)
{
var param = command.CreateParameter();
param.ParameterName = name;
Set(param, data, typeName);
command.Parameters.Add(param);
}
internal static void Set(IDbDataParameter parameter, IEnumerable<Microsoft.SqlServer.Server.SqlDataRecord> data, string typeName)
{
parameter.Value = (object)data ?? DBNull.Value;
var sqlParam = parameter as System.Data.SqlClient.SqlParameter;
if (sqlParam != null)
{
sqlParam.SqlDbType = SqlDbType.Structured;
sqlParam.TypeName = typeName;
}
}
}
/// <summary> /// <summary>
/// Used to pass a DataTable as a TableValuedParameter /// Used to pass a DataTable as a TableValuedParameter
/// </summary> /// </summary>
......
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