Sesión #3

 Duración 2 horas 10:00am-12:00pm


Se creó la conexión del servidor en Flask con la Base de Datos

def get_db_connection():
    connection = pyodbc.connect(
        'DRIVER={ODBC Driver 17 for SQL Server};'
        'SERVER=ERICKPC;'
        'DATABASE=tarea1;'
        'UID=hola;'
        'PWD=123'
    )
    return connection

Se creó el SP para insertar empleados, tomando como ejemplo, el que el profesor realizó en clase, agregandole una transacción para que la operación sea todo o nada, junto con la validación de que el nombre no exista en la BD

CREATE PROCEDURE [dbo].[InsertarEmpleado]
    @Nombre VARCHAR(128)
    , @Salario MONEY
    , @OutResulTCode INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    BEGIN TRY

    SET @OutResulTCode=0;

    SELECT @OutResulTCode AS OutResulTCode;  -- Este codigo se agrega solo si hay problemas para obtener este  valor como parametros

    IF EXISTS (SELECT 1 FROM dbo.Empleado WHERE Nombre = @Nombre)

    BEGIN
        SET @OutResulTCode=50001;
    END

    ELSE
    BEGIN
        BEGIN TRANSACTION;
        BEGIN
            INSERT INTO dbo.Empleado (Nombre, Salario) VALUES (@Nombre, @Salario);
            COMMIT TRANSACTION;
        END
        BEGIN
            SET @OutResulTCode=0;
        END
    END

    END TRY
    BEGIN CATCH
        INSERT INTO dbo.DBErrors    VALUES (
            SUSER_SNAME(),
            ERROR_NUMBER(),
            ERROR_STATE(),
            ERROR_SEVERITY(),
            ERROR_LINE(),
            ERROR_PROCEDURE(),
            ERROR_MESSAGE(),
            GETDATE()
        );

        SET @OutResulTCode=50005  ;  -- Codigo de error standar del profe para informar de un error capturado en el catch

    END CATCH;

    SET NOCOUNT Off;
END;

Se tuvo un problema con este SP ya que no podíamos tomar el OutResultCode, esto se debía a la linea: 

SELECT @OutResulTCode AS OutResulTCode;

La misma se eliminó y el SP se pudo ejecutar de manera correcta


Se creó la función del servidor de flask para ejecutar el SP mencionado:

@app.route('/insertar_empleado', methods=['POST'])
def insertar_empleado():
    nombre = request.json.get('nombre')
    salario = request.json.get('salario')

    conn = get_db_connection()
    cursor = conn.cursor()

    try:
        # Declarar y ejecutar el procedimiento almacenado con OUTPUT
        cursor.execute("""
                DECLARE @return_value int,
                    @OutResulTCode int

                EXEC    @return_value = [dbo].[InsertarEmpleado]
                    @Nombre = ?,
                    @Salario = ?,
                    @OutResulTCode = @OutResulTCode OUTPUT

                SELECT  @OutResulTCode as N'@OutResultCode'
                """, (nombre, salario))

        # Obtener el valor del código de resultado
        out_result_code = cursor.fetchone()[0]

        # Confirmar la transacción si todo es exitoso
        conn.commit()
    except Exception as e:
        return jsonify({'error': str(e)}), 500
    finally:
        # Cerrar el cursor y la conexión
        cursor.close()
        conn.close()

    # Devolver el código de resultado como respuesta
    return jsonify({'OutResulTCode': out_result_code})




Comentarios