From 5060171fb12e7bc68b0435c1f84699e36ce083ad Mon Sep 17 00:00:00 2001 From: opejanovic Date: Thu, 7 May 2020 15:41:07 +0200 Subject: [PATCH] I modyfied method Get to be able to read parameters before execution. This is really handy for logging parameters before execution. --- src/Dapper.Oracle/OracleDynamicParameters.cs | 13 ++++++++++++- .../OracleDynamicParameterTests.cs | 8 ++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/Dapper.Oracle/OracleDynamicParameters.cs b/src/Dapper.Oracle/OracleDynamicParameters.cs index 67dea0b..f113246 100644 --- a/src/Dapper.Oracle/OracleDynamicParameters.cs +++ b/src/Dapper.Oracle/OracleDynamicParameters.cs @@ -157,7 +157,18 @@ public IEnumerable ParameterNames /// The value, note DBNull.Value is not returned, instead the value is returned as null public T Get(string name) { - var val = Parameters[Clean(name)].AttachedParam.Value; + var paramInfo = Parameters[Clean(name)]; + var attachedParam = paramInfo.AttachedParam; + object val = attachedParam == null ? paramInfo.Value : attachedParam.Value; + if (val == DBNull.Value) + { + if (default(T) != null) + { + throw new ApplicationException("Attempting to cast a DBNull to a non nullable type! Note that out/return parameters will not have updated values until the data stream completes (after the 'foreach' for Query(..., buffered: false), or after the GridReader has been disposed for QueryMultiple)"); + } + return default(T); + } + return OracleValueConverter.Convert(val); } diff --git a/src/Tests.Dapper.Oracle/OracleDynamicParameterTests.cs b/src/Tests.Dapper.Oracle/OracleDynamicParameterTests.cs index 75cc54d..7fde200 100644 --- a/src/Tests.Dapper.Oracle/OracleDynamicParameterTests.cs +++ b/src/Tests.Dapper.Oracle/OracleDynamicParameterTests.cs @@ -152,5 +152,13 @@ public void GetParameter_DoesNotReturnNull(IDbCommand cmd) param.Value.Should().Be("Bar"); param.ArrayBindSize.Should().BeSameAs(bindSizeArray); } + + [Fact] + public void GetParameterValue() + { + testObject.Add("Foo", "Bar", OracleMappingType.Varchar2); + + testObject.Get("Foo").Should().Be("Bar"); + } } }