Commit 92d1fbe5 authored by Marc Gravell's avatar Marc Gravell

Fix list handling when using dynamic parameters; see http://stackoverflow.com/q/12723922/23354

parent 7910f25b
......@@ -408,7 +408,7 @@ static SqlMapper()
}
internal const string LinqBinary = "System.Data.Linq.Binary";
private static DbType LookupDbType(Type type, string name)
internal static DbType LookupDbType(Type type, string name)
{
DbType dbType;
var nullUnderlyingType = Nullable.GetUnderlyingType(type);
......@@ -1394,7 +1394,7 @@ public static IDbDataParameter FindOrAddParameter(IDataParameterCollection param
/// Internal use only
/// </summary>
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete("This method is for internal usage only", true)]
[Obsolete("This method is for internal usage only", false)]
public static void PackListParameters(IDbCommand command, string namePrefix, object value)
{
// initially we tried TVP, however it performs quite poorly.
......@@ -2572,41 +2572,58 @@ protected void AddParameters(IDbCommand command, SqlMapper.Identity identity)
foreach (var param in parameters.Values)
{
var dbType = param.DbType;
var val = param.Value;
string name = Clean(param.Name);
bool add = !command.Parameters.Contains(name);
IDbDataParameter p;
if(add)
{
p = command.CreateParameter();
p.ParameterName = name;
} else
{
p = (IDbDataParameter)command.Parameters[name];
if (dbType == null && val != null) dbType = SqlMapper.LookupDbType(val.GetType(), name);
if (dbType == DbType.Xml)
{ // actually represents "in" lists
#pragma warning disable 612, 618
SqlMapper.PackListParameters(command, name, val);
#pragma warning restore 612, 618
}
var val = param.Value;
p.Value = val ?? DBNull.Value;
p.Direction = param.ParameterDirection;
var s = val as string;
if (s != null)
else
{
if (s.Length <= 4000)
bool add = !command.Parameters.Contains(name);
IDbDataParameter p;
if (add)
{
p.Size = 4000;
p = command.CreateParameter();
p.ParameterName = name;
}
else
{
p = (IDbDataParameter)command.Parameters[name];
}
p.Value = val ?? DBNull.Value;
p.Direction = param.ParameterDirection;
var s = val as string;
if (s != null)
{
if (s.Length <= 4000)
{
p.Size = 4000;
}
}
if (param.Size != null)
{
p.Size = param.Size.Value;
}
if (dbType != null)
{
p.DbType = dbType.Value;
}
if (add)
{
command.Parameters.Add(p);
}
param.AttachedParam = p;
}
if (param.Size != null)
{
p.Size = param.Size.Value;
}
if (param.DbType != null)
{
p.DbType = param.DbType.Value;
}
if (add)
{
command.Parameters.Add(p);
}
param.AttachedParam = p;
}
}
......
......@@ -122,7 +122,12 @@ private static void RunTests()
{
method.Invoke(tester, null);
Console.WriteLine(" - OK!");
} catch (Exception ex)
} catch(TargetInvocationException tie)
{
fail++;
Console.WriteLine(" - " + tie.InnerException.Message);
}catch (Exception ex)
{
fail++;
Console.WriteLine(" - " + ex.Message);
......
......@@ -1598,6 +1598,34 @@ public void TestAppendingAList()
result[2].IsEqualTo(3);
}
public void TestAppendingAListAsDictionary()
{
DynamicParameters p = new DynamicParameters();
var list = new int[] { 1, 2, 3 };
var args = new Dictionary<string, object>();
args.Add("ids", list);
p.AddDynamicParams(args);
var result = connection.Query<int>("select * from (select 1 A union all select 2 union all select 3) X where A in @ids", p).ToList();
result[0].IsEqualTo(1);
result[1].IsEqualTo(2);
result[2].IsEqualTo(3);
}
public void TestAppendingAListByName()
{
DynamicParameters p = new DynamicParameters();
var list = new int[] { 1, 2, 3 };
p.Add("ids", list);
var result = connection.Query<int>("select * from (select 1 A union all select 2 union all select 3) X where A in @ids", p).ToList();
result[0].IsEqualTo(1);
result[1].IsEqualTo(2);
result[2].IsEqualTo(3);
}
public void TestUniqueIdentifier()
{
var guid = Guid.NewGuid();
......
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