Home > database >  Execute SqlCommand without providing values to parameters
Execute SqlCommand without providing values to parameters

Time:11-19

I have a stored procedure in my database:

ALTER PROCEDURE [dbo].[SP_UPDATE_PARAMS]
    (@ELEMENT NUMERIC (10),
     @NUM_PARAM_OP_DINT NUMERIC (3,0) OUTPUT,
     @NUM_PARAM_OP_REAL NUMERIC (3,0) OUTPUT,
     @NUM_PARAM_LL NUMERIC (3,0) OUTPUT,
     ....   other 500 output params

The procedure produces an output for each value depending on what @Element value is. Otherwise it returns a value of 0.

So, in my C# code I try to use this:

....
using (SqlConnection connection = new SqlConnection(connectString))
{
    connection.Open();

    using (SqlCommand cmd = new SqlCommand("[dbo].[SP_UPDATE_PARAMS]", connection))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@ELEMENT", SqlDbType.Int).Value = element;

        SqlDataReader rdr = cmd.ExecuteReader();
.....

But I get this error:

Stored procedure or function [dbo].[SP_UPDATE_PARAMS] expects parameter which is not supplied @NUM_PARAM_OP_DINT

This will happen if I do not provide a value for each of the 504 values of [dbo].[SP_UPDATE_PARAMS] (even if they are output)

I tried using

foreach (IDataParameter param in cmd.Parameters)
{
    param.Value = DBNull.Value;
}

and

foreach (SqlParameter parameter in cmd.Parameters)
{
    parameter.Value = DBNull.Value;
}

before calling

SqlDataReader rdr = cmd.ExecuteReader();

but none of them will do, as cmd.Parameters are null until (I guess) cmd.ExecuteReader() is executed.

How could I avoid having to provide a value for all parameters, or make all of them be null?

CodePudding user response:

The cmd.Parameters property is empty and you add parameters to it for the procedure you're trying to execute.

https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlcommand.parameters?view=dotnet-plat-ext-6.0#property-value

You could create an object with an array of parameters for that stored procedure's parameters with defaults and pass that object in as your parameters. You can still set your @ELEMENT value this way as well.

https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlparametercollection.addrange?view=dotnet-plat-ext-6.0

Another potential solution, make your stored proc OUTPUT params optional

ALTER PROCEDURE [dbo].[SP_UPDATE_PARAMS](@ELEMENT NUMERIC (10),
                                                @NUM_PARAM_OP_DINT  NUMERIC (3,0) = NULL OUTPUT,
                                                @NUM_PARAM_OP_REAL  NUMERIC (3,0) = NULL OUTPUT,
                                                @NUM_PARAM_LL   NUMERIC (3,0) = NULL OUTPUT,

CodePudding user response:

If you are passing a null parameter to a proc you need to declare the param as NULL such as

@ELEMENT NUMERIC (10) = NULL,
@NUM_PARAM_OP_DINT  NUMERIC (3,0) = NULL,
@NUM_PARAM_OP_REAL  NUMERIC (3,0) = NULL,
@NUM_PARAM_LL   NUMERIC (3,0) = NULL,

You will still need to provide the params to the proc but depending on what ones you actually want to be null pass a DBNull.Value

Edit: Do not use AddWithValue for the love of God. just use Add

  • Related