User-Defined Table Types
En esta entrada vamos a usar un UDT para grabar y actualizar registros de una tabla en SQL SERVER 2008, esto me permitirá solamente enviar un parámetro a un store procedure de tipo UDT con todo los campos basado en una estructura que enviaremos desde C# o varios registros a la vez.
1-Veremos lo que necesitamos hacer en SQL SERVER, estos script debemos ejecutarlo y previamente debe tener al menos una base de datos ya creada.
--Creando la tabla en SQL SERVER
CREATE TABLE [datos](
[id] [numeric](18, 0) NOT NULL,
[nombre] [nvarchar](50) NULL,
[edad] [numeric](18, 0) NULL,
CONSTRAINT [PK_datos] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/*
Creando el tipo de datos UDF llamado typeDatos
*/
create type typeDatos as table
(
id numeric(18),
nombre nvarchar(50),
edad numeric(18,2)
)
go
/*
Creando el store procedure para grabar
*/
create procedure usp_grabar_datos
@datos typeDatos readonly
as
insert into datos
select * from @datos
go
/*
Creando el store procedure para actualizar
*/
create procedure usp_actualizar_datos
@datos typeDatos readonly
as
declare @id numeric,
@nombre nvarchar(20),
@edad numeric
select @id=id,@nombre=nombre,@edad=edad from @datos
update datos set
edad=@edad,
nombre=@nombre
where id=@id
go
/*
Este procedimiento en sumamente util ya que usted puede en su aplicacion web en el datatable tener registros nuevos y existentes y simplemente insertara los nuevos y actualizara los existentes.
*/
alter procedure usp_Insertar_Actualizar_Datos
@datos typeDatos readonly
as
--Actualiza los registros que ya existe
UPDATE datos
SET nombre = t.nombre,
edad=t.edad
FROM dbo.datos d
JOIN @datos t on t.id = d.id
--Inserta los registros que no estan en la tabla de SQL SERVER
INSERT INTO datos
SELECT *
FROM @datos t
WHERE t.id not in(SELECT id FROM dbo.datos)
go
2-Luego debemos crear una clase para crear nuestra conexion a la base de datos y dataset. la clase se llamara: clDatos.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
public static class clDatos
{
public static DataSet dt = new DataSet();
public static DataRow fila;
public static DataTable registro;
public static void iniciar()
{
registro = new DataTable("datos");
registro.Columns.Add("id", typeof(Int32));
registro.Columns.Add("nombre", typeof(string));
registro.Columns.Add("edad", typeof(Int32));
}
public static void agregar(Int32 id,string nombre, Int32 edad)
{
fila = registro.NewRow();
fila["id"] = id;
fila["nombre"] = nombre;
fila["edad"] = edad;
registro.Rows.Add(fila);
}
}
3-Luego de debemos crear una interface en .NET WEB, dentro de un formulario web en el div principal copiar este codigo:
debe crear tres textbox con los nombres de
txtID
txtNombre
txtEdad
4-Codigo que lleva la pagina en el archivo .cs:
SqlConnection cn;
DataTable registro=new DataTable();
protected void Page_Load(object sender, EventArgs e)
{
cn = new SqlConnection("Data Source=.;Initial Catalog=demo;Persist Security Info=True;User ID=sa;Password=1234");
if (!IsPostBack)
{
cn.Open();
clDatos.iniciar();
}
}
protected void btnActualizar_Click(object sender, EventArgs e)
{
cn.Open();
SqlCommand cmdGrabar = new SqlCommand("usp_actualizar_datos", cn);
cmdGrabar.CommandType = CommandType.StoredProcedure;
SqlParameter tvpParam = cmdGrabar.Parameters.AddWithValue("@datos", clDatos.registro);
tvpParam.SqlDbType = SqlDbType.Structured;
cmdGrabar.ExecuteNonQuery();
}
protected void btnAgregar_Click(object sender, EventArgs e)
{
clDatos.agregar(Convert.ToInt32(txtID.Text), txtNombre.Text, Convert.ToInt32(txtEdad.Text));
}
protected void btnGrabar_Click(object sender, EventArgs e)
{
cn.Open();
SqlCommand cmdGrabar = new SqlCommand("usp_grabar_datos", cn);
cmdGrabar.CommandType = CommandType.StoredProcedure;
SqlParameter tvpParam = cmdGrabar.Parameters.AddWithValue("@datos", clDatos.registro);
tvpParam.SqlDbType = SqlDbType.Structured;
cmdGrabar.ExecuteNonQuery();
}
No hay comentarios:
Publicar un comentario