Skip to content

Commit 4787180

Browse files
Merge pull request #400 from smoothdeveloper/optional-parameters-cmeeren
Optional parameters cmeeren
2 parents c96a2e2 + b5d077f commit 4787180

File tree

8 files changed

+14
-19
lines changed

8 files changed

+14
-19
lines changed

docs/content/configuration and Input.fsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ type AdventureWorks2012 = SqlProgrammabilityProvider<connStr>
328328
329329
By default all input parameters of `AsyncExecute/Execute` generated by `SqlCommandProvider<...>` are mandatory.
330330
But there are rare cases when you prefer to handle NULL input values inside T-SQL script.
331-
`AllParametersOptional` set to true makes all parameters (guess what) optional.
331+
`AllParametersOptional` set to true makes all parameters `Option`-wrapped.
332332
*)
333333

334334
type IncrBy = SqlCommandProvider<"SELECT @x + ISNULL(CAST(@y AS INT), 1) ",

docs/content/faq.fsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ echoOnly.Execute( x = (* must pass int value here *) 1)
3333
There is no way to pass NULL as value for parameter `@x` although the query knows how to handle it.
3434
3535
To resolve the issue specify `AllParametersOptional = true` as static parameter to type provider.
36-
It makes all parameters of type `option<_>` with default value `None`.
36+
It makes all parameters of type `option<_>`.
3737
3838
<div class="well well-small" style="margin:0px 70px 0px 20px;">
3939
@@ -53,10 +53,7 @@ let echoOr42 =
5353
// Pass parameter value. Specifying Some constructor is mandatrory.
5454
echoOr42.Execute( Some 1)
5555

56-
// Pass NULL by omitting parameter
57-
echoOr42.Execute()
58-
59-
//Pass NULL explicitly
56+
// Pass NULL
6057
echoOr42.Execute( x = None)
6158

6259
(**

docs/content/index.fsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ SqlCommandProvider and SqlProgrammabilityProvider features at glance
125125
* "ResolutionFolder" parameter - a folder to be used to resolve relative file paths at compile time. Applied to command text *.sql files only.
126126
* Input:
127127
* Unbound sql variables/input parameters mapped to mandatory typed arguments for `AsyncExecute/Execute`
128-
* Set `AllParametersOptional` to true to make all parameters optional (nullable) (`SqlCommandProvider<...>` only)
128+
* Set `AllParametersOptional` to true to make all parameters option-wrapped (`SqlCommandProvider<...>` only)
129129
* Stored Procedures and User-Defined Functions can be easily discovered with `SqlProgrammabilityProvider<...>`
130130
* `SqlProgrammabilityProvider<...>` infers default values for input parameters
131131
* Output:

src/SqlClient.DesignTime/DesignTime.fs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,10 @@ type DesignTime private() =
588588
if p.Optional
589589
then
590590
assert(p.Direction = ParameterDirection.Input)
591-
ProvidedParameter(parameterName, parameterType = typedefof<_ option>.MakeGenericType(p.TypeInfo.ClrType) , optionalValue = null)
591+
if p.DefaultValue.IsNone then
592+
ProvidedParameter(parameterName, parameterType = typedefof<_ option>.MakeGenericType(p.TypeInfo.ClrType))
593+
else
594+
ProvidedParameter(parameterName, parameterType = typedefof<_ option>.MakeGenericType(p.TypeInfo.ClrType), optionalValue = null)
592595
else
593596
if p.Direction.HasFlag(ParameterDirection.Output)
594597
then

src/SqlClient.DesignTime/SqlCommandProvider.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ type SqlCommandProvider(config : TypeProviderConfig) as this =
7070
<param name='ResultType'>A value that defines structure of result: Records, Tuples, DataTable, or SqlDataReader.</param>
7171
<param name='SingleRow'>If set the query is expected to return a single row of the result set. See MSDN documentation for details on CommandBehavior.SingleRow.</param>
7272
<param name='ConfigFile'>The name of the configuration file that’s used for connection strings at DESIGN-TIME. The default value is app.config or web.config.</param>
73-
<param name='AllParametersOptional'>If set all parameters become optional. NULL input values must be handled inside T-SQL.</param>
73+
<param name='AllParametersOptional'>If set all parameters become Option-wrapped. NULL input values must be handled inside T-SQL.</param>
7474
<param name='ResolutionFolder'>A folder to be used to resolve relative file paths to *.sql script files at compile time. The default value is the folder that contains the project or script.</param>
7575
<param name='DataDirectory'>The name of the data directory that replaces |DataDirectory| in connection strings. The default value is the project or script directory.</param>
7676
<param name='TempTableDefinitions'>Temp tables create command.</param>

tests/SqlClient.Tests/CreateCommand.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ let udttAndTuplesOutput() =
4545
let optionalParams() =
4646
use cmd = DB.CreateCommand<"SELECT CAST(@x AS INT) + ISNULL(CAST(@y AS INT), 1)", SingleRow = true, AllParametersOptional = true>()
4747
Assert.Equal( Some( Some 14), cmd.Execute(Some 3, Some 11))
48-
Assert.Equal( Some( Some 12), cmd.Execute(x = Some 11))
48+
Assert.Equal( Some( Some 12), cmd.Execute(x = Some 11, y = None))
4949

5050
[<Literal>]
5151
let evenNumbers = "select value, svalue = cast(value as char(1)) from (values (2), (4), (6), (8)) as T(value)"

tests/SqlClient.Tests/OptionalParamsTests.fs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ let BothOptinalParamsSupplied() =
1919
Assert.Equal( Some( Some 14), cmd.Execute(Some 3, Some 11))
2020

2121
[<Fact>]
22-
let SkipYParam() =
22+
let YParamNull() =
2323
use cmd = new QueryWithNullableParam()
24-
Assert.Equal( Some( Some 12), cmd.Execute(x = Some 11))
24+
Assert.Equal( Some( Some 12), cmd.Execute(Some 11, None))
2525

2626
[<Fact>]
2727
let NullableStringInputParameter() =
@@ -32,11 +32,6 @@ let NullableStringInputParameter() =
3232
actual = cmd.Execute( None)
3333
)
3434

35-
Assert.Equal(
36-
expected = Some "",
37-
actual = cmd.Execute()
38-
)
39-
4035
Assert.Equal(
4136
expected = Some "boo",
4237
actual = cmd.Execute( Some "boo")

tests/SqlClient.Tests/ProgrammabilityTests.fs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ let FunctionWithParamOfValueTypeWithNullDefault() =
159159
use cmd2 = new AdventureWorks.dbo.ufnGetStock2()
160160
Assert.Equal(cmd1.Execute(1), cmd2.Execute(Some 1))
161161

162-
Assert.Equal(Some 83173, cmd2.Execute())
162+
Assert.Equal(Some 83173, cmd2.Execute(None))
163163

164164
[<Fact>]
165165
let SpWithParamOfRefTypeWithNullDefault() =
@@ -169,7 +169,7 @@ let SpWithParamOfRefTypeWithNullDefault() =
169169
Assert.Equal( Some(Some (box 42)), echo.ExecuteSingle 42)
170170

171171
use echoText = new AdventureWorks.dbo.EchoText()
172-
Assert.Equal<string[]>([| "<NULL>" |], echoText.Execute() |> Seq.toArray)
172+
Assert.Equal<string[]>([| "<NULL>" |], echoText.Execute(null) |> Seq.toArray)
173173

174174
let param = "Hello, world!"
175175
Assert.Equal<string[]>([| param |], echoText.Execute( param) |> Seq.toArray)

0 commit comments

Comments
 (0)