CRUD con Tablas Relacionadas Parte 1, Insertar, Mostrar Datos, C#, SQL, SP, Capas (ComboBox, Inner Join) Nivel Base

Hola, en este tutorial realizaremos como insertar datos CON tablas relacionadas mediante combo box que muestra los data de cada tabla relacionada y contiene el ID (Clave primaria), tambien, mostraremos los datos de las tablas relacionadas en un datagridview usando INNER JOIN. Todo ello con C Sharp, Windows Form, Arquitectura en capas y SQL Server. Para este tutorial solo será necesario la capa de presentación y acceso a datos, ya que la aplicación no tiene lógica de negocios, por lo tanto, no tendría sentido usar la capa de dominio o negocio.

Cabe mencionar, que este tutorial es muy diferente a insertar datos A tablas relacionadas, siendo específicos, insertar datos a tablas intermedias, un claro ejemplo y más común, la tabla detalle venta. Eso lo veremos en su determinado momento. Ahora empecemos con el tutorial de como insertar datos CON tablas relacionadas.

1. Crear la Base de Datos, Tablas relacionadas e Insertar Datos

  • Para ello, ejecutamos las siguientes instrucciones SQL.
-----------------------------------CREAR BASE DE DATOS-------------------------------
CREATE DATABASE PRACTICA_TABLAS
GO
USE PRACTICA_TABLAS
GO

-----------------------------------CREAR TABLAS--------------------------------------
CREATE TABLE CATEGORIAS(
IDCATEG INT IDENTITY (1,1) PRIMARY KEY,
CATEGORIA NVARCHAR (100)
)
GO

CREATE TABLE MARCAS(
IDMARCA INT IDENTITY (1,1) PRIMARY KEY,
MARCA NVARCHAR (100)
)
GO

CREATE TABLE PRODUCTOS(
IDPROD INT IDENTITY (1,1) PRIMARY KEY,
IDCATEGORIA INT,
IDMARCA INT, 
DESCRIPCION NVARCHAR(100),
PRECIO FLOAT

--RELACIONES 
CONSTRAINT RELACION_A_CATEGORIAS FOREIGN KEY (IDCATEGORIA) REFERENCES CATEGORIAS (IDCATEG),
CONSTRAINT RELACION_A_MARCAS FOREIGN KEY (IDMARCA) REFERENCES MARCAS(IDMARCA)
)
GO
-----------------------------------INSERCION DE DATOS-------------------------------
insert into CATEGORIAS values 
(''),
('Laptop'),
('Desktop'),
('Impresora'),
('Monitor'),
('Teclado'),
('Tarjeta'),
('Altavoz')
GO

insert into MARCAS values 
(''),
('HP'),
('LG'),
('Samsung'),
('Logitech'),
('Lenovo'),
('Asus'),
('Dell'),
('MSI'),
('Gygabyte'),
('Epson'),
('Nvidia')
GO

2. Crear Procedimientos almacenados (SP)

  • Una vez creado la base de datos y las tablas, creamos los procedimientos almacenados para mostrar e insertar datos. Esto es opcional, puedes ejecutar los comandos Transact-SQL directamente en la capa de acceso a datos.
-----------------------------------PROCEDIMIENTOS ALMACENADOS---------------------- 
-----LISTAR CATEGORIAS
create proc ListarCategorias 
as
select *from CATEGORIAS order by CATEGORIA asc
go

-----LISTAR MARCAS
create proc ListarMarcas
as
select *from MARCAS order by MARCA asc
go

-----AGREGAR PRODUCTO
create proc AgregarProducto
@idcategoria int,
@idmarca int,
@descrip nvarchar (100),
@prec float
as
insert into PRODUCTOS values (@idcategoria,@idmarca,@descrip,@prec)
go

-----LISTAR PRODUCTOS
create proc ListarProductos
as
select IDPROD AS ID, CATEGORIAS.CATEGORIA,MARCAS.MARCA,DESCRIPCION,PRECIO
 from PRODUCTOS 
INNER JOIN CATEGORIAS ON PRODUCTOS.IDCATEGORIA=CATEGORIAS.IDCATEG
INNER JOIN MARCAS ON PRODUCTOS.IDMARCA=MARCAS.IDMARCA
go

3. Crear Proyecto y Capas

  • Creamos un proyecto de aplicación de Windows Form, de nombre pondré: TABLAS_RELACIONADAS.
  • Creamos las capas de aplicación necesarios, en este caso la capa de acceso a datos y presentación. En esta ocasión crearé las capas en carpetas. Sin embargo recuerden que las capas se deben crear en proyectos (Aplicación y Biblioteca de Clases).

4. Codificar Capa de Acceso a Datos / Persistencia

Conexión a SQL Server

  • Creamos la clase conexión a SQL Server (ConexionBD.cs).
  • Importamos las librerías Data y Data.SqlClient.
  • Creamos la cadena de conexión y los métodos de abrir y cerrar conexión.
using System.Data;
using System.Data.SqlClient;

namespace TABLAS_RELACIONADAS.CAPADATOS
{
    class ConexionBD
    {
        static private string CadenaConexion = "Server=DESKTOP-4FVONF2\\SQLEXPRESS;DataBase=PRACTICA_TABLAS;Integrated Security=true";
        private SqlConnection Conexion= new SqlConnection(CadenaConexion);

        public SqlConnection AbrirConexion()
        {
            if (Conexion.State == ConnectionState.Closed)
                Conexion.Open();
            return Conexion;
        }

        public SqlConnection CerrarConexion()
        {
            if (Conexion.State == ConnectionState.Open)
                Conexion.Close();
            return Conexion;
        }
    }
}

Objeto de Acceso a Datos de Producto (DAO)

  • Creamos una clase para la entidad Producto (clsProductos).
  • Importamos las librerías Data y Data.SqlClient.
  • Instanciamos a la clase conexión.
  • Instanciamos a SQL Command para ejecutar los comandos sql y declaramos Sql Data Reader para leer filas.
  • Creamos los métodos para Listar los productos, marcas, categorías e insertar productos.
using System.Data;
using System.Data.SqlClient;

namespace TABLAS_RELACIONADAS.CAPADATOS
{
    class ClsProductos
    {
        private ConexionBD Conexion = new ConexionBD();
        private SqlCommand Comando = new SqlCommand();
        private SqlDataReader LeerFilas;

        public DataTable ListarCategorias()
        {
            DataTable Tabla = new DataTable();
            Comando.Connection = Conexion.AbrirConexion();
            Comando.CommandText = "ListarCategorias";
            Comando.CommandType = CommandType.StoredProcedure;
            LeerFilas = Comando.ExecuteReader();
            Tabla.Load(LeerFilas);
            LeerFilas.Close();
            Conexion.CerrarConexion();
            return Tabla;
        }
        public DataTable ListarMarcas()
        {
            DataTable Tabla = new DataTable();
            Comando.Connection = Conexion.AbrirConexion();
            Comando.CommandText = "ListarMarcas";
            Comando.CommandType = CommandType.StoredProcedure;
            LeerFilas = Comando.ExecuteReader();
            Tabla.Load(LeerFilas);
            LeerFilas.Close();
            Conexion.CerrarConexion();
            return Tabla;
        }
        public void InsertarProductos(int idCategoria, int idMarca, string descripcion, double precio)
        {
            Comando.Connection = Conexion.AbrirConexion();
            Comando.CommandText = "AgregarProducto";
            Comando.CommandType = CommandType.StoredProcedure;
            Comando.Parameters.AddWithValue("@idcategoria", idCategoria);
            Comando.Parameters.AddWithValue("@idmarca", idMarca);
            Comando.Parameters.AddWithValue("@descrip", descripcion);
            Comando.Parameters.AddWithValue("@prec", precio);
            Comando.ExecuteNonQuery();
            Comando.Parameters.Clear();
            Conexion.CerrarConexion();
        }
        public DataTable ListarProductos()
        {
            DataTable Tabla = new DataTable();
            Comando.Connection = Conexion.AbrirConexion();
            Comando.CommandText = "ListarProductos";
            Comando.CommandType = CommandType.StoredProcedure;
            LeerFilas = Comando.ExecuteReader();
            Tabla.Load(LeerFilas);
            LeerFilas.Close();
            Conexion.CerrarConexion();
            return Tabla;
        }
    }
}

5. Codificar Capa de Presentación / Interfaz Gráfica

  • Agregamos un nuevo formulario Windows Forms y diseñamos de la siguiente manera.
  • Ingresamos al código del formulario. (Doble Click en el formulario, se crea evento Load del formulario).
  • Referenciamos a la capa de acceso a datos y creamos lo siguientes métodos.
using TABLAS_RELACIONADAS.CAPADATOS;
  • Creamos los métodos para cargar los datos de marcas y categorías en los ComboBoxs. Como valor: ID de cada campo (ValueMember), y como dato mostrar: Nombre de marca o categoría (DisplayMember).
private void ListarCategorias() {
    ClsProductos objProd = new ClsProductos();
    CmbCategoria.DataSource = objProd.ListarCategorias();
    CmbCategoria.DisplayMember = "CATEGORIA";
    CmbCategoria.ValueMember = "IDCATEG";
}
private void ListarMarcas()
{
    ClsProductos objProd = new ClsProductos();
    CmbMarca.DataSource = objProd.ListarMarcas();
    CmbMarca.DisplayMember = "MARCA";
    CmbMarca.ValueMember = "IDMARCA";
}
  • Creamos un método para, cargar los datos de productos en el datagridview.
private void ListarProductos() {
    ClsProductos objprod = new ClsProductos();
    dataGridView1.DataSource = objprod.ListarProductos();
}
  • Invocamos los métodos anteriores desde evento Load del formulario.
private void PRODUCTOS_Load(object sender, EventArgs e)
{
    ListarCategorias();
    ListarMarcas();
    ListarProductos();
}
  • Finalmente, creamos el método para insertar los datos.
ClsProductos objproducto = new ClsProductos();
private void btnAgregar_Click(object sender, EventArgs e)
{
    objproducto.InsertarProductos(
        Convert.ToInt32(CmbCategoria.SelectedValue),
        Convert.ToInt32(CmbMarca.SelectedValue),
        txtDescripcion.Text,
        Convert.ToDouble(txtPrecio.Text)
        );
    MessageBox.Show("Se inserto correctamente");
    ListarProductos();
}

Eso es todo 🙂 , en el próximo tutorial realizaremos la opción de editar y eliminar datos.

Ver video tutorial

Descargas

Ver Parte 2: Editar y Eliminar Datos

1 comentario en «CRUD con Tablas Relacionadas Parte 1, Insertar, Mostrar Datos, C#, SQL, SP, Capas (ComboBox, Inner Join) Nivel Base»

  1. Pingback: CRUD con Tablas Relacionadas Parte 1, Insertar, Mostrar Datos, C#, SQL, Capas (ComboBox, Inner Join) – Tuts Ninja

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *