25 de julio de 2012

Clase ACME en VB-SQL con SP

Anteriormente mostré un  sencillo-sencillisimo ejemplo de clase ACME para VB, en este ejemplo no se utilizaban procedimientos almacenados para realizar operaciones sobre una tabla en la base de datos:
http://pabletoreto.blogspot.com/2012/07/clase-acme-en-vb.html

Para empezar, puesto que estoy utilizando SQL Xpress 2008, haré los procedimientos almacenados sobre mi base de datos llamada registro utilizando el Microsoft SQl Server Management 2008


esta es la tabla empleado que utilizaremos, se encuentra en la base de datos registro


Lo que sigue es crear una nueva consulta y a continuación esta el código T-SQL para crear los procedimientos almacenados en la base de datos registro sobre la tabla empleado


Procedimiento Almacenado AgregarDatos
Este será el procedimiento almacenado que se utilizara para agregar registros de un nuevo empleado a la base de datos, se tiene un parámetro output que regresa un mensaje dependiendo si la acción de insertar datos se realizó con éxito o si hubo algún problema.
Se muestra el uso de TRANSACTION aunque se trabaja sobre una sola tabla, se puede omitir el uso de este pero en caso se trabaje con base de datos relacionales puede venir en uso.

USE registro
GO
IF OBJECT_ID('AgregarDatos','p')is not null
DROP PROCEDURE AgregarDatos
GO

CREATE PROCEDURE AgregarDatos
@nombres varchar(50),
@cargo varchar(50),
@departamento varchar(50),
@jefe varchar(50),
@mensaje varchar(100) output

AS
SET NOCOUNT ON
BEGIN TRY
BEGIN TRAN
INSERT INTO empleado VALUES(@nombres, @cargo, @departamento, @jefe)
COMMIT
SELECT @mensaje='Registro ingresado correctamente en Base de Datos !!!'
END TRY

BEGIN CATCH
ROLLBACK
SELECT @mensaje='Registro no ingresado en Base de Datos !!!'
END CATCH

Procedimiento Almacenado ModificarDatos
Este será el procedimiento almacenado que se utilizara para modificar registros de empleados existentes en la base de datos, se tiene un parámetro output que regresa un mensaje dependiendo si la acción de modificar datos se realizó con éxito o si hubo algún problema.

USE registro
GO
if OBJECT_ID('ModificarDatos','p') is not null
DROP PROC ModificarDatos
GO

CREATE PROC ModificarDatos
@codigo int,
@nombres varchar(50),
@cargo varchar(50),
@departamento varchar(50),
@jefe varchar(50),
@mensaje varchar(100) output

AS
SET NOCOUNT ON
IF exists (select * from empleado where Codigo=@codigo)
BEGIN TRY
BEGIN TRAN
UPDATE empleado SET Nombres=@nombres, Cargo=@cargo, Departamento=@departamento, Jefe=@jefe WHERE Codigo=@codigo
COMMIT
SET @mensaje='El registro fue actualizado correctamente !!!'
END TRY

BEGIN CATCH
ROLLBACK
SET @mensaje='El registro no fue actualizado !!!'
END CATCH
ELSE
BEGIN
SET @mensaje='El registro no existe en la base de datos !!!'
END

Procedimiento Almacenado EliminarDatos
Este será el procedimiento almacenado que se utilizara para eliminar registros de empleados existentes en la base de datos, se tiene un parámetro output que regresa un mensaje dependiendo si la acción de eliminar datos se realizó con éxito o si hubo algún problema.

USE registro
GO
IF OBJECT_ID('EliminarDatos','p')is not null
DROP PROC EliminarDatos
GO

CREATE PROCEDURE EliminarDatos
@codigo int,
@mensaje varchar(100) output

AS
SET NOCOUNT ON
IF EXISTS (select * from empleado where Codigo=@codigo)
BEGIN TRY
BEGIN TRANSACTION
DELETE FROM empleado WHERE Codigo=@codigo
COMMIT
SELECT @mensaje='Registro eliminado correctamente de Base de Datos !!!'
END TRY

BEGIN CATCH
ROLLBACK
set @mensaje='Registro no fue eliminado de la Base de Datos !!!'
END CATCH
ELSE
BEGIN
SET @mensaje='Registro no se puede eliminar pues no existe !!!'
END

ahora muestro el formulario que utilizare, algo a tomar en cuenta es que los datos de la conexión a la base de datos los guardo en un app.config, aquí dejo el link que lo explica: http://pabletoreto.blogspot.com/search/label/App.Config



Evento Form_Load
Al cargar el formulario lo primero que se hará es llenar el DataGridView con los datos de la tabla empleado y habilitar el Bindingnavigator para poder moverse a través de los registros de la tabla, esto se logra invocando al método CargarDatos el cual además crea un enlace entra el BindingNavigator y los textBox para mostrar la información correspondiente

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        CargarDatos()
End Sub

Función Connectar()
Lo único que hace esta función es realizar la conexión a la base de datos y regresar un objeto tipo SqlConnection obteniendo la información del app.config tal como muestra el connectionstrings

<connectionStrings>
        <add name="conexion" connectionString="Data Source=.\LINGONET;Initial Catalog=registro;Integrated Security=True"
            providerName="System.Data.SqlClient" />
    </connectionStrings>

Y este es el código VB para la función Connectar()

Private Function Connectar() As SqlConnection
     Dim cnn As New SqlConnection(ConfigurationManager.ConnectionStrings("conexion").ConnectionString)
     cnn.Open()
     Return cnn
End Function

Cargar datos de la tabla empleado en DataGridView

Private Sub CargarDatos()
        Dim bs As New BindingSource
        Dim cargardatos As String = "select * from empleado"
        Dim cnn As SqlConnection = Connectar()
        Dim da As New SqlDataAdapter(cargardatos, cnn)
        Dim dt As New DataTable
        da.Fill(dt)
        bs.DataSource = dt
        BindingNavigator1.BindingSource = bs
        DGV.DataSource = bs
        CodigoText.DataBindings.Clear()
        CodigoText.DataBindings.Add(New Binding("text", bs, "Codigo"))
        Noento Form Load()mbresText.DataBindings.Clear()
        NombresText.DataBindings.Add(New Binding("text", bs, "Nombres"))
        CargoText.DataBindings.Clear()
        CargoText.DataBindings.Add(New Binding("text", bs, "cargo"))
        DptoText.DataBindings.Clear()
        DptoText.DataBindings.Add(New Binding("text", bs, "departamento"))
        JefeText.DataBindings.Clear()
        JefeText.DataBindings.Add(New Binding("text", bs, "jefe"))
        cnn.Close()
    End Sub

Evento click botón AgregarRegistro

Private Sub BAgregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BAgregar.Click
Try
   Dim cnn As SqlConnection = Connectar()
   Dim cmd As New SqlCommand("AgregarDatos", cnn)
   cmd.CommandType = CommandType.StoredProcedure
   cmd.Parameters.Add("@nombres", SqlDbType.VarChar).Value = NombresText.Text
   cmd.Parameters.Add("@cargo", SqlDbType.VarChar).Value = CargoText.Text
   cmd.Parameters.Add("@departamento", SqlDbType.VarChar).Value = DptoText.Text
   cmd.Parameters.Add("@jefe", SqlDbType.VarChar).Value = JefeText.Text
   cmd.Parameters.Add("@mensaje", SqlDbType.VarChar, 100)
   cmd.Parameters("@mensaje").Direction = ParameterDirection.Output
   cmd.ExecuteNonQuery()
   Dim mensaje As String = cmd.Parameters("@mensaje").Value
   MessageBox.Show(mensaje)
   cnn.Close()
   cmd.Dispose()
   CargarDatos()
Catch ex As Exception
   MessageBox.Show(ex.Message)
End Try
End Sub

Evento click botón ModificarRegistro

Private Sub BModificar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BModificar.Click
Try
   Dim cnn As SqlConnection = Connectar()
   Dim cmd As New SqlCommand("ModificarDatos")
   cmd.CommandType = CommandType.StoredProcedure
   cmd.Connection = cnn
   cmd.Parameters.Add("@codigo", SqlDbType.Int).Value = CodigoText.Text
   cmd.Parameters.Add("@nombres", SqlDbType.VarChar).Value = NombresText.Text
   cmd.Parameters.Add("@cargo", SqlDbType.VarChar).Value = CargoText.Text
   cmd.Parameters.Add("@departamento", SqlDbType.VarChar).Value = DptoText.Text
   cmd.Parameters.Add("@jefe", SqlDbType.VarChar).Value = JefeText.Text
   cmd.Parameters.Add("@mensaje", SqlDbType.VarChar, 100)
   cmd.Parameters("@mensaje").Direction = ParameterDirection.Output
   cmd.ExecuteNonQuery()
   Dim mensaje As String = cmd.Parameters("@mensaje").Value
   MessageBox.Show(mensaje)
   cnn.Close()
   cmd.Dispose()
   CargarDatos()
Catch ex As Exception
   MessageBox.Show(ex.Message)
End Try
End Sub

Evento click botón EliminarRegistro

Private Sub BEliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BEliminar.Click
Try
   Dim cnn As SqlConnection = Connectar()
   Dim cmd As New SqlCommand("EliminarDatos", cnn)
   cmd.CommandType = CommandType.StoredProcedure
   cmd.Parameters.AddWithValue("@codigo", CodigoText.Text)
   cmd.Parameters.Add("@mensaje", SqlDbType.VarChar, 100)
   cmd.Parameters("@mensaje").Direction = ParameterDirection.Output
   cmd.ExecuteNonQuery()
   Dim mensaje As String = cmd.Parameters("@mensaje").Value
   MessageBox.Show(mensaje)
   cnn.Close()
   cmd.Dispose()
   CargarDatos()
Catch ex As Exception
   MessageBox.Show(ex.Message)
End Try
End Sub


eso es todo :)