Commit f333c2f0 authored by mgravell's avatar mgravell

allow Add to *replace* an existing template parameter in DynamicParameters,...

allow Add to *replace* an existing template parameter in DynamicParameters, allowing for out/return/etc usage
parent 7eb0c481
...@@ -2049,9 +2049,18 @@ void SqlMapper.IDynamicParameters.AddParameters(IDbCommand command, SqlMapper.Id ...@@ -2049,9 +2049,18 @@ void SqlMapper.IDynamicParameters.AddParameters(IDbCommand command, SqlMapper.Id
foreach (var param in parameters.Values) foreach (var param in parameters.Values)
{ {
var p = command.CreateParameter(); string name = Clean(param.Name);
bool add = !command.Parameters.Contains(name);
IDbDataParameter p;
if(add)
{
p = command.CreateParameter();
p.ParameterName = name;
} else
{
p = (IDbDataParameter)command.Parameters[name];
}
var val = param.Value; var val = param.Value;
p.ParameterName = Clean(param.Name);
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;
...@@ -2070,7 +2079,10 @@ void SqlMapper.IDynamicParameters.AddParameters(IDbCommand command, SqlMapper.Id ...@@ -2070,7 +2079,10 @@ void SqlMapper.IDynamicParameters.AddParameters(IDbCommand command, SqlMapper.Id
{ {
p.DbType = param.DbType.Value; p.DbType = param.DbType.Value;
} }
if (add)
{
command.Parameters.Add(p); command.Parameters.Add(p);
}
param.AttachedParam = p; param.AttachedParam = p;
} }
} }
......
...@@ -1205,6 +1205,51 @@ public void TestFailInASaneWayWithWrongStructColumnTypes() ...@@ -1205,6 +1205,51 @@ public void TestFailInASaneWayWithWrongStructColumnTypes()
ex.Message.IsEqualTo("Error parsing column 0 (Value=1 - Int64)"); ex.Message.IsEqualTo("Error parsing column 0 (Value=1 - Int64)");
} }
} }
public void TestProcWithOutParameter()
{
connection.Execute(
@"CREATE PROCEDURE #TestProcWithOutParameter
@ID int output,
@Foo varchar(100),
@Bar int
AS
SET @ID = @Bar + LEN(@Foo)");
var obj = new
{
ID = 0,
Foo = "abc",
Bar = 4
};
var args = new DynamicParameters(obj);
args.Add("ID", 0, direction: ParameterDirection.Output);
connection.Execute("#TestProcWithOutParameter", args, commandType: CommandType.StoredProcedure);
args.Get<int>("ID").IsEqualTo(7);
}
public void TestProcWithOutAndReturnParameter()
{
connection.Execute(
@"CREATE PROCEDURE #TestProcWithOutAndReturnParameter
@ID int output,
@Foo varchar(100),
@Bar int
AS
SET @ID = @Bar + LEN(@Foo)
RETURN 42");
var obj = new
{
ID = 0,
Foo = "abc",
Bar = 4
};
var args = new DynamicParameters(obj);
args.Add("ID", 0, direction: ParameterDirection.Output);
args.Add("result", 0, direction: ParameterDirection.ReturnValue);
connection.Execute("#TestProcWithOutAndReturnParameter", args, commandType: CommandType.StoredProcedure);
args.Get<int>("ID").IsEqualTo(7);
args.Get<int>("result").IsEqualTo(42);
}
struct CanHazInt struct CanHazInt
{ {
public int Value { get; set; } public int Value { get; set; }
......
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