none
Procedure o function "spinsertar_versiones" expects parameter "@modelo" which was not supplied RRS feed

  • Pregunta

  • Buen día, tengo un problema que ese parametro @modelo no lo recibo mi store procedure:

    procedimiento almacenado: spinsertar_versiones

    CREATE proc [spinsertar_versiones]
    @codigo int output,
    @modelo int,
    @nombre varchar(25),
    @cilindrada int,
    @tipomotor varchar(25)
    as
    insert into versiones(modelo, nombre, cilindrada,tipomotor)
    values (@modelo, @nombre, @cilindrada, @tipomotor)

    LO LLAMO DESDE UNA CLASE:

    public string Insertar(DVersiones versiones)//para proc insertar
            {
                string rpta = "";
                SqlConnection SqlCon = new SqlConnection();
                try
                {
                    string msgError = "";
                    msgError = "No se ingresó el registro";

                    SqlCon.ConnectionString = Conexion.Cn;
                    SqlCon.Open();

                    SqlCommand SqlCmd = new SqlCommand();
                    SqlCmd.Connection = SqlCon;
                    SqlCmd.CommandText = "spinsertar_versiones";
                    SqlCmd.CommandType = CommandType.StoredProcedure;

                    //declaracion de parametros para proc almacenados

                    //@codigo
                    SqlParameter ParCodigo = new SqlParameter();
                    ParCodigo.ParameterName = "@codigo";
                    ParCodigo.SqlDbType = SqlDbType.Int;
                    ParCodigo.Direction = ParameterDirection.Output;
                    SqlCmd.Parameters.Add(ParCodigo);

                    //@modelo
                    SqlParameter ParModelo = new SqlParameter();
                    ParModelo.ParameterName = "@modelo";
                    ParModelo.SqlDbType = SqlDbType.Int;
                    ParModelo.Value = versiones.Modelo;
                    SqlCmd.Parameters.Add(ParModelo);

                    //@nombre
                    SqlParameter ParNombre = new SqlParameter();
                    ParNombre.ParameterName = "@nombre";
                    ParNombre.SqlDbType = SqlDbType.VarChar;
                    ParNombre.Size = 25;
                    ParNombre.Value = versiones.Nombre;
                    SqlCmd.Parameters.Add(ParNombre);

                    //@cilindrada
                    SqlParameter ParCilindrada = new SqlParameter();
                    ParModelo.ParameterName = "@cilindrada";
                    ParModelo.SqlDbType = SqlDbType.Int;
                    ParModelo.Value = versiones.Cilindrada;
                    SqlCmd.Parameters.Add(ParCilindrada);

                    //@tipomotor
                    SqlParameter ParTipomotor = new SqlParameter();
                    ParTipomotor.ParameterName = "@tipomotor";
                    ParTipomotor.SqlDbType = SqlDbType.VarChar;
                    ParTipomotor.Size = 25;
                    ParTipomotor.Value = versiones.Nombre;
                    SqlCmd.Parameters.Add(ParTipomotor);

                    //ejecucion del proc almacenado en BD
                    rpta = SqlCmd.ExecuteNonQuery() == 1 ? "OK" : msgError;
                }//fin try
                catch (Exception ex)
                {
                    rpta = ex.Message;
                }//fin catch
                finally
                {
                    if (SqlCon.State == ConnectionState.Open) SqlCon.Close();
                }//fin finally
                return rpta;
            }//fin insertar

    DVersiones recibe todos los parametros desde el formulario. por lo tanto el error no esta ahi, porque ya utilice depurar.

    Y depurar no lo puedo utilizar en los procedimientos almacenados para revisar si el parametro realmente lo recibe o no.

    gracias desde ya

    viernes, 12 de julio de 2019 22:34

Respuestas

  • hola

    Como generas el parametro de salida ? porque en el procedure no veo que asignes nada

    Salvo al parametro de salida que hay que dindicar el direction, el resto podrias haberlo definido usando una sola linea

    SqlCmd.Parameters.AddWithValue("@modelo", versiones.Modelo);

    no necesitas tantas lineas para cada parametro

    Entendiendo que la propiedad "Modelo" es del tipo int

    Tambien se puede definir

    SqlCommand SqlCmd = new SqlCommand("spinsertar_versiones", SqlCon);
    SqlCmd.CommandType = CommandType.StoredProcedure;


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 12 de julio de 2019 23:09
  • [...] pero a partir de ahora lo hare como me acabas de aconsejar, ya que funciona a la perfección.

    Una observación: Solo te recomiendo hacer esto (usar el AddWithValue) cuando el parámetro sea de un tipo de longitud fija, tal como un SqlDbType.Int que siempre ocupa 4 bytes. Pero cuando sea un varchar o nvarchar es preferible usar la sintaxis larga para poder indicar expresamente la longitud. De lo contrario, el AddWithValue infiere la longitud a partir del texto suministrado, con lo que cada vez sale una longitud distinta y eso hace que el servidor lo considere una sentencia distinta, y entonces disminuye el rendimiento de la caché de procedimientos.
    sábado, 13 de julio de 2019 17:10
    Moderador
  • Si es verdad lo que comenta Alberto, pero la version larga puede ser

    SqlCmd.Parameters.Add("@modelo", SqlDbType.VarChar, 25).Value = versiones.Modelo;

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 13 de julio de 2019 19:35

Todas las respuestas

  • hola

    Como generas el parametro de salida ? porque en el procedure no veo que asignes nada

    Salvo al parametro de salida que hay que dindicar el direction, el resto podrias haberlo definido usando una sola linea

    SqlCmd.Parameters.AddWithValue("@modelo", versiones.Modelo);

    no necesitas tantas lineas para cada parametro

    Entendiendo que la propiedad "Modelo" es del tipo int

    Tambien se puede definir

    SqlCommand SqlCmd = new SqlCommand("spinsertar_versiones", SqlCon);
    SqlCmd.CommandType = CommandType.StoredProcedure;


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 12 de julio de 2019 23:09
  • Muchas gracias amigo.

    Te cuento el problema que tenia: 

    El parametro @modelo que tengo en negrita esta bien, lo malo es lo siguiente:

     //@cilindrada
                    SqlParameter ParCilindrada = new SqlParameter();
                    ParModelo.ParameterName = "@cilindrada";
                    ParModelo.SqlDbType = SqlDbType.Int;
                    ParModelo.Value = versiones.Cilindrada;
                    SqlCmd.Parameters.Add(ParCilindrada);

    Ahi puse nuevamente ParModelo cuando debía ser ParCilindrada.

    Esto lo pude ver por la sugerencia que me diste de agregar parametros en una sola linea, algo que te agradezco mucho, yo lo hacía asi porque asi vi en un tutorial (que es muy excelente por cierto); pero a partir de ahora lo hare como me acabas de aconsejar, ya que funciona a la perfección.

    Saludos

    sábado, 13 de julio de 2019 3:38
  • [...] pero a partir de ahora lo hare como me acabas de aconsejar, ya que funciona a la perfección.

    Una observación: Solo te recomiendo hacer esto (usar el AddWithValue) cuando el parámetro sea de un tipo de longitud fija, tal como un SqlDbType.Int que siempre ocupa 4 bytes. Pero cuando sea un varchar o nvarchar es preferible usar la sintaxis larga para poder indicar expresamente la longitud. De lo contrario, el AddWithValue infiere la longitud a partir del texto suministrado, con lo que cada vez sale una longitud distinta y eso hace que el servidor lo considere una sentencia distinta, y entonces disminuye el rendimiento de la caché de procedimientos.
    sábado, 13 de julio de 2019 17:10
    Moderador
  • Si es verdad lo que comenta Alberto, pero la version larga puede ser

    SqlCmd.Parameters.Add("@modelo", SqlDbType.VarChar, 25).Value = versiones.Modelo;

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 13 de julio de 2019 19:35
  • Gracias, me ha servido de mucho sus ayudas.

    Héctor Hernández

    martes, 16 de julio de 2019 17:56