Commit 7336bfb5 authored by Marc Gravell's avatar Marc Gravell

fix Issue151: ExpandoObject should work with Execute

parent 5917143e
......@@ -1236,13 +1236,20 @@ public static T ExecuteScalar<T>(this IDbConnection cnn, CommandDefinition comma
return ExecuteScalarImpl<T>(cnn, ref command);
}
private static IEnumerable GetMultiExec(object param)
{
return (param is IEnumerable
&& !(param is string || param is IEnumerable<KeyValuePair<string, object>>
)) ? (IEnumerable)param : null;
}
private static int ExecuteImpl(this IDbConnection cnn, ref CommandDefinition command)
{
object param = command.Parameters;
IEnumerable multiExec = param as IEnumerable;
IEnumerable multiExec = GetMultiExec(param);
Identity identity;
CacheInfo info = null;
if (multiExec != null && !(multiExec is string))
if (multiExec != null)
{
#if ASYNC
if((command.Flags & CommandFlags.Pipelined) != 0)
......@@ -2845,11 +2852,12 @@ public static string Format(object value)
case TypeCode.Decimal:
return ((decimal)value).ToString(CultureInfo.InvariantCulture);
default:
if(value is IEnumerable && !(value is string))
var multiExec = GetMultiExec(value);
if(multiExec != null)
{
var sb = new StringBuilder();
bool first = true;
foreach (object subval in (IEnumerable)value)
foreach (object subval in multiExec)
{
sb.Append(first ? '(' : ',').Append(Format(subval));
first = false;
......@@ -3331,10 +3339,10 @@ private static IDataReader ExecuteReaderImpl(IDbConnection cnn, ref CommandDefin
private static Action<IDbCommand, object> GetParameterReader(IDbConnection cnn, ref CommandDefinition command)
{
object param = command.Parameters;
IEnumerable multiExec = (object)param as IEnumerable;
IEnumerable multiExec = GetMultiExec(param);
Identity identity;
CacheInfo info = null;
if (multiExec != null && !(multiExec is string))
if (multiExec != null)
{
throw new NotSupportedException("MultiExec is not supported by ExecuteReader");
}
......
......@@ -132,8 +132,8 @@ public static Task<int> ExecuteAsync(this IDbConnection cnn, string sql, dynamic
public static Task<int> ExecuteAsync(this IDbConnection cnn, CommandDefinition command)
{
object param = command.Parameters;
IEnumerable multiExec = param as IEnumerable;
if (multiExec != null && !(param is string))
IEnumerable multiExec = GetMultiExec(param);
if (multiExec != null)
{
return ExecuteMultiImplAsync(cnn, command, multiExec);
}
......
......@@ -4018,6 +4018,29 @@ public class Dyno
public object Foo { get;set; }
}
public void Issue151_ExpandoObjectArgsQuery()
{
dynamic args = new ExpandoObject();
args.Id = 123;
args.Name = "abc";
var row = connection.Query("select @Id as [Id], @Name as [Name]", (object)args).Single();
((int)row.Id).Equals(123);
((string)row.Name).Equals("abc");
}
public void Issue151_ExpandoObjectArgsExec()
{
dynamic args = new ExpandoObject();
args.Id = 123;
args.Name = "abc";
connection.Execute("create table #issue151 (Id int not null, Name nvarchar(20) not null)");
connection.Execute("insert #issue151 values(@Id, @Name)", (object)args).IsEqualTo(1);
var row = connection.Query("select Id, Name from #issue151").Single();
((int)row.Id).Equals(123);
((string)row.Name).Equals("abc");
}
#if POSTGRESQL
class Cat
......
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