From 5e29dfc5a005a44e6d75a8569c029a8c335ea98c Mon Sep 17 00:00:00 2001 From: Konstantin Koryakov Date: Fri, 2 Mar 2018 10:29:08 +0300 Subject: [PATCH 1/6] Fix: when passing null value to the AddParameter method Stored Procedure parameter not passed to Stored procedure. --- StoredProcedureEFCore/StoredProcBuilder.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/StoredProcedureEFCore/StoredProcBuilder.cs b/StoredProcedureEFCore/StoredProcBuilder.cs index c44273f..279839e 100644 --- a/StoredProcedureEFCore/StoredProcBuilder.cs +++ b/StoredProcedureEFCore/StoredProcBuilder.cs @@ -156,7 +156,15 @@ private DbParameter AddParamInner(string name, T val, ParameterDirection dire DbParameter param = _cmd.CreateParameter(); param.ParameterName = name; - param.Value = val; + if (val == null) + { + param.Value = DBNull.Value; + } + else + { + param.Value = val; + } + param.Direction = direction; param.DbType = DbTypeConverter.ConvertToDbType(); From 666e9515ae5e0afe0192e262a8460e625349c3e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire?= Date: Fri, 2 Mar 2018 14:09:24 +0100 Subject: [PATCH 2/6] Add SqlServer test for nullable parameter (#9) --- .../dbo/Stored Procedures/SelectParam.sql | 6 ++++++ StoredProcedureEFCore.Tests.SqlServer/Program.cs | 5 +++++ 2 files changed, 11 insertions(+) create mode 100644 StoredProcedureEFCore.Tests.SqlServer.Database/dbo/Stored Procedures/SelectParam.sql diff --git a/StoredProcedureEFCore.Tests.SqlServer.Database/dbo/Stored Procedures/SelectParam.sql b/StoredProcedureEFCore.Tests.SqlServer.Database/dbo/Stored Procedures/SelectParam.sql new file mode 100644 index 0000000..dd3aa4f --- /dev/null +++ b/StoredProcedureEFCore.Tests.SqlServer.Database/dbo/Stored Procedures/SelectParam.sql @@ -0,0 +1,6 @@ +CREATE PROCEDURE [dbo].[SelectParam] + @n INT +AS +BEGIN + SELECT @n; +END \ No newline at end of file diff --git a/StoredProcedureEFCore.Tests.SqlServer/Program.cs b/StoredProcedureEFCore.Tests.SqlServer/Program.cs index 205aa8f..e1f3e02 100644 --- a/StoredProcedureEFCore.Tests.SqlServer/Program.cs +++ b/StoredProcedureEFCore.Tests.SqlServer/Program.cs @@ -49,6 +49,11 @@ await ctx.LoadStoredProc("dbo.ListAll") // Limit is omitted, it takes default value specified in the stored procedure ctx.LoadStoredProc("dbo.ListAll") .Exec(r => rows = r.ToList()); + + // EXEC dbo.SelectParam @n = NULL + await ctx.LoadStoredProc("dbo.SelectParam") + .AddParam("n", null) + .ExecScalarAsync(i => Console.WriteLine(i)); } } } From 8331e58f1386a034644baf09b531aee45c60a96a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire?= Date: Fri, 2 Mar 2018 14:11:34 +0100 Subject: [PATCH 3/6] Fix ExecScalar when the scalar value is DBNull --- StoredProcedureEFCore/StoredProcBuilder.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/StoredProcedureEFCore/StoredProcBuilder.cs b/StoredProcedureEFCore/StoredProcBuilder.cs index c44273f..3921608 100644 --- a/StoredProcedureEFCore/StoredProcBuilder.cs +++ b/StoredProcedureEFCore/StoredProcBuilder.cs @@ -115,7 +115,8 @@ public void ExecScalar(out T val) try { OpenConnection(); - val = (T)_cmd.ExecuteScalar(); + object scalar = _cmd.ExecuteScalar(); + val = DefaultIfDBNull(scalar); } finally { @@ -128,7 +129,8 @@ public async Task ExecScalarAsync(Action action) try { await OpenConnectionAsync(); - T val = (T)await _cmd.ExecuteScalarAsync(); + object scalar = await _cmd.ExecuteScalarAsync(); + T val = DefaultIfDBNull(scalar); action(val); } finally @@ -173,5 +175,10 @@ private Task OpenConnectionAsync() { return _cmd.Connection.OpenAsync(); } + + private T DefaultIfDBNull(object o) + { + return o == DBNull.Value ? default(T) : (T)o; + } } } From 0e9e0033dd9968d8ce0c500327947be9dab714d4 Mon Sep 17 00:00:00 2001 From: Konstantin Koryakov Date: Fri, 2 Mar 2018 16:22:28 +0300 Subject: [PATCH 4/6] Replace null check with ?? operator, to reduce amount of code, for the Fix: error when passing null value to the AddParameter method. --- StoredProcedureEFCore/StoredProcBuilder.cs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/StoredProcedureEFCore/StoredProcBuilder.cs b/StoredProcedureEFCore/StoredProcBuilder.cs index 279839e..7f2e162 100644 --- a/StoredProcedureEFCore/StoredProcBuilder.cs +++ b/StoredProcedureEFCore/StoredProcBuilder.cs @@ -156,15 +156,7 @@ private DbParameter AddParamInner(string name, T val, ParameterDirection dire DbParameter param = _cmd.CreateParameter(); param.ParameterName = name; - if (val == null) - { - param.Value = DBNull.Value; - } - else - { - param.Value = val; - } - + param.Value = (object)val ?? DBNull.Value; param.Direction = direction; param.DbType = DbTypeConverter.ConvertToDbType(); From 501022566172f1937415ead72438864c4196b93d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire?= Date: Fri, 2 Mar 2018 14:44:13 +0100 Subject: [PATCH 5/6] Add SelectParam stored procedure to project --- .../StoredProcedureEFCore.Tests.SqlServer.Database.sqlproj | 1 + 1 file changed, 1 insertion(+) diff --git a/StoredProcedureEFCore.Tests.SqlServer.Database/StoredProcedureEFCore.Tests.SqlServer.Database.sqlproj b/StoredProcedureEFCore.Tests.SqlServer.Database/StoredProcedureEFCore.Tests.SqlServer.Database.sqlproj index 9ad2dfc..553ddfc 100644 --- a/StoredProcedureEFCore.Tests.SqlServer.Database/StoredProcedureEFCore.Tests.SqlServer.Database.sqlproj +++ b/StoredProcedureEFCore.Tests.SqlServer.Database/StoredProcedureEFCore.Tests.SqlServer.Database.sqlproj @@ -69,6 +69,7 @@ + From 71cce57747a8b5189b726eeb747e877a4767d51a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire?= Date: Fri, 2 Mar 2018 14:45:30 +0100 Subject: [PATCH 6/6] StoredProcedureEFCore 0.3.4 --- StoredProcedureEFCore/StoredProcedureEFCore.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StoredProcedureEFCore/StoredProcedureEFCore.csproj b/StoredProcedureEFCore/StoredProcedureEFCore.csproj index c4e1fa6..cbd9f82 100644 --- a/StoredProcedureEFCore/StoredProcedureEFCore.csproj +++ b/StoredProcedureEFCore/StoredProcedureEFCore.csproj @@ -2,7 +2,7 @@ netstandard1.3 StoredProcedureEFCore - 0.3.3 + 0.3.4 Grégoire Verdier Entity Framework Core extension to execute a stored procedure and map the result https://github.com/verdie-g/StoredProcedureEFCore