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() ...@@ -408,7 +408,7 @@ static SqlMapper()
} }
internal const string LinqBinary = "System.Data.Linq.Binary"; 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; DbType dbType;
var nullUnderlyingType = Nullable.GetUnderlyingType(type); var nullUnderlyingType = Nullable.GetUnderlyingType(type);
...@@ -1394,7 +1394,7 @@ public static IDbDataParameter FindOrAddParameter(IDataParameterCollection param ...@@ -1394,7 +1394,7 @@ public static IDbDataParameter FindOrAddParameter(IDataParameterCollection param
/// Internal use only /// Internal use only
/// </summary> /// </summary>
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] [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) public static void PackListParameters(IDbCommand command, string namePrefix, object value)
{ {
// initially we tried TVP, however it performs quite poorly. // initially we tried TVP, however it performs quite poorly.
...@@ -2572,18 +2572,33 @@ protected void AddParameters(IDbCommand command, SqlMapper.Identity identity) ...@@ -2572,18 +2572,33 @@ protected void AddParameters(IDbCommand command, SqlMapper.Identity identity)
foreach (var param in parameters.Values) foreach (var param in parameters.Values)
{ {
var dbType = param.DbType;
var val = param.Value;
string name = Clean(param.Name); string name = Clean(param.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
}
else
{
bool add = !command.Parameters.Contains(name); bool add = !command.Parameters.Contains(name);
IDbDataParameter p; IDbDataParameter p;
if(add) if (add)
{ {
p = command.CreateParameter(); p = command.CreateParameter();
p.ParameterName = name; p.ParameterName = name;
} else }
else
{ {
p = (IDbDataParameter)command.Parameters[name]; p = (IDbDataParameter)command.Parameters[name];
} }
var val = param.Value;
p.Value = val ?? DBNull.Value; p.Value = val ?? DBNull.Value;
p.Direction = param.ParameterDirection; p.Direction = param.ParameterDirection;
var s = val as string; var s = val as string;
...@@ -2598,9 +2613,9 @@ protected void AddParameters(IDbCommand command, SqlMapper.Identity identity) ...@@ -2598,9 +2613,9 @@ protected void AddParameters(IDbCommand command, SqlMapper.Identity identity)
{ {
p.Size = param.Size.Value; p.Size = param.Size.Value;
} }
if (param.DbType != null) if (dbType != null)
{ {
p.DbType = param.DbType.Value; p.DbType = dbType.Value;
} }
if (add) if (add)
{ {
...@@ -2608,6 +2623,8 @@ protected void AddParameters(IDbCommand command, SqlMapper.Identity identity) ...@@ -2608,6 +2623,8 @@ protected void AddParameters(IDbCommand command, SqlMapper.Identity identity)
} }
param.AttachedParam = p; param.AttachedParam = p;
} }
}
} }
/// <summary> /// <summary>
......
...@@ -122,7 +122,12 @@ private static void RunTests() ...@@ -122,7 +122,12 @@ private static void RunTests()
{ {
method.Invoke(tester, null); method.Invoke(tester, null);
Console.WriteLine(" - OK!"); Console.WriteLine(" - OK!");
} catch (Exception ex) } catch(TargetInvocationException tie)
{
fail++;
Console.WriteLine(" - " + tie.InnerException.Message);
}catch (Exception ex)
{ {
fail++; fail++;
Console.WriteLine(" - " + ex.Message); Console.WriteLine(" - " + ex.Message);
......
...@@ -1598,6 +1598,34 @@ public void TestAppendingAList() ...@@ -1598,6 +1598,34 @@ public void TestAppendingAList()
result[2].IsEqualTo(3); 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() public void TestUniqueIdentifier()
{ {
var guid = Guid.NewGuid(); 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