none
WebServices API Rest, RRS feed

  • Pregunta

  • Hola, estoy desallorando una Web API con procedimientos almacenados en el metodo GET, no tengo ningun problema, en el POST, PUT cuando ejecuto el procedimiento almacenado lo ejecuta dos veces. por ejemplo. estoy insetando un cliente nuevo a la base datos y el campo IdCliente es la llave primaria cuando consumo el metodo. lo ejecuta pero me muestra el error Primary Kety infraccion porque que existe en la base datos, pero antes de la ejecucion del meotod no existia, es decir la primera lo ejecuto lo inserto y vuelve a ejecutarlo por segunda vez.

    soy nuevo en C# tiengo estos problemas quien me ayuda.

    jueves, 10 de enero de 2019 15:56

Respuestas

  • Hola. El error está aqui, en el metodo

      public DataSet stClientes(string wToken, string wApellidos, string wNombres, string wDireccion, string wLocalidad,
    
                                     string wCiudad, string wReferencia, string wIdPais, string wFhaNacimiento, string wIdDocIde,
    
                                     string wNroDocIde, string wSexo)
    
     

    sqlCommand.ExecuteNonQuery();
    
       sqlDataAdapter = new SqlDataAdapter(sqlCommand);
    
       sqlDataAdapter.Fill(dsConsulta);

    Si te fijas estas ejecutando el comando directamente y luego vía SqlAdapter. Viendo tu código veo que sobra el uso del comando directamente. 


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    jueves, 10 de enero de 2019 18:32
    Moderador
  • hola

    >>cuando ejecuto el procedimiento almacenado lo ejecuta dos veces

    revisaste si es el procedure el que se ejecuta dos veces o quizas se esta invocando la Web API POST mas de una vez, por so ingresa la ejecucion mas de una vez y por consiguente el procedure

    >>lo ejecuta pero me muestra el error Primary Kety infraccion porque que existe en la base datos, pero antes de la ejecucion del meotod no existia

    no entiendo, eso que explicas no tiene sentido

    si estas insertando no puede dar problema de duplicado ya que crearia un id nuevo en cada operacion de insert, podria duplicar los registros pero no deberia fallar

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 10 de enero de 2019 16:25
  • El procedimiento almacenado cuando se ejecuta desde SQL Server funciona normal, cuando es llamado desde C# es como si se ejecutara dos veces. porque se intenta duplicar el registros. antes de ejecutar el metodo no existe el registro en la BD. ejecuto el metodo y sale el error Primary Key, reviso la tabla de la B.D y ahora si existe el registro. es decir lo creo y quiere volver a crearlo es ahi cuando sale el error.

    Este la logicaNegocio.

       public class clsClientes

        {

            string stConexion = "";

            SqlCommand sqlCommand = null;

            SqlConnection sqlConnection = null;

            SqlDataAdapter sqlDataAdapter = null;

           public clsClientes()

            {

                clsConexion obclsConexion = new clsConexion();

                stConexion = obclsConexion.stGetConexion();

            }

           public DataSet stClientes(string wToken, string wApellidos, string wNombres, string wDireccion, string wLocalidad,

                                     string wCiudad, string wReferencia, string wIdPais, string wFhaNacimiento, string wIdDocIde,

                                     string wNroDocIde, string wSexo)

           {

               try

               {

                   DataSet dsConsulta = new DataSet();

                   sqlConnection = new SqlConnection(stConexion);

                   sqlConnection.Open();

                   sqlCommand = new SqlCommand("PA_WebApiClientes", sqlConnection);

                   sqlCommand.CommandType = CommandType.StoredProcedure;

                   sqlCommand.Parameters.Add(new SqlParameter("@Token", wToken));

                   sqlCommand.Parameters.Add(new SqlParameter("@Apellidos", wApellidos));

                   sqlCommand.Parameters.Add(new SqlParameter("@Nombres", wNombres));

                   sqlCommand.Parameters.Add(new SqlParameter("@Direccion", wDireccion));

                   sqlCommand.Parameters.Add(new SqlParameter("@Localidad", wLocalidad));

                   sqlCommand.Parameters.Add(new SqlParameter("@Ciudad", wCiudad));

                   sqlCommand.Parameters.Add(new SqlParameter("@Referencia", wReferencia));

                   sqlCommand.Parameters.Add(new SqlParameter("@IdPais", wIdPais));

                   sqlCommand.Parameters.Add(new SqlParameter("@FhaNacimiento", wFhaNacimiento));

                   sqlCommand.Parameters.Add(new SqlParameter("@IdDocIde", wIdDocIde));

                   sqlCommand.Parameters.Add(new SqlParameter("@NroDocIde", wNroDocIde));

                   sqlCommand.Parameters.Add(new SqlParameter("@Sexo", wSexo));

                   sqlCommand.Parameters.Add(new SqlParameter("@Tipo", "30"));

                   sqlCommand.ExecuteNonQuery();

                   sqlDataAdapter = new SqlDataAdapter(sqlCommand);

                   sqlDataAdapter.Fill(dsConsulta);

                   return dsConsulta;

               }

               catch (Exception ex) { throw ex; }

               finally { sqlConnection.Close(); }

           }

    Este es mi Contrador del API

       [HttpPost]
            public Reply Clientes([FromBody]Clientess model)
            {
                Reply oR = new Reply();
                try
                {
                    WebLogica.Clases.clsClientes obclsConsulta = new WebLogica.Clases.clsClientes();
                    DataSet dsConsulta = obclsConsulta.stClientes(model.Sessionkey, model.Apellidos, model.Nombres, model.Direccion,
                                                                  model.Localidad, model.Ciudad, model.Referencia, model.IdPais,
                                                                  model.FhaNacimiento, model.IdDocIde, model.NroDocIde, model.Sexo);
                                                                  //model.IdLugTlf1, model.NroTlfUno, model.IdLugTlf2, model.NroTlfDos,
                                                                  //model.IdLugTlf3, model.NroTlfTres, model.Email);
                                                                  //model.NombreBco,
                                                                  //model.PlazaBco, model.TipCtaBco, model.NroCtaBco, model.NroRutaBco,
                                                                  //model.IdOcuOficio, model.IdPaisNacion);

                    if (dsConsulta.Tables[0].Columns[0].ToString() == "Status")
                    {
                        oR.status = dsConsulta.Tables[0].Rows[0][0].ToString();
                        oR.message = dsConsulta.Tables[0].Rows[0][1].ToString();
                        oR.result = dsConsulta.Tables[0].Rows[0][2].ToString();
                    }
                    else
                    {
                        oR.status = "00";
                        oR.message = "Success";
                        oR.result = dsConsulta;
                    }
                }
                catch (Exception ex)
                {
                    oR.status = "99";
                    oR.message = "Failure";
                    oR.result = ex.ToString();
                }
                return oR;
            }

    eso me tiene loco no puedo darle solucion, me ayudan

    jueves, 10 de enero de 2019 18:19
  • hola

    >>antes de ejecutar el metodo no existe el registro en la BD. ejecuto el metodo y sale el error Primary Key,

    en el codigo veo que estas realizando un SELECT para cargar un dataset, o al menos eso deberia realizar cuando usas el data adapter, no veo que duplicados puede producirser

    lo que explicas con el codigo que muestras no tiene ningun sentido

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 10 de enero de 2019 18:27

Todas las respuestas

  • hola

    >>cuando ejecuto el procedimiento almacenado lo ejecuta dos veces

    revisaste si es el procedure el que se ejecuta dos veces o quizas se esta invocando la Web API POST mas de una vez, por so ingresa la ejecucion mas de una vez y por consiguente el procedure

    >>lo ejecuta pero me muestra el error Primary Kety infraccion porque que existe en la base datos, pero antes de la ejecucion del meotod no existia

    no entiendo, eso que explicas no tiene sentido

    si estas insertando no puede dar problema de duplicado ya que crearia un id nuevo en cada operacion de insert, podria duplicar los registros pero no deberia fallar

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 10 de enero de 2019 16:25
  • El procedimiento almacenado cuando se ejecuta desde SQL Server funciona normal, cuando es llamado desde C# es como si se ejecutara dos veces. porque se intenta duplicar el registros. antes de ejecutar el metodo no existe el registro en la BD. ejecuto el metodo y sale el error Primary Key, reviso la tabla de la B.D y ahora si existe el registro. es decir lo creo y quiere volver a crearlo es ahi cuando sale el error.

    Este la logicaNegocio.

       public class clsClientes

        {

            string stConexion = "";

            SqlCommand sqlCommand = null;

            SqlConnection sqlConnection = null;

            SqlDataAdapter sqlDataAdapter = null;

           public clsClientes()

            {

                clsConexion obclsConexion = new clsConexion();

                stConexion = obclsConexion.stGetConexion();

            }

           public DataSet stClientes(string wToken, string wApellidos, string wNombres, string wDireccion, string wLocalidad,

                                     string wCiudad, string wReferencia, string wIdPais, string wFhaNacimiento, string wIdDocIde,

                                     string wNroDocIde, string wSexo)

           {

               try

               {

                   DataSet dsConsulta = new DataSet();

                   sqlConnection = new SqlConnection(stConexion);

                   sqlConnection.Open();

                   sqlCommand = new SqlCommand("PA_WebApiClientes", sqlConnection);

                   sqlCommand.CommandType = CommandType.StoredProcedure;

                   sqlCommand.Parameters.Add(new SqlParameter("@Token", wToken));

                   sqlCommand.Parameters.Add(new SqlParameter("@Apellidos", wApellidos));

                   sqlCommand.Parameters.Add(new SqlParameter("@Nombres", wNombres));

                   sqlCommand.Parameters.Add(new SqlParameter("@Direccion", wDireccion));

                   sqlCommand.Parameters.Add(new SqlParameter("@Localidad", wLocalidad));

                   sqlCommand.Parameters.Add(new SqlParameter("@Ciudad", wCiudad));

                   sqlCommand.Parameters.Add(new SqlParameter("@Referencia", wReferencia));

                   sqlCommand.Parameters.Add(new SqlParameter("@IdPais", wIdPais));

                   sqlCommand.Parameters.Add(new SqlParameter("@FhaNacimiento", wFhaNacimiento));

                   sqlCommand.Parameters.Add(new SqlParameter("@IdDocIde", wIdDocIde));

                   sqlCommand.Parameters.Add(new SqlParameter("@NroDocIde", wNroDocIde));

                   sqlCommand.Parameters.Add(new SqlParameter("@Sexo", wSexo));

                   sqlCommand.Parameters.Add(new SqlParameter("@Tipo", "30"));

                   sqlCommand.ExecuteNonQuery();

                   sqlDataAdapter = new SqlDataAdapter(sqlCommand);

                   sqlDataAdapter.Fill(dsConsulta);

                   return dsConsulta;

               }

               catch (Exception ex) { throw ex; }

               finally { sqlConnection.Close(); }

           }

    Este es mi Contrador del API

       [HttpPost]
            public Reply Clientes([FromBody]Clientess model)
            {
                Reply oR = new Reply();
                try
                {
                    WebLogica.Clases.clsClientes obclsConsulta = new WebLogica.Clases.clsClientes();
                    DataSet dsConsulta = obclsConsulta.stClientes(model.Sessionkey, model.Apellidos, model.Nombres, model.Direccion,
                                                                  model.Localidad, model.Ciudad, model.Referencia, model.IdPais,
                                                                  model.FhaNacimiento, model.IdDocIde, model.NroDocIde, model.Sexo);
                                                                  //model.IdLugTlf1, model.NroTlfUno, model.IdLugTlf2, model.NroTlfDos,
                                                                  //model.IdLugTlf3, model.NroTlfTres, model.Email);
                                                                  //model.NombreBco,
                                                                  //model.PlazaBco, model.TipCtaBco, model.NroCtaBco, model.NroRutaBco,
                                                                  //model.IdOcuOficio, model.IdPaisNacion);

                    if (dsConsulta.Tables[0].Columns[0].ToString() == "Status")
                    {
                        oR.status = dsConsulta.Tables[0].Rows[0][0].ToString();
                        oR.message = dsConsulta.Tables[0].Rows[0][1].ToString();
                        oR.result = dsConsulta.Tables[0].Rows[0][2].ToString();
                    }
                    else
                    {
                        oR.status = "00";
                        oR.message = "Success";
                        oR.result = dsConsulta;
                    }
                }
                catch (Exception ex)
                {
                    oR.status = "99";
                    oR.message = "Failure";
                    oR.result = ex.ToString();
                }
                return oR;
            }

    eso me tiene loco no puedo darle solucion, me ayudan

    jueves, 10 de enero de 2019 18:19
  • hola

    >>antes de ejecutar el metodo no existe el registro en la BD. ejecuto el metodo y sale el error Primary Key,

    en el codigo veo que estas realizando un SELECT para cargar un dataset, o al menos eso deberia realizar cuando usas el data adapter, no veo que duplicados puede producirser

    lo que explicas con el codigo que muestras no tiene ningun sentido

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 10 de enero de 2019 18:27
  • Hola. El error está aqui, en el metodo

      public DataSet stClientes(string wToken, string wApellidos, string wNombres, string wDireccion, string wLocalidad,
    
                                     string wCiudad, string wReferencia, string wIdPais, string wFhaNacimiento, string wIdDocIde,
    
                                     string wNroDocIde, string wSexo)
    
     

    sqlCommand.ExecuteNonQuery();
    
       sqlDataAdapter = new SqlDataAdapter(sqlCommand);
    
       sqlDataAdapter.Fill(dsConsulta);

    Si te fijas estas ejecutando el comando directamente y luego vía SqlAdapter. Viendo tu código veo que sobra el uso del comando directamente. 


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    jueves, 10 de enero de 2019 18:32
    Moderador
  • Hola. Sergio 

    Error solucionado, no me había dado cuenta que estaba invocando dos veces la ejecución del procedimiento almacenado. Elimine la linea y todo funciona a la perfección, me salvaste. GRACIAS. 

    viernes, 11 de enero de 2019 14:33