Insertar Registro a una BD desde un Formulario Web en C#

sábado, 10 de marzo de 2012

En este tutorial veremos como insertar un registro desde un formulario web en Asp.Net con C#.

Trabajaremos con una base de datos ejemplo que cree para este tutorial, la base de datos cuenta con una tabla llamada usuarios y contiene los campos cod_usuario (que es la llave primaria y es un campo auto incrementable), nombre, apellido, pais.
Ademas la base de datos cuenta con un procedimiento almacenado que utilizaremos para ingresar el registro
Descargar Base de Datos

Una vez que descargemos la base de datos la adjuntamos a nuestro SQL para continuar.

Lo primero que aremos es crear un nuevo sitio web vació as.pnet en visual estudio.

Proyecto asp.net

Una vez creado nuestro proyecto asp.net agregamos un webform el cual nos tiene que quedar con este diseño.

Diseño

Hecho esto nos vamos al código c# de nuestro formulario web y empezamos a programar nuestro formulario.

Lo primero que aremos sera añadir estas 2 referencias que nos sirven para trabajar con base de datos sql en asp.net
using System.Data.SqlClient;
using System.Data;


Ahora declararemos nuestra cadena de conexión a nivel de la clase con el fin de poder utilizarla en todos los eventos que programaremos.
//cadena de conexion la declaramos a nivel de la clase para utilizarla en todos los eventos.
SqlConnection cn = new SqlConnection("Data Source = .\\SQLEXPRESS; Initial Catalog = ejemplo; Integrated Security = True");

Ahora aremos un método donde cargaremos los datos al griedview de nuestra base de datos, el código va comentado para que entiendan todo.
public void cargardatos()
{
//hacemos la consulta a la base de datos
SqlCommand cmd = new SqlCommand("Select * from usuarios", cn);
//objeto adapter para hacer el enlace y llenado del dataset
SqlDataAdapter adapter = new SqlDataAdapter();
//asignamos la propiedad selectcommand al objeto command para que ejecute consulta
adapter.SelectCommand = cmd;
//abrimos la conexion
cn.Open();
//creamos objeto dataset
DataSet objdataset = new DataSet();
//llenamos el datable del dataset
//el metodo fill obtiene los datos recuperados del dataadapter y los coloca dentro del dataset
adapter.Fill(objdataset);
//cerramos conexion
cn.Close();
//enlazamos los datos al griedvied
GridView1.DataSource = objdataset;
GridView1.DataBind();
}

Ahora para que los datos que tenga la base de datos se carguen al momento de iniciar nuestro formulario web crearemos el método Load de nuestra webform y llamaremos al metodo que creamos anteriormente (el método Load sirve para cargar datos al momento que se inicializa el formulario)
protected void Page_Load(object sender, EventArgs e)
{
cargardatos();
}


Por ultimo aremos el evento click de nuestro botón para que cuando el usuario presione el botón insertar los datos se inserten en la base de datos y se muestren en el griedview, aquí es donde aremos uso del procedimiento almacenado insertar usuarios. nuevamente el código esta comentado cada linea para que comprendan.
protected void Button1_Click(object sender, EventArgs e)
{
//utilizamos el procedimiento alamacenado insertarusuarios
SqlCommand cmd = new SqlCommand("insertarusurios", cn);
//especificamos que el comando es un procedimiento almacenado
cmd.CommandType = CommandType.StoredProcedure;
//creamos los parametros que usaremos
cmd.Parameters.Add("@nombre", SqlDbType.VarChar);
cmd.Parameters.Add("@apellido", SqlDbType.VarChar);
cmd.Parameters.Add("@pais", SqlDbType.VarChar);
//asignamos el valor de los textbox a los parametros
cmd.Parameters["@nombre"].Value = TextBox1.Text;
cmd.Parameters["@apellido"].Value = TextBox2.Text;
cmd.Parameters["@pais"].Value = TextBox3.Text;
//abrimos conexion
cn.Open();
//ejecutamos la instruccion con ExcecuteNonQuerry indicando que no retorna registros.
cmd.ExecuteNonQuery();
Label1.Text = "Usuario ingresado...";
//cerramos conexion
cn.Close();
//cargamos los datos nuevamente
cargardatos();
//limpiamos los textbox
TextBox1.Text = "";
TextBox2.Text = "";
TextBox3.Text = "";

}


Para terminar les dejo el código completo así les tiene que quedar al final
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;

public partial class _Default : System.Web.UI.Page
{
//cadena de conexion la declaramos a nivel de la clase para utilizarla en todos los eventos
SqlConnection cn = new SqlConnection("Data Source = .\\SQLEXPRESS; Initial Catalog = ejemplo; Integrated Security = True");

public void cargardatos()
{
//hacemos la consulta a la base de datos
SqlCommand cmd = new SqlCommand("Select * from usuarios", cn);
//objeto adapter para hacer el enlace y llenado del dataset
SqlDataAdapter adapter = new SqlDataAdapter();
//asignamos la propiedad selectcommand al objeto command para que ejecute consulta
adapter.SelectCommand = cmd;
//abrimos la conexion
cn.Open();
//creamos objeto dataset
DataSet objdataset = new DataSet();
//llenamos el datable del dataset
//el metodo fill obtiene los datos recuperados del dataadapter y los coloca dentro del dataset
adapter.Fill(objdataset);
//cerramos conexion
cn.Close();
//enlazamos los datos al griedvied
GridView1.DataSource = objdataset;
GridView1.DataBind();
}
protected void Page_Load(object sender, EventArgs e)
{
cargardatos();
}

protected void Button1_Click(object sender, EventArgs e)
{
//utilizamos el procedimiento alamacenado insertarusuarios
SqlCommand cmd = new SqlCommand("insertarusurios", cn);
//especificamos que el comando es un procedimiento almacenado
cmd.CommandType = CommandType.StoredProcedure;
//creamos los parametros que usaremos
cmd.Parameters.Add("@nombre", SqlDbType.VarChar);
cmd.Parameters.Add("@apellido", SqlDbType.VarChar);
cmd.Parameters.Add("@pais", SqlDbType.VarChar);
//asignamos el valor de los textbox a los parametros
cmd.Parameters["@nombre"].Value = TextBox1.Text;
cmd.Parameters["@apellido"].Value = TextBox2.Text;
cmd.Parameters["@pais"].Value = TextBox3.Text;
//abrimos conexion
cn.Open();
//ejecutamos la instruccion con ExcecuteNonQuerry indicando que no retorna registros.
cmd.ExecuteNonQuery();
Label1.Text = "Usuario ingresado...";
//cerramos conexion
cn.Close();
//cargamos los datos nuevamente
cargardatos();
//limpiamos los textbox
TextBox1.Text = "";
TextBox2.Text = "";
TextBox3.Text = "";

}
}


Capturas de la aplicación corriendo

Diseño
Diseño

Les dejo el proyecto de la aplicación también para que lo descarguen y lo prueben con visual estudio

Descargar Proyecto

Saludos desde El Salvador...

20 comentarios:

Mon dijo...

Saludos... mira soy totalmente nuevo en esto del desarrollo de aplicaciones en ASP.NET y no me quedo muy claro lo que mencionas acerca de que una vez que descarguemos la BD - la adjuntamos a nuestro SQL para continuar-. Como hago esto te agradeceria bastante pudieras apoyarme con eso...

Mon dijo...

ah y respecto a procedimientos almacenados que guia me recomiendas para iniciarme en ese arte, se que son procedimientos que estan dentro de la base de datos que realizan consultas dentro de la misma pero que funcionan para practicamente casi cualquier lenguaje de programacion, pero pues no se como crearlos. gracias campeon!! :D

Cristian Torres dijo...

Con adjuntarla me refiero es que la agregues desde el magnament estudio de sql server la agregues desde el explorador de objetos ahi te aparece la opcion de adjuntar para que la bd se pueda usar

Cristian Torres dijo...

Pues acabo de crear un articulo sobre como hacerlo dale una leída y cualquier duda preguntas.
Como crear Procedimientos Almacenados en Sql Server

DiegoR dijo...

Hola Cristian,

Mil gracias por este post, muy bueno y me fué muy util, gracias por el tiempo dedicaco a compartir tu conocimiento.

Suerte...

Cristian Torres dijo...

De nada, y pues me alegro que te allá servido ya que ese es el fin de todos mis artículos este fue uno de los primeros que publique por eso podes ver que hice uso de Dataset lo cual no lo recomiendo es mejor usar datatable o datareader o mejor aun clases entidad pero que bueno que te sirvió.

Saludos.

Anónimo dijo...

podrias publicar para formularios simples, es decir no aplicaciones web sino de escritorio (desktop)

Cristian Torres dijo...

Hola amigo en el blog tengo bastantes ejemplos de aplicaciones windows tambien.

Saludos.

Anónimo dijo...

Podrías explicarme como capturar un campo fecha desde un TextBox, tengo mi webforms pero cuando hago el insert me da error String was not recognized as a valid DateTime.
En la pagina.aspx.cs lo tengo asi
cmd.Parameters.Add("@fecha", SqlDbType.DateTime);
y luego
cmd.Parameters.Add["@fecha"] = DateTime.ParseExact("TextBox4.Text","dd/mm/yyy",null); //aqui me da error

Cristian Torres dijo...

Porque no usas el calendar de ajax para capturar la fecha.
Calendar Demonstration

Como veras es mas practico para el usuario solo seleccionar la fecha y entonces para hacer el insert solo arias.

cmd.Parameters.Add("@fecha", Convert.ToDateTime(txtFechaNacimiento.Text));

Saludos.

Anónimo dijo...

Gracias Cristian,
Definitivamente es mucho mejor de la manera que tu me sugeriste y ademas es mas facil para el usuario.

Saludos cordiales,

Cristian Torres dijo...

Así es amigo siempre tenes que buscar facilitarles la informacion a los usuarios.

Saludos.

Laura Espinosa dijo...

//utilizamos el procedimiento alamacenado insertarusuarios

no entiendo esta parte de donde sacas este procedimiento o como se hace?

Cristian Torres dijo...

Hola Laura.

Es un procedimiento almacenado creado en la base de datos para insertar un registro. Si no quieres usar procedimientos almacenados arias la query a la bd para hacer el insert.

Aqui explico como crear procedimientos almacenados en sql server.
Como crear Procedimientos Almacenados en Sql Server

Saludos.

Rolando Fuentes dijo...

hola buenisimo el tutorial pero tengo un problema con la conexion, me tira un error en la parte en qe abre la conexion, quisas es por la cadena de conexion, o no se, me podrias ayudar con eso? saludos

Cristian Torres dijo...

Hola Rolando cual es la cadena de conexión que estas usando?

Rolando Fuentes dijo...

("Data Source=.\\SQLEXPRESS;AttachDbFilename=C:/Users/Rola/Documents/Visual Studio 2010/WebSites/WebSite1/App_Data/Database.mdf;Integrated Security=True;User Instance=True")

esa cadena de conexion tengo, el error me lo tira en cn.Open()

Cristian Torres dijo...

Tienes mal la cadena de conexión la pleca tiene que ser asi /.

Por la ruta que has puesto me imagino que la base de datos esta en la misma carpeta del proyecto, prueba asi.

@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True"

Saludos.

Anónimo dijo...

Hola Cristian
me podrías especificar como hacer la parte donde mandas llamar el procedimiento alamacenado insertarusuarios, pero utilizando la query a la bd para hacer el insert. porfis es que soy nuevo en esto.......

Cristian Torres dijo...

Hola.
Aqui en este articulo hago un insert a la bd usando la query directamente.
Comprobar si Existe Registro en BD C# - VB.Net

Analiza el metodo Insert().

Saludos.

Publicar un comentario en la entrada

Nota: solo los miembros de este blog pueden publicar comentarios.