none
Agregar fecha actual mediante un procedimiento almacenado RRS feed

  • Pregunta

  • ¡Hola! tengo una duda, mi caso es el siguiente: tengo una base de datos llamada huellas_empleados, donde tengo almacenada la huella digital de varios empleados, tengo otra tabla llamada disponibilidad_empleados con los campos id_huella, estatus (el cual es 1 para indicar que se encuentra en la empresa) y fecha que es el único campo que se llenara cuando el empleado coloque su huella, ya que el id_huella y el estatus ya tienen un valor (el id_huella obtiene valor de la tabla huella_empleados y el estatus se establecerá como 1) . Espero alguien me pueda ayudar, ya que lo que quiero hacer es agregar los tres valores (id_huella, estatus y fecha) a mi tabla disponibilidad_empleado mediante un proceso almacenado a través de c#.

    este es mi procedimiento almacenado

    CREATE PROCEDURE dbo.disponibilidad_emp_ins

    AS
    BEGIN
    SELECT d.id_Huella, d.Estatus, p.fecha_registro
      FROM [EmpleadosDB].[dbo].[Disponibilidad_Empleados] p 
      inner join dbo.Huellas_Empleados d on p.id_huella = d.id_huella
      where d.estatus = 1
    END


    EN C# UTILIZO ESTE HELPER

      public void Insert(string commandText, CommandType commandType, SqlParameter[] parameters)
            {
                using (var connection = new SqlConnection(ConnectionString))
                {
                    connection.Open();

                    using (var command = new SqlCommand(commandText, connection))
                    {
                        command.CommandType = commandType;
                        if (parameters != null)
                        {
                            foreach (var parameter in parameters)
                            {
                                command.Parameters.Add(parameter);
                            }
                        }

                        command.ExecuteNonQuery();
                    }
                }
            }

    Lo utilizo en una clase creando el siguiente metodo

      public void Inserta_Disponibilidad(int id_huella, DateTime Fecha_Registro)
            {
                
                try
                {
                    var parameters = new List<SqlParameter>();
                    parameters.Add(sqlHelper.CreateParameter("@id_huella", id_huella, SqlDbType.Int));
                    parameters.Add(sqlHelper.CreateParameter("@fecha_registro", Fecha_Registro, SqlDbType.DateTime));

                    int lastId = 0;
                    sqlHelper.Insert("dbo.disponibilidad_emp_ins", CommandType.StoredProcedure, parameters.ToArray(), out lastId);

                }
                catch (Exception ex)
                {
                    Console.WriteLine("Exepcion: ", ex.ToString());
                    throw ex;
                }
            }

    Pero no se como insertar los datos en el form, despues de que el empleado registra su llegada, que se ejecute este procedimiento

    sábado, 14 de marzo de 2020 19:38

Respuestas

  • Hola sistemashz:

    Lo primero, es para que funcione, pasarle los parámetros al procedure en SQL.

    CREATE PROCEDURE dbo.disponibilidad_emp_ins (
    @id int,
    @fecha datetime
    )
    AS
    BEGIN
    	INSERT INTO dbo.Disponibilidad_Empleados (id_Huella, Estatus, Fecha_registro)
    	SELECT d.id_Huella, 1, @fecha
    		FROM [EmpleadosDB].[dbo].[Disponibilidad_Empleados] p 
    			inner join dbo.Huellas_Empleados d on p.id_huella = d.id_huella
    		WHERE p.idEmp = @id;
    
    END 
    

    Si tu procedure, recibe dos parámetros enviados desde c#, hay que definirlos. Luego, si el objetivo es insertar en DisponibilidadEmpleados, la sentencia puede ser algo similar a esto.

    Con esto podrías tener la parte de la inserción cubierta. Ahora bien,

    Pero no se como insertar los datos en el form, despues de que el empleado registra su llegada, que se ejecute este procedimiento

    Qúe datos? Si necesitas datos de la inserción, en el mismo procedure, puedes hacer una select, pero esto te implica cambiar cosas en tú helper, porque el Insert, esta utilizando ExecuteNonQuery, y por tanto no recibe nada. Puedes Implementar una función adicional, que se de insercción, pero que ExecuteReader, y en el procedure, después de insertar, realizas un Select que recogería este método del helper.

    Pero también veo, que estás intentando pasar un parámetro como out.

    Si lo que deseas es saber el último id insertado y este es el  único que necesitas, entonces hay dos variantes factibles. Si tu id de Disponibilidad_Empleados es un identity, entonces puedes añadir en la definición del procedure un parámetro más @idLast int out.

    En el cuerpo del procedure después de la inserción, asignas a @idLast el scope_identity: Set @idLast = ScopeIdentity();

    Pero en la función de insertar tendrás que sobrecargarla para Inserciones con parametros de salida. Y despúes del executeNonQuery

    resultado =Convert.ToInt32( conexion.Parameters["@IdLast"].Value);

    Devolver parametros de un procedure

    https://docs.microsoft.com/es-es/sql/relational-databases/stored-procedures/return-data-from-a-stored-procedure?view=sql-server-ver15


    domingo, 15 de marzo de 2020 6:16