Commit a46d3395 authored by Marc Gravell's avatar Marc Gravell

Add ApplyNullValues setting / implementation - makes it assign (rather than...

Add ApplyNullValues setting / implementation - makes it assign (rather than ignore) null values when possible; also nameof *all the things*; well... most of them
parent b51f8f0d
using Xunit;
using System.Linq;
namespace Dapper.Tests
{
public partial class TestSuite
{
[Fact]
public void TestNullableDefault()
{
TestNullable(false);
}
[Fact]
public void TestNullableApplyNulls()
{
TestNullable(true);
}
private void TestNullable(bool applyNulls)
{
bool oldSetting = SqlMapper.Settings.ApplyNullValues;
try
{
SqlMapper.Settings.ApplyNullValues = applyNulls;
SqlMapper.PurgeQueryCache();
var data = connection.Query<NullTestClass>(@"
declare @data table(Id int not null, A int null, B int null, C varchar(20), D int null, E int null)
insert @data (Id, A, B, C, D, E) values
(1,null,null,null,null,null),
(2,42,42,'abc',2,2)
select * from @data").ToDictionary(_ => _.Id);
var obj = data[2];
obj.Id.IsEqualTo(2);
obj.A.IsEqualTo(42);
obj.B.IsEqualTo(42);
obj.C.IsEqualTo("abc");
obj.D.IsEqualTo(AnEnum.A);
obj.E.IsEqualTo(AnEnum.A);
obj = data[1];
obj.Id.IsEqualTo(1);
if (applyNulls)
{
obj.A.IsEqualTo(2); // cannot be null
obj.B.IsEqualTo(null);
obj.C.IsEqualTo(null);
obj.D.IsEqualTo(AnEnum.B);
obj.E.IsEqualTo(null);
}
else
{
obj.A.IsEqualTo(2);
obj.B.IsEqualTo(2);
obj.C.IsEqualTo("def");
obj.D.IsEqualTo(AnEnum.B);
obj.E.IsEqualTo(AnEnum.B);
}
} finally
{
SqlMapper.Settings.ApplyNullValues = oldSetting;
}
}
class NullTestClass
{
public int Id { get; set; }
public int A { get; set; }
public int? B { get; set; }
public string C { get; set; }
public AnEnum D { get; set; }
public AnEnum? E { get; set; }
public NullTestClass()
{
A = 2;
B = 2;
C = "def";
D = AnEnum.B;
E = AnEnum.B;
}
}
}
}
......@@ -23,7 +23,7 @@ public SqlDataRecordListTVPParameter(IEnumerable<Microsoft.SqlServer.Server.SqlD
static readonly Action<System.Data.SqlClient.SqlParameter, string> setTypeName;
static SqlDataRecordListTVPParameter()
{
var prop = typeof(System.Data.SqlClient.SqlParameter).GetProperty("TypeName", BindingFlags.Instance | BindingFlags.Public);
var prop = typeof(System.Data.SqlClient.SqlParameter).GetProperty(nameof(System.Data.SqlClient.SqlParameter.TypeName), BindingFlags.Instance | BindingFlags.Public);
if (prop != null && prop.PropertyType == typeof(string) && prop.CanWrite)
{
setTypeName = (Action<System.Data.SqlClient.SqlParameter, string>)
......
......@@ -18,12 +18,18 @@ static Settings()
public static void SetDefaults()
{
CommandTimeout = null;
ApplyNullValues = false;
}
/// <summary>
/// Specifies the default Command Timeout for all Queries
/// </summary>
public static int? CommandTimeout { get; set; }
/// <summary>
/// Indicates whether nulls in data are silently ignored (default) vs actively applied and assigned to members
/// </summary>
public static bool ApplyNullValues { get; set; }
}
}
}
This diff is collapsed.
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