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,41 +2572,58 @@ protected void AddParameters(IDbCommand command, SqlMapper.Identity identity) ...@@ -2572,41 +2572,58 @@ 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);
bool add = !command.Parameters.Contains(name);
IDbDataParameter p; if (dbType == null && val != null) dbType = SqlMapper.LookupDbType(val.GetType(), name);
if(add)
{ if (dbType == DbType.Xml)
p = command.CreateParameter(); { // actually represents "in" lists
p.ParameterName = name; #pragma warning disable 612, 618
} else SqlMapper.PackListParameters(command, name, val);
{ #pragma warning restore 612, 618
p = (IDbDataParameter)command.Parameters[name];
} }
var val = param.Value; else
p.Value = val ?? DBNull.Value;
p.Direction = param.ParameterDirection;
var s = val as string;
if (s != null)
{ {
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() ...@@ -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