From 4c97782cdf9f5f71ad6efebfc2f6f32a750b8f40 Mon Sep 17 00:00:00 2001 From: abe545 Date: Tue, 1 Dec 2015 00:37:31 -0500 Subject: [PATCH 1/6] Fixes #53 --- .../StoredProcedureParameters/InputOutputParameter.cs | 2 +- .../StoredProcedureParameters/InputParameter.cs | 2 +- .../StoredProcedureParameters/OutputParameter.cs | 2 +- .../StoredProcedureParameters/TableValuedParameter.cs | 2 +- .../StoredProcedureParameters/InputOutputParameterTests.cs | 6 ++++++ .../StoredProcedureParameters/InputParameterTests.cs | 6 ++++++ .../StoredProcedureParameters/OutputParameterTests.cs | 6 ++++++ .../StoredProcedureParameters/TableValuedParameterTests.cs | 7 +++++++ appveyor.yml | 6 +++--- 9 files changed, 32 insertions(+), 7 deletions(-) diff --git a/CodeOnlyStoredProcedure/StoredProcedureParameters/InputOutputParameter.cs b/CodeOnlyStoredProcedure/StoredProcedureParameters/InputOutputParameter.cs index 0d6d830..ae87ebb 100644 --- a/CodeOnlyStoredProcedure/StoredProcedureParameters/InputOutputParameter.cs +++ b/CodeOnlyStoredProcedure/StoredProcedureParameters/InputOutputParameter.cs @@ -53,7 +53,7 @@ public void TransferOutputValue(object value) public override string ToString() { - return string.Format("[InOut] @{0} = '{1}'", ParameterName, Value ?? "{null}"); + return string.Format("[InOut] @{0} = '{1}'", ParameterName.StartsWith("@") ? ParameterName.Substring(1) : ParameterName, Value ?? "{null}"); } } } diff --git a/CodeOnlyStoredProcedure/StoredProcedureParameters/InputParameter.cs b/CodeOnlyStoredProcedure/StoredProcedureParameters/InputParameter.cs index e2eef6f..41c031d 100644 --- a/CodeOnlyStoredProcedure/StoredProcedureParameters/InputParameter.cs +++ b/CodeOnlyStoredProcedure/StoredProcedureParameters/InputParameter.cs @@ -29,7 +29,7 @@ public IDbDataParameter CreateDbDataParameter(IDbCommand command) public override string ToString() { - return string.Format("@{0} = '{1}'", ParameterName, Value ?? "{null}"); + return string.Format("@{0} = '{1}'", ParameterName.StartsWith("@") ? ParameterName.Substring(1) : ParameterName, Value ?? "{null}"); } private DbType GetDbType() diff --git a/CodeOnlyStoredProcedure/StoredProcedureParameters/OutputParameter.cs b/CodeOnlyStoredProcedure/StoredProcedureParameters/OutputParameter.cs index 895f051..512dd61 100644 --- a/CodeOnlyStoredProcedure/StoredProcedureParameters/OutputParameter.cs +++ b/CodeOnlyStoredProcedure/StoredProcedureParameters/OutputParameter.cs @@ -48,7 +48,7 @@ public void TransferOutputValue(object value) public override string ToString() { - return string.Format("[Out] @{0}", ParameterName); + return string.Format("[Out] @{0}", ParameterName.StartsWith("@") ? ParameterName.Substring(1) : ParameterName); } } } diff --git a/CodeOnlyStoredProcedure/StoredProcedureParameters/TableValuedParameter.cs b/CodeOnlyStoredProcedure/StoredProcedureParameters/TableValuedParameter.cs index 12e89e3..051b3a3 100644 --- a/CodeOnlyStoredProcedure/StoredProcedureParameters/TableValuedParameter.cs +++ b/CodeOnlyStoredProcedure/StoredProcedureParameters/TableValuedParameter.cs @@ -49,7 +49,7 @@ public IDbDataParameter CreateDbDataParameter(IDbCommand command) public override string ToString() { - return string.Format("@{0} = IEnumerable<{1}> ({2} items)", ParameterName, valueType, GetValueCount()); + return string.Format("@{0} = IEnumerable<{1}> ({2} items)", ParameterName.StartsWith("@") ? ParameterName.Substring(1) : ParameterName, valueType, GetValueCount()); } private int GetValueCount() diff --git a/CodeOnlyTests/StoredProcedureParameters/InputOutputParameterTests.cs b/CodeOnlyTests/StoredProcedureParameters/InputOutputParameterTests.cs index fafd41b..e65013e 100644 --- a/CodeOnlyTests/StoredProcedureParameters/InputOutputParameterTests.cs +++ b/CodeOnlyTests/StoredProcedureParameters/InputOutputParameterTests.cs @@ -90,5 +90,11 @@ public void NullValueToStringReturnsCorrectString() { new InputOutputParameter("Foo", o => { }, null).ToString().Should().Be("[InOut] @Foo = '{null}'"); } + + [TestMethod] + public void ToStringDoesNotDisplayExtraAts() + { + new InputOutputParameter("@Foo", o => { }, "Bar").ToString().Should().Be("[InOut] @Foo = 'Bar'"); + } } } diff --git a/CodeOnlyTests/StoredProcedureParameters/InputParameterTests.cs b/CodeOnlyTests/StoredProcedureParameters/InputParameterTests.cs index ed62e80..6526991 100644 --- a/CodeOnlyTests/StoredProcedureParameters/InputParameterTests.cs +++ b/CodeOnlyTests/StoredProcedureParameters/InputParameterTests.cs @@ -76,5 +76,11 @@ public void NullValueToStringReturnsCorrectString() { new InputParameter("Foo", null).ToString().Should().Be("@Foo = '{null}'"); } + + [TestMethod] + public void ToStringDoesNotDisplayExtraAts() + { + new InputParameter("@Foo", "Bar").ToString().Should().Be("@Foo = 'Bar'"); + } } } diff --git a/CodeOnlyTests/StoredProcedureParameters/OutputParameterTests.cs b/CodeOnlyTests/StoredProcedureParameters/OutputParameterTests.cs index 28a7abf..7cd0660 100644 --- a/CodeOnlyTests/StoredProcedureParameters/OutputParameterTests.cs +++ b/CodeOnlyTests/StoredProcedureParameters/OutputParameterTests.cs @@ -44,5 +44,11 @@ public void ToStringRepresentsTheParameter() { new OutputParameter("Foo", o => { }).ToString().Should().Be("[Out] @Foo"); } + + [TestMethod] + public void ToStringDoesNotDisplayExtraAts() + { + new OutputParameter("@Foo", o => { }).ToString().Should().Be("[Out] @Foo"); + } } } diff --git a/CodeOnlyTests/StoredProcedureParameters/TableValuedParameterTests.cs b/CodeOnlyTests/StoredProcedureParameters/TableValuedParameterTests.cs index 8b545c5..272b143 100644 --- a/CodeOnlyTests/StoredProcedureParameters/TableValuedParameterTests.cs +++ b/CodeOnlyTests/StoredProcedureParameters/TableValuedParameterTests.cs @@ -83,6 +83,13 @@ public void ToStringRepresentsTheParameter() .Should().Be(string.Format("@Foo = IEnumerable<{0}> (1 items)", typeof(TVP))); } + [TestMethod] + public void ToStringDoesNotDisplayExtraAts() + { + new TableValuedParameter("@Foo", new[] { new TVP(42) }, typeof(TVP), "CustomInt", "Schema").ToString() + .Should().Be(string.Format("@Foo = IEnumerable<{0}> (1 items)", typeof(TVP))); + } + private class TVP { public int Int { get; set; } diff --git a/appveyor.yml b/appveyor.yml index fae2290..1d06b74 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 2.2.3.{build} +version: 2.2.4.{build} skip_tags: false branches: @@ -7,8 +7,8 @@ branches: - gh-pages environment: - releaseVersion: 2.2.3 - packageVersion: 2.2.3 + releaseVersion: 2.2.4 + packageVersion: 2.2.4-pre assembly_info: patch: true From 94ba1bf59c3cd1bce7eaa97245ac5b1998e70ca6 Mon Sep 17 00:00:00 2001 From: abe545 Date: Tue, 1 Dec 2015 22:50:00 -0500 Subject: [PATCH 2/6] Fixed #52 - nullable parameters passed via the fluent syntax do not pass the type of the parameter. --- ...StoredProcedureExtensions.WithParameter.cs | 2 +- ...dProcedureExtensionsTests.WithParameter.cs | 15 +++++ SmokeTests/DynamicSyntax.cs | 31 +++++++++ SmokeTests/FluentSyntax.cs | 61 ++++++++++++++++++ SmokeTests/Smoke.mdf | Bin 3211264 -> 3211264 bytes SmokeTests/Smoke_log.ldf | Bin 802816 -> 802816 bytes 6 files changed, 108 insertions(+), 1 deletion(-) diff --git a/CodeOnlyStoredProcedure/StoredProcedureExtensions.WithParameter.cs b/CodeOnlyStoredProcedure/StoredProcedureExtensions.WithParameter.cs index 0260a4f..78c934f 100644 --- a/CodeOnlyStoredProcedure/StoredProcedureExtensions.WithParameter.cs +++ b/CodeOnlyStoredProcedure/StoredProcedureExtensions.WithParameter.cs @@ -28,7 +28,7 @@ public static TSP WithParameter(this TSP sp, string name, TValue va Contract.Requires(!string.IsNullOrWhiteSpace(name)); Contract.Ensures(Contract.Result() != null); - return (TSP)sp.CloneWith(new InputParameter(name, value)); + return (TSP)sp.CloneWith(new InputParameter(name, value, typeof(TValue).InferDbType())); } /// diff --git a/CodeOnlyTests/StoredProcedureExtensionsTests.WithParameter.cs b/CodeOnlyTests/StoredProcedureExtensionsTests.WithParameter.cs index 0a9f947..70ab675 100644 --- a/CodeOnlyTests/StoredProcedureExtensionsTests.WithParameter.cs +++ b/CodeOnlyTests/StoredProcedureExtensionsTests.WithParameter.cs @@ -56,5 +56,20 @@ public void TestWithParameterClonesStoredProcedureWithResultType() var param = toTest.Parameters.Should().ContainSingle(p => p.ParameterName == "Foo", "because we added one Parameter").Which; param.Should().BeOfType().Which.Value.Should().Be("Bar", "because it was passed to WithInputParameter"); } + + [TestMethod] + public void TestWithParameter_InfersTheDbType() + { + var orig = new StoredProcedure("Test"); + + var toTest = orig.WithParameter("Foo", "Bar"); + + toTest.Should().NotBeSameAs(orig, "because StoredProcedures should be immutable"); + orig.Parameters.Should().BeEmpty("because StoredProcedures should be immutable"); + + var param = toTest.Parameters.Should().ContainSingle(p => p.ParameterName == "Foo", "because we added one Parameter").Which; + param.Should().BeOfType().Which.Value.Should().Be("Bar", "because it was passed to WithInputParameter"); + param.Should().BeOfType().Which.DbType.Should().Be(DbType.String, "because the DbType should be inferred if possible"); + } } } diff --git a/SmokeTests/DynamicSyntax.cs b/SmokeTests/DynamicSyntax.cs index c324363..07e63d0 100644 --- a/SmokeTests/DynamicSyntax.cs +++ b/SmokeTests/DynamicSyntax.cs @@ -393,6 +393,37 @@ Tuple SingleColumnSingleRowTimeSpanSync(IDbConnection db) return Tuple.Create(true, ""); } + + // THIS DOESN'T WORK... Not sure if it can ever be enabled. Maybe if null parameters aren't actually passed to the sproc? + //[SmokeTest("Dynamic Syntax Single Column Single Row with nullable parameter")] + Tuple SingleColumnSingleRowTimeSpanSyncWithNullableParameter(IDbConnection db) + { + var d1 = DateTime.Now.AddHours(-1); + DateTime? d2 = null; + TimeSpan result = db.Execute(Program.timeout).usp_TimeDifference(date1: d1, date2: d2); + + if (result < TimeSpan.FromHours(1)) + return Tuple.Create(false, string.Format("expected value at least {0}, but returned {1}", TimeSpan.FromHours(1), result)); + + return Tuple.Create(true, ""); + } + + [SmokeTest("Dynamic Syntax Single Column Single Row with nullable parameter via anonymous type")] + Tuple SingleColumnSingleRowTimeSpanSyncWithNullableParameterViaAnonymousType(IDbConnection db) + { + var d1 = DateTime.Now.AddHours(-1); + DateTime? d2 = null; + TimeSpan result = db.Execute(Program.timeout).usp_TimeDifference(new + { + date1 = d1, + date2 = d2 + }); + + if (result < TimeSpan.FromHours(1)) + return Tuple.Create(false, string.Format("expected value at least {0}, but returned {1}", TimeSpan.FromHours(1), result)); + + return Tuple.Create(true, ""); + } [SmokeTest("Dynamic Syntax Single Column Single Row (Await)")] async Task> SingleColumnSingleRowTimeSpanAsync(IDbConnection db) diff --git a/SmokeTests/FluentSyntax.cs b/SmokeTests/FluentSyntax.cs index 5c371c6..3542e3d 100644 --- a/SmokeTests/FluentSyntax.cs +++ b/SmokeTests/FluentSyntax.cs @@ -796,6 +796,67 @@ Task> SingleColumnSingleRowUntypedTimeSpanTask(IDbConnection return Tuple.Create(true, ""); }); } + + [SmokeTest("Fluent Syntax Single Column Single Row with nullable parameter (Task)")] + Task> SingleColumnSingleRowTimeSpanTaskWithNullableParameter(IDbConnection db) + { + var d1 = DateTime.Now.AddHours(-1); + DateTime? d2 = null; + + var results = StoredProcedure.Create("usp_TimeDifference") + .WithParameter("date1", d1) + .WithParameter("date2", d2) + .WithResults() + .ExecuteAsync(db, Program.timeout); + + + return results.ContinueWith(r => + { + var res = r.Result.Single(); + if ((res - System.TimeSpan.FromHours(1)).Duration() > TimeSpan.FromSeconds(1)) + return Tuple.Create(false, string.Format("expected {0}, but returned {1}", TimeSpan.FromHours(1), res)); + + return Tuple.Create(true, ""); + }); + } + + [SmokeTest("Fluent Syntax Single Column Single Row with nullable parameter (Await)")] + async Task> SingleColumnSingleRowTimeSpanASyncWithNullableParameter(IDbConnection db) + { + var d1 = DateTime.Now.AddHours(-1); + DateTime? d2 = null; + + var results = await StoredProcedure.Create("usp_TimeDifference") + .WithParameter("date1", d1) + .WithParameter("date2", d2) + .WithResults() + .ExecuteAsync(db, Program.timeout); + + var res = results.Single(); + if ((res - System.TimeSpan.FromHours(1)).Duration() > TimeSpan.FromSeconds(1)) + return Tuple.Create(false, string.Format("expected {0}, but returned {1}", TimeSpan.FromHours(1), res)); + + return Tuple.Create(true, ""); + } + + [SmokeTest("Fluent Syntax Single Column Single Row with nullable parameter (Await)")] + Tuple SingleColumnSingleRowTimeSpanSyncWithNullableParameter(IDbConnection db) + { + var d1 = DateTime.Now.AddHours(-1); + DateTime? d2 = null; + + var results = StoredProcedure.Create("usp_TimeDifference") + .WithParameter("date1", d1) + .WithParameter("date2", d2) + .WithResults() + .Execute(db, Program.timeout); + + var res = results.Single(); + if ((res - System.TimeSpan.FromHours(1)).Duration() > TimeSpan.FromSeconds(1)) + return Tuple.Create(false, string.Format("expected {0}, but returned {1}", TimeSpan.FromHours(1), res)); + + return Tuple.Create(true, ""); + } private class TimespanResult { diff --git a/SmokeTests/Smoke.mdf b/SmokeTests/Smoke.mdf index 7abeb0e3dd864b5fbeb9ea9424f8bd79fed57781..da8749c879fc5a85e71f4d69fa91b9e7cd5b6118 100644 GIT binary patch delta 2385 zcmbuAd2AF_7{KSvPG?@X*DSMlyJfnxbho#Jf`t}$Lra0wQfyJ9h}(;V(n6_Qt`J=a zX{BPNLj5oywi=HpiWQZK@hSw6h_XzUzJO z4uuYr5Yp#S?Wr8cl_CU*l&PDKf3nkm#QkoKdi17lF&kBUM2-K{=^x)<7Eq%SAH1m& z3NNYToUsLUG2AL{Nb2$@L*6D{NLh*^@)u`xM_E|TaTnoi3i0r}X_w#in#WCUjHi@_ zR*}-Pxc@SCsA>U~|Kc8VJEki|bof7AHuO{C#^6(b50%tqC1+05+yfFKh%oTJE-mvVEt)m$A{&n?0sHgX%dN-l_! z7L?R+6>v63Dbjuwggr!CZ}=}>`A|Mnk+qXV=p^kOqJTspqShfwyBzM_t^!PqEfAYG zKVm{I8t{XqZwx6}m(}%@rQ8x{sZ5j;PdhuD_d3nauN>PQC5~9fXZDa?TYrz# z*FU~mS>b`{-?yCG)7j{{1JukfBoL~h8Qr}!o-Bl}D~b(Ktzv*CU;dZ3QBw~k@7CsY3(y167>DUeje^U}cy{gDzMWlB$zK)~LNSNGDTY9$q**GrQz%v}#t1@hL3 z6uu4%erN8OO)I)D%%JW_eQUV>P8PL6U?fI>;POaDXENw75wnp@x^%3rRb|nW%J@35 zV-qRE@BLUCo)8~BZy?)XQ89gtA2dLqNz4Fw9!?CqKNy2>y_gm-9WIs?%1bb%L0D6Q zvJ(bqK7}&5K@{L<2~B2_Pz`T|KbX}C@Rzb=uPJ6dBvj19bwiWhD(Zybys&-qWyJ~m z#u~bF|7AshQ6{-L7B0Co5>D?_w|W+3EGxY+ay&|ap;DaDLHM~8CvdpkJD(!ah!KfF zVv#r`Uh~dRxTK{vTCW;IIKqiXH4fX6qk747C^x*B&@;LO?aiZYXfb(R|n}EVZIS+8&rLDtu58T6{}Z4 zfm2T98~$f_*qkU^@geYENOM4Lj2x?}F>+c0T(`@L_MlTPB6?NQ$8aZ|m?y+(`nP10 z{y7&*s^(6d4wmo4PRov4RjlE|*P2$` ztuz>gQS;~K_WeBy!u}S-ir5f4;y|28B9er-kYr@Cw!cSR+pFJDe$0tIk>8KKlN+v_ zDAwmQpqlZW^ra+4i!)o+lImC5+ZLoCZe$9QiliY^k#xj^c##Yw6UjodksKsfYg>@F G@xY%wer%Bd delta 3800 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 Jn}UxX{x1{_3#|YE diff --git a/SmokeTests/Smoke_log.ldf b/SmokeTests/Smoke_log.ldf index d7bce261a90b7be19b0623d1d9c8602281dfc254..41f655ec9c9abdbf765cf6f91bc8aaca4b64813f 100644 GIT binary patch delta 23998 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 From dfd8d34f9d8b4592688daff923a56e76f8105f38 Mon Sep 17 00:00:00 2001 From: abe545 Date: Tue, 1 Dec 2015 23:01:30 -0500 Subject: [PATCH 3/6] Updated nuget packages that were failing in CI the most. --- CodeOnlyTests-NET40/CodeOnlyTests-NET40.csproj | 12 ++++++------ CodeOnlyTests-NET40/packages.config | 4 ++-- CodeOnlyTests/CodeOnlyTests.csproj | 12 ++++++------ CodeOnlyTests/packages.config | 4 ++-- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/CodeOnlyTests-NET40/CodeOnlyTests-NET40.csproj b/CodeOnlyTests-NET40/CodeOnlyTests-NET40.csproj index f71b95d..9c1e37d 100644 --- a/CodeOnlyTests-NET40/CodeOnlyTests-NET40.csproj +++ b/CodeOnlyTests-NET40/CodeOnlyTests-NET40.csproj @@ -46,12 +46,12 @@ False ..\packages\EntityFramework.6.1.3\lib\net40\EntityFramework.SqlServer.dll - - ..\packages\FluentAssertions.3.5.0\lib\net40\FluentAssertions.dll + + ..\packages\FluentAssertions.4.1.0\lib\net40\FluentAssertions.dll True - - ..\packages\FluentAssertions.3.5.0\lib\net40\FluentAssertions.Core.dll + + ..\packages\FluentAssertions.4.1.0\lib\net40\FluentAssertions.Core.dll True @@ -64,8 +64,8 @@ ..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.Desktop.dll - - ..\packages\Moq.4.2.1507.0118\lib\net40\Moq.dll + + ..\packages\Moq.4.2.1510.2205\lib\net40\Moq.dll True diff --git a/CodeOnlyTests-NET40/packages.config b/CodeOnlyTests-NET40/packages.config index f9bf68f..774e39b 100644 --- a/CodeOnlyTests-NET40/packages.config +++ b/CodeOnlyTests-NET40/packages.config @@ -1,9 +1,9 @@  - + - + \ No newline at end of file diff --git a/CodeOnlyTests/CodeOnlyTests.csproj b/CodeOnlyTests/CodeOnlyTests.csproj index dff0c0c..aed11d5 100644 --- a/CodeOnlyTests/CodeOnlyTests.csproj +++ b/CodeOnlyTests/CodeOnlyTests.csproj @@ -37,17 +37,17 @@ 4 - - ..\packages\FluentAssertions.3.5.0\lib\net45\FluentAssertions.dll + + ..\packages\FluentAssertions.4.1.0\lib\net45\FluentAssertions.dll True - - ..\packages\FluentAssertions.3.5.0\lib\net45\FluentAssertions.Core.dll + + ..\packages\FluentAssertions.4.1.0\lib\net45\FluentAssertions.Core.dll True - - ..\packages\Moq.4.2.1507.0118\lib\net40\Moq.dll + + ..\packages\Moq.4.2.1510.2205\lib\net40\Moq.dll True diff --git a/CodeOnlyTests/packages.config b/CodeOnlyTests/packages.config index 531aa8f..fcdfcad 100644 --- a/CodeOnlyTests/packages.config +++ b/CodeOnlyTests/packages.config @@ -1,5 +1,5 @@  - - + + \ No newline at end of file From bea3c807075454aa681c91dec31a2a67577986d8 Mon Sep 17 00:00:00 2001 From: abe545 Date: Tue, 1 Dec 2015 23:06:18 -0500 Subject: [PATCH 4/6] Fixed erroneous bug that could cause SmokeTests to fail based oon timing. --- SmokeTests/DynamicSyntax.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SmokeTests/DynamicSyntax.cs b/SmokeTests/DynamicSyntax.cs index 07e63d0..1a1faa7 100644 --- a/SmokeTests/DynamicSyntax.cs +++ b/SmokeTests/DynamicSyntax.cs @@ -402,7 +402,7 @@ Tuple SingleColumnSingleRowTimeSpanSyncWithNullableParameter(IDbCo DateTime? d2 = null; TimeSpan result = db.Execute(Program.timeout).usp_TimeDifference(date1: d1, date2: d2); - if (result < TimeSpan.FromHours(1)) + if ((result - System.TimeSpan.FromHours(1)).Duration() > TimeSpan.FromSeconds(1)) return Tuple.Create(false, string.Format("expected value at least {0}, but returned {1}", TimeSpan.FromHours(1), result)); return Tuple.Create(true, ""); @@ -419,7 +419,7 @@ Tuple SingleColumnSingleRowTimeSpanSyncWithNullableParameterViaAno date2 = d2 }); - if (result < TimeSpan.FromHours(1)) + if ((result - System.TimeSpan.FromHours(1)).Duration() > TimeSpan.FromSeconds(1)) return Tuple.Create(false, string.Format("expected value at least {0}, but returned {1}", TimeSpan.FromHours(1), result)); return Tuple.Create(true, ""); From a02ea58f1e55a454af025a35b7a9853fede10cc6 Mon Sep 17 00:00:00 2001 From: abe545 Date: Tue, 1 Dec 2015 23:21:05 -0500 Subject: [PATCH 5/6] Switched to VS 2013 appveyor image for build. --- appveyor.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index 1d06b74..fddb42f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,9 @@ version: 2.2.4.{build} skip_tags: false +# Operating system (build VM template) +os: Visual Studio 2013 + branches: # blacklist gh-pages, since the documentation branch shouldn't be built except: From 4fe53c0088d4f8696f415ca7262b731db53310d6 Mon Sep 17 00:00:00 2001 From: abe545 Date: Tue, 1 Dec 2015 23:31:19 -0500 Subject: [PATCH 6/6] Added release notes --- CodeOnlyStoredProcedures.nuspec | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CodeOnlyStoredProcedures.nuspec b/CodeOnlyStoredProcedures.nuspec index efa55ad..90c585a 100644 --- a/CodeOnlyStoredProcedures.nuspec +++ b/CodeOnlyStoredProcedures.nuspec @@ -9,7 +9,11 @@ false A library for easily calling Stored Procedures in .NET. Works great with Entity Framework Code First models. Code Only Stored Procedures will not create any Stored Procedures on your database. Instead, its aim is to make it easy to call your existing stored procedures by writing simple code. - 2.2.3 + 2.2.4 +Fixed bug where calling ToString on a stored procedure could print parameters with a double @. +Fixed bug where the fluent syntax would not infer the type of its parameters from the compile time generic parameter type. + +2.2.3 Fixed bug where dynamic stored procedures wouldn't close their connections. 2.2.2 @@ -53,11 +57,7 @@ Added ability to specify an implementation of an interface, so a StoredProcedure Added better exception when a model is missing a public parameterless constructor. 1.2.0 -Added a much cleaner syntax for calling stored procedures, by using dynamic objects. - -1.1.0 -Improved exceptions so that it is easier to determine why the data returned doesn't map to your model correctly. -Now ignores read-only properties, so they don't have to be attributed with [NotMapped] +Added a much cleaner syntax for calling stored procedures, by using dynamic objects. StoredProcedure EntityFramework EF