tipo ser salida recuperar query que puede procedimiento parámetro parametros parametro net función esperaba especificado ejemplos data consulta con commandtype c# sql-server exception

c# - ser - La consulta parametrizada... espera el parámetro ''@units'', que no se suministró



sqlcommand parameters vb net (4)

Me sale esta excepción:

La consulta parametrizada ''(@Name nvarchar (8), @ type nvarchar (8), @ units nvarchar (4000), @ rang'' espera el parámetro ''@units'', que no se suministró.

Mi código para insertar es:

public int insertType(string name, string type, string units = "N//A", string range = "N//A", string scale = "N//A", string description = "N//A", Guid guid = new Guid()) { using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); SqlCommand command = new SqlCommand(); command.CommandText = "INSERT INTO Type(name, type, units, range, scale, description, guid) OUTPUT INSERTED.ID VALUES (@Name, @type, @units, @range, @scale, @description, @guid) "; command.Connection = connection; command.Parameters.AddWithValue("@Name", name); command.Parameters.AddWithValue("@type", type); command.Parameters.AddWithValue("@units", units); command.Parameters.AddWithValue("@range", range); command.Parameters.AddWithValue("@scale", scale); command.Parameters.AddWithValue("@description", description); command.Parameters.AddWithValue("@guid", guid); return (int)command.ExecuteScalar(); } }

La excepción fue una sorpresa porque estoy usando la función AddWithValue y asegurándome de haber agregado los parámetros predeterminados para la función.

SOLUCIONADO

El problema era que algunos parámetros eran Cadenas vacías (que anulaban el valor predeterminado)

Este es el código de trabajo:

public int insertType(string name, string type, string units = "N//A", string range = "N//A", string scale = "N//A", string description = "N//A", Guid guid = new Guid()) { using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); SqlCommand command = new SqlCommand(); command.CommandText = "INSERT INTO Type(name, type, units, range, scale, description, guid) OUTPUT INSERTED.ID VALUES (@Name, @type, @units, @range, @scale, @description, @guid) "; command.Connection = connection; command.Parameters.AddWithValue("@Name", name); command.Parameters.AddWithValue("@type", type); if (String.IsNullOrEmpty(units)) { command.Parameters.AddWithValue("@units", DBNull.Value); } else command.Parameters.AddWithValue("@units", units); if (String.IsNullOrEmpty(range)) { command.Parameters.AddWithValue("@range", DBNull.Value); } else command.Parameters.AddWithValue("@range", range); if (String.IsNullOrEmpty(scale)) { command.Parameters.AddWithValue("@scale", DBNull.Value); } else command.Parameters.AddWithValue("@scale", scale); if (String.IsNullOrEmpty(description)) { command.Parameters.AddWithValue("@description", DBNull.Value); } else command.Parameters.AddWithValue("@description", description); command.Parameters.AddWithValue("@guid", guid); return (int)command.ExecuteScalar(); } }


Aquí hay una forma de usar el operador nulo-coalescente:

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);

O para una verificación de tipo más estricta:

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;

El operador también estará encadenado:

int?[] a = { null, null, 1 }; Console.WriteLine(a[0] ?? a[1] ?? a[2]);


Este es un método para ser reutilizado con múltiples parámetros:

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); }

Y luego puedes reutilizarlo para tantos comandos y params:

NullorEmptyParameter(command, "@Idea_ID", Idea_ID); NullorEmptyParameter(command, "@Opportunities_or_Idea", Opportunities_or_Idea);


Prueba este código:

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

Y debe verificar todos los demás parámetros para el valor nulo. Si es nulo, debe pasar el valor DBNull.Value .


command.Parameters.AddWithValue ("@ Name", (name == null? "": name));