The parameterized query … expects the parameter '@units', which was not supplied

后端 未结 5 2002
耶瑟儿~
耶瑟儿~ 2020-12-01 10:02

I\'m getting this exception:

The parameterized query \'(@Name nvarchar(8),@type nvarchar(8),@units nvarchar(4000),@rang\' expects the parameter \'@uni

相关标签:
5条回答
  • 2020-12-01 10:38

    This extension class was useful to me a couple of times so far, for those issues:

    public static class DbValueExtensions
    {
        // Used to convert values coming from the db
        public static T As<T>(this object source)
        {
            return source == null || source == DBNull.Value
                ? default(T)
                : (T)source;
        }
    
        // Used to convert values going to the db
        public static object AsDbValue(this object source)
        {
            return source ?? DBNull.Value;
        }
    }
    

    You would normally use it in two scenarios. First, when creating parameters for your query:

    var parameters = new Dictionary<string, object>
    {
        { "@username", username.AsDbValue() },
        { "@password", password.AsDbValue() },
        { "@birthDate", birthDate.AsDbValue() },
    };
    

    or when parsing the SqlReader values:

    while (reader.Read())
    {
        yield return new UserInfo(
            reader["username"].As<string>(),
            reader["birthDate"].As<DateTime>(),
            reader["graduationDate"].As<DateTime?>(),
            reader["nickname"].As<string>()
        );
    }
    
    0 讨论(0)
  • 2020-12-01 10:45

    Try this code:

    SqlParameter unitsParam = command.Parameters.AddWithValue("@units", units);
    if (units == null)
    {
        unitsParam.Value = DBNull.Value;
    }
    

    And you must check all other parameters for null value. If it null you must pass DBNull.Value value.

    0 讨论(0)
  • 2020-12-01 10:51

    Here's a way using the null-coalescing operator:

    cmd.Parameters.AddWithValue("@units", units ?? (object)DBNull.Value);
    cmd.Parameters.AddWithValue("@range", range ?? (object)DBNull.Value);
    cmd.Parameters.AddWithValue("@scale", scale ?? (object)DBNull.Value);
    cmd.Parameters.AddWithValue("@description", description ?? (object)DBNull.Value);
    

    Or for more strict type checking:

    cmd.Parameters.Add("@units", SqlDbType.Int).Value = units ?? (object)DBNull.Value;
    cmd.Parameters.Add("@range", SqlDbType.Int).Value = range ?? (object)DBNull.Value;
    cmd.Parameters.Add("@scale", SqlDbType.Int).Value = scale ?? (object)DBNull.Value;
    cmd.Parameters.Add("@description", SqlDbType.VarChar).Value = description ?? (object)DBNull.Value;
    

    The operator also be chained:

    int?[] a = { null, null, 1 };
    Console.WriteLine(a[0] ?? a[1] ?? a[2]);
    
    0 讨论(0)
  • 2020-12-01 10:51

    This is a method to be reused with multiple parameters:

    public void NullorEmptyParameter(QC.SqlCommand command, string at, string value)
    {
        if (String.IsNullOrEmpty(value))
        {
            command.Parameters.AddWithValue(at, DBNull.Value);
        }
        else
            command.Parameters.AddWithValue(at, value);
    }
    

    And then you can reuse it for as many commands and params:

    NullorEmptyParameter(command, "@Idea_ID", Idea_ID);
    NullorEmptyParameter(command, "@Opportunities_or_Idea", Opportunities_or_Idea);
    
    0 讨论(0)
  • 2020-12-01 10:55
    command.Parameters.AddWithValue("@Name", (name == null ? "" : name));
    
    0 讨论(0)
提交回复
热议问题