You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
2.4 KiB
66 lines
2.4 KiB
using System;
|
|
using System.Data;
|
|
using System.Reflection;
|
|
|
|
#if !NETCOREAPP
|
|
namespace Dapper
|
|
{
|
|
/// <summary>
|
|
/// Used to pass a DataTable as a TableValuedParameter
|
|
/// </summary>
|
|
sealed class TableValuedParameter : SqlMapper.ICustomQueryParameter
|
|
{
|
|
private readonly DataTable table;
|
|
private readonly string typeName;
|
|
|
|
/// <summary>
|
|
/// Create a new instance of TableValuedParameter
|
|
/// </summary>
|
|
public TableValuedParameter(DataTable table) : this(table, null) { }
|
|
/// <summary>
|
|
/// Create a new instance of TableValuedParameter
|
|
/// </summary>
|
|
public TableValuedParameter(DataTable table, string typeName)
|
|
{
|
|
this.table = table;
|
|
this.typeName = typeName;
|
|
}
|
|
static readonly Action<System.Data.SqlClient.SqlParameter, string> setTypeName;
|
|
static TableValuedParameter()
|
|
{
|
|
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, table, typeName);
|
|
command.Parameters.Add(param);
|
|
}
|
|
internal static void Set(IDbDataParameter parameter, DataTable table, string typeName)
|
|
{
|
|
#pragma warning disable 0618
|
|
parameter.Value = SqlMapper.SanitizeParameterValue(table);
|
|
#pragma warning restore 0618
|
|
if (string.IsNullOrEmpty(typeName) && table != null)
|
|
{
|
|
typeName = table.GetTypeName();
|
|
}
|
|
if (!string.IsNullOrEmpty(typeName))
|
|
{
|
|
var sqlParam = parameter as System.Data.SqlClient.SqlParameter;
|
|
if (sqlParam != null)
|
|
{
|
|
setTypeName?.Invoke(sqlParam, typeName);
|
|
sqlParam.SqlDbType = SqlDbType.Structured;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|