none
Necesito Ayuda con un procedimiento almacenado en SQL Server RRS feed

  • Pregunta

  • Hola a todos, saben tengo un problema con un procedimiento almacenado en SQL Server 2012 les dejo el código que tengo.

    PD: Por cierto me llamo Mauricio, me equivoque al poner mi nombre allí y puse eso largooo xD.

    Como decía este es el código:

    ALTER PROCEDURE [sisacad].[SP_CARRERAAREA_BUSCARCODIGO]
    @BuscarCodigo tinyint
    AS
    SELECT Codigo, 
      Nombre 
    FROM sisacad.CARRERA_AREA
    WHERE Codigo LIKE @BuscarCodigo + '%'
    ORDER BY Codigo
    GO

    Nota: No edité nada de ese código, solamente le puse editar para poder copiar su código.

    La verdad que con ese código planeo usarlo en un formulario en windows form, me funciona la conexión super bien, estoy programando a 3 capas, las capas están bien pero yo creo que tengo algo en los métodos de buscar, me explico, resulta que con ese codigo tengo un TextBox que en su propiedad TextChanged al escribir un numero me vaya mostrando el numero del código, es decir si tengo un registro con codigo 1, y yo en el texbox pongo 1 me lo muestre al igual que en el botón Buscar que le programé dejo sus respectivos códigos, no del botón:

           

    //METODO BUSCAR (FORMULARIO)
            private void Buscar() 
            {
                this.DataListadoCarreraArea.DataSource = NCarreraArea.CodigoBuscar(Convert.ToInt32(this.Txt_CodigoBuscar.Text));
                this.OcultarColumnas();
                LblTotalRegistros.Text = "Total de Registros: " + Convert.ToString(DataListadoCarreraArea.Rows.Count);
    }

    ESTE METODO LLAMA AL METODO BUSCARCODIGO DE LA CLASE DE NEGOCIO(NCarreraArea), dejo el respectivo código de esa clase con ese método. EL LLAMADO SE HACE EN LA LINEA RESPECTIVA DONDE DICE ... NCarreraArea.CodigoBuscar.

           

    /*METODO ELIMINAR QUE LLAMA AL METODO MODIFICAR DE LA CLASE DCARRERAAREA
            DE LA CAPA DE DATOS*/

    public static DataTable CodigoBuscar(int codigobuscar) 
            {
                DCarreraArea Obj = new DCarreraArea();
                Obj.BuscarCodigo = codigobuscar;
                return Obj.BuscarPorCodigo(Obj);
            }

    Como se puede ver ahi cree un objeto, el cual le paso el parámetro "codigobuscar" de tipo int lo deje en int porque como en el procedimiento almacenado que deje mas arriba tenia tinyint lo deje en int.

    Ahora pondré el código del DataTable BuscarPorCodigo que muestra allí en el Return Obj.

                

    //METODO BUSCARCODIGO DE LA CAPA DATOS
            public DataTable BuscarPorCodigo(DCarreraArea CarreraArea) 
            {
                DataTable DTResultado = new DataTable();
                SqlConnection SqlConnect = new SqlConnection();

                try
                {
                    SqlConnect.ConnectionString = Conexion.Cn;
                    SqlCommand SqlCmd = new SqlCommand();
                    SqlCmd.Connection = SqlConnect;
                    SqlCmd.CommandText = "sisacad.SP_CARRERAAREA_BUSCARCODIGO";

                    SqlParameter ParCodigoBuscar = new SqlParameter();
                    ParCodigoBuscar.ParameterName = "@BuscarCodigo";
                    ParCodigoBuscar.SqlDbType = SqlDbType.TinyInt;
                    ParCodigoBuscar.Value = CarreraArea.BuscarCodigo;
                    SqlCmd.Parameters.Add(ParCodigoBuscar);

                    SqlDataAdapter SqlDat = new SqlDataAdapter(SqlCmd);
                    SqlDat.Fill(DTResultado);

                }
                catch (Exception)
                {
                    DTResultado = null;
                }
                return DTResultado;
            }

    Como se puede ver allí paso el parámetro del procedimiento almacenado que les mostré mas arriba el parametro de nombre @BuscarCodigo de tipo tinyint es el parámetro que le paso, y que puse dentro del procedimiento almacenado, bueno no se lo paso directamente sino que esta dentro del método BuscarPorCodigo de la capa de datos.

    Bueno el problema que al ejecutar el programa me tira error cuando pruebo ese método de buscar, es decir, escribo un numero en el TextBox y me sale la cadena de entrada no tiene el formato correcto de la linea del método buscar del formulario, dejo la linea a continuación para que sepan cual me refiero.

     private void Buscar() 
            {
                this.DataListadoCarreraArea.DataSource = NCarreraArea.CodigoBuscar(Convert.ToInt32(this.Txt_CodigoBuscar.Text));

    }

    Tuve que convertir a Int32 para que no me tirara error de formato, pero no se porque me tira ese error, como pueden ver con el código que les deje que bueno a mi parecer esta todo bien, pero lo pensé 2 veces y creo que debe ser el procedimiento almacenado el origen del drama. Ustedes, me podrían ayudar por favor y decirme que hice mal, se los agradecería mucho.

      



    • Editado M4uriXD domingo, 15 de octubre de 2017 3:06
    domingo, 15 de octubre de 2017 3:00

Respuestas

  • El Convert.ToInt32(this.Txt_CodigoBuscar.Text) arrojará ese error que estás viendo cuando en el textbox exista algo que no se pueda convertir a Int32. En particular, si el TextBox está vacío da un error (la cadena vacía no se puede convertir a entero -- NO se convierte a un cero como mucha gente cree).

    Conviene que lo hagas en dos líneas, usando en la primera un int.TryParse en lugar de llamar al Convert.ToInt32. La ventaja del TryParse es que en lugar de arrojar un error, te informa de que la conversión no fue posible, en cuyo caso lo que haces es no llamar al procedimiento y en su lugar informar al usuario de que lo que tecleó no es un número válido.

    • Propuesto como respuesta Willams Morales domingo, 15 de octubre de 2017 18:42
    • Marcado como respuesta M4uriXD jueves, 22 de marzo de 2018 19:43
    domingo, 15 de octubre de 2017 8:27