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 ...@@ -1236,13 +1236,20 @@ public static T ExecuteScalar<T>(this IDbConnection cnn, CommandDefinition comma
return ExecuteScalarImpl<T>(cnn, ref command); 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) private static int ExecuteImpl(this IDbConnection cnn, ref CommandDefinition command)
{ {
object param = command.Parameters; object param = command.Parameters;
IEnumerable multiExec = param as IEnumerable; IEnumerable multiExec = GetMultiExec(param);
Identity identity; Identity identity;
CacheInfo info = null; CacheInfo info = null;
if (multiExec != null && !(multiExec is string)) if (multiExec != null)
{ {
#if ASYNC #if ASYNC
if((command.Flags & CommandFlags.Pipelined) != 0) if((command.Flags & CommandFlags.Pipelined) != 0)
...@@ -2845,11 +2852,12 @@ public static string Format(object value) ...@@ -2845,11 +2852,12 @@ public static string Format(object value)
case TypeCode.Decimal: case TypeCode.Decimal:
return ((decimal)value).ToString(CultureInfo.InvariantCulture); return ((decimal)value).ToString(CultureInfo.InvariantCulture);
default: default:
if(value is IEnumerable && !(value is string)) var multiExec = GetMultiExec(value);
if(multiExec != null)
{ {
var sb = new StringBuilder(); var sb = new StringBuilder();
bool first = true; bool first = true;
foreach (object subval in (IEnumerable)value) foreach (object subval in multiExec)
{ {
sb.Append(first ? '(' : ',').Append(Format(subval)); sb.Append(first ? '(' : ',').Append(Format(subval));
first = false; first = false;
...@@ -3331,10 +3339,10 @@ private static IDataReader ExecuteReaderImpl(IDbConnection cnn, ref CommandDefin ...@@ -3331,10 +3339,10 @@ private static IDataReader ExecuteReaderImpl(IDbConnection cnn, ref CommandDefin
private static Action<IDbCommand, object> GetParameterReader(IDbConnection cnn, ref CommandDefinition command) private static Action<IDbCommand, object> GetParameterReader(IDbConnection cnn, ref CommandDefinition command)
{ {
object param = command.Parameters; object param = command.Parameters;
IEnumerable multiExec = (object)param as IEnumerable; IEnumerable multiExec = GetMultiExec(param);
Identity identity; Identity identity;
CacheInfo info = null; CacheInfo info = null;
if (multiExec != null && !(multiExec is string)) if (multiExec != null)
{ {
throw new NotSupportedException("MultiExec is not supported by ExecuteReader"); throw new NotSupportedException("MultiExec is not supported by ExecuteReader");
} }
......
...@@ -132,8 +132,8 @@ public static Task<int> ExecuteAsync(this IDbConnection cnn, string sql, dynamic ...@@ -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) public static Task<int> ExecuteAsync(this IDbConnection cnn, CommandDefinition command)
{ {
object param = command.Parameters; object param = command.Parameters;
IEnumerable multiExec = param as IEnumerable; IEnumerable multiExec = GetMultiExec(param);
if (multiExec != null && !(param is string)) if (multiExec != null)
{ {
return ExecuteMultiImplAsync(cnn, command, multiExec); return ExecuteMultiImplAsync(cnn, command, multiExec);
} }
......
...@@ -4018,6 +4018,29 @@ public class Dyno ...@@ -4018,6 +4018,29 @@ public class Dyno
public object Foo { get;set; } 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 #if POSTGRESQL
class Cat 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