Added suport for DynamicColumn in DynamicProcedureInvoker

This commit is contained in:
grzegorz.russek
2022-02-22 07:52:06 +00:00
parent 54b4f2de22
commit f01ba13ad9
8 changed files with 146 additions and 143 deletions

View File

@@ -28,6 +28,7 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
namespace DynamORM
@@ -88,6 +89,7 @@ namespace DynamORM
/// <summary>Initializes a new instance of the <see cref="DynamicColumn" /> class.</summary>
public DynamicColumn()
{
ParameterDirection = ParameterDirection.Input;
}
/// <summary>Initializes a new instance of the <see cref="DynamicColumn" /> class.</summary>
@@ -129,6 +131,9 @@ namespace DynamORM
/// <summary>Gets or sets order direction.</summary>
public SortOrder Order { get; set; }
/// <summary>Gets or sets parameter direction when used in procedure invocation.</summary>
public ParameterDirection ParameterDirection { get; set; }
/// <summary>Gets or sets value for parameters.</summary>
public object Value { get; set; }

View File

@@ -1014,7 +1014,7 @@ namespace DynamORM
public static List<dynamic> ToList(this IDataReader r)
{
List<dynamic> result = new List<dynamic>();
while (r.Read())
result.Add(r.RowToDynamic());

View File

@@ -115,6 +115,35 @@ namespace DynamORM
cmd.AddParameters(_db, (DynamicExpando)arg);
else if (arg is ExpandoObject)
cmd.AddParameters(_db, (ExpandoObject)arg);
else if (arg is DynamicColumn)
{
var dcv = (DynamicColumn)arg;
string paramName = dcv.Alias ?? dcv.ColumnName ??
(dcv.Schema.HasValue ? dcv.Schema.Value.Name : null) ??
(info.ArgumentNames.Count > i ? info.ArgumentNames[i] : i.ToString());
bool isOut = dcv.ParameterDirection == ParameterDirection.Output ||
dcv.ParameterDirection == ParameterDirection.ReturnValue;
if (isOut || dcv.ParameterDirection == ParameterDirection.InputOutput)
{
if (retParams == null)
retParams = new Dictionary<string, int>();
retParams.Add(paramName, cmd.Parameters.Count);
}
if (dcv.Schema != null) {
var ds = dcv.Schema.Value;
cmd.AddParameter(
_db.GetParameterName(paramName), dcv.ParameterDirection,
ds.Type, ds.Size, ds.Precision, ds.Scale,
isOut ? DBNull.Value : arg);
} else
cmd.AddParameter(
_db.GetParameterName(paramName), dcv.ParameterDirection,
arg == null ? DbType.String : arg.GetType().ToDbType(), 0, isOut ? DBNull.Value : arg);
}
else
{
if (info.ArgumentNames.Count > i && !string.IsNullOrEmpty(info.ArgumentNames[i]))
@@ -217,7 +246,7 @@ namespace DynamORM
using (IDataReader rdr = cmd.ExecuteReader())
if (rdr.Read())
mainResult = (rdr.ToDynamic() as object).Map(types[0]);
mainResult = (rdr.RowToDynamic() as object).Map(types[0]);
else
mainResult = null;
}