miércoles, 26 de junio de 2013

ADO.NET PARTE I

Hola como están... Aquí les saluda Osman y bueno esta publicación va ser una de las primeras entradas en donde vamos a estar tratando ADO.NET, conversando con un amigo me decía que para la gente que inicia en este lindo mundo de la programación es muy importante acuñar bien estos termino... así que pensé, que mejor explicación que hacer algo practico y sencillo a como estamos acostumbrando trabajar.

Vamos a ver de forma sencilla que es ADO.NET: Esto no es mas que un conjunto de componentes (software) que se encuentra en el Framework .NET de Microsoft, estos componentes los vamos a usar para acceder y modificar datos en el Gestor de Bases de Datos (en nuestro caso Microsoft Sql Server)

ADO.NET prácticamente se divide en dos grupos de clases Data provider y los DataSet.

Data provider: Clases que nos proporcionas el acceso a la fuente de datos (Sql Sever, Sybase, Oracle, MySql, etc)

Las clase que vamos usar aquí son:

Connection: Proporciona una conexión usada para hacer un enlace con la fuente de datos.

Command: Usado para realizar alguna acción en la fuente de datos, como lectura, actualización, o borrado de datos (select, insert, update, delete).

Parameter: Describe un simple parámetro para un command. Parametro o variable que pasaremos a una select, insert, update, delete o procedimiento almacenado.

DataAdapter: Utilizado para transferir data entre una fuente de datos y un objeto DataSet en pocas palabras es un puente entre los datos y nuestra apliación.

DataReader: Esta clase la usaremos para procesar eficientemente una lista grande de resultados.

DataSet: conjunto de clases que describen, definen o representan una base de datos relacional en memoria.

Las clases que vamos usar aquí son:

DataSet: Representa una base de datos en memoria. Este puede contener ademas de las tablas la relación entre ellas.

DataTable: Representa una tabla.

DataColumn: Representa una columna de una tabla

DataRow: Representa una fila de una tabla.

Lo que vamos hacer en la practica es una pequeña aplicación donde utilicemos estas clases. Por ejemplo llenaremos un dataset utilizando un DataAdapter el cual tendrá definida una conexión y una instrucción (select, insert, update, delete) en su propiedades Connection y Command.

Ok. en esta entrada solo quería que tengamos esto claro (la aburrida teoría...)  -.- para que en la próxima entrada iniciemos con lo bueno...


Saludos y hasta la próxima

martes, 25 de junio de 2013

Consumir servicio web con Visual Studio 2012 y C#

Hola que tal, esta vez vamos a consumir el web service que creamos en la entrada anterior esto es muy sencillo para ello vamos a crear unas pantallas donde se puedan ingresar los datos de una persona (nombre y apellido) para utilizar los métodos que creamos en el servicio.
Bueno Iniciamos con la pantalla de recepción de información, muy sencilla la idea solo es consumir los métodos creados anteriormente y esta tiene que quedar más o menos así:


Abrimos nuestro Visual Studio

Creamos un nuevo sitio web

Elegimos un nombre para el sitio web (consumirservicio)

Luego que demos OK agregamos un nuevo elemento al proyecto

Dicho elemento de tipo formulario web al cual le daremos un nombre (consumo.aspx)

Damos click en Add y ahora vamos agregar una referencia de servicio a nuestro sitio. Nos vamos a al explorador de soluciones para ello.

La referencia esta direccionada a la aplicación que montamos en nuestro servidor local IIS

Click en OK  y veremos lo siguiente:

Click en OK y con ello nuestro servicio solo está esperando ser consumido POR nuestra aplicación :) ……..Una vez con esto el código para crear las pantallas deberá quedar así:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="consumo.aspx.cs" Inherits="consumo" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Consumo Web</title>
</head>
<script type="text/javascript">
function sinnombre() {
alert("Sin nombre");
}
function sinape() {
alert("Sin Apellido");
}
</script>
<body>
<form id="form1" runat="server">
<div>
<table>
<tr>
<td >
Consumiendo Servicio Web
</td>

<td>Datos de la persona</td>
</tr>
<tr>
<td>
<fieldset>
<legend>Insertar datos</legend>
<table>
<tr>
<td>Nombre:</td>
<td>
<asp:TextBox ID="txtnombre" runat="server"></asp:TextBox>
</td>
<td>apellido:</td>
<td>
<asp:TextBox ID="txtape" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
Activo
</td>
<td>
<asp:CheckBox ID="ckactivo" runat="server" Text="" />
</td>
<td colspan="2" style="text-align: right">
<asp:Button ID="Button2" runat="server" Text="Guardar" OnClick="Button2_Click" />
</td>
</tr>
</table>
</fieldset>
<br />
<br />
<fieldset>
<legend>Actualizar Datos</legend>
<table>
<tr>
<td>Nombre:</td>
<td>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</td>
<td>apellido:</td>
<td>
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
Activo
</td>
<td>
<asp:CheckBox ID="CheckBox1" runat="server" Text="" />
</td>
<td colspan="2" style="text-align: right">
<asp:Button ID="Button3" runat="server" Text="Guardar" OnClick="Button3_Click" />
</td>
</tr>
</table>
</fieldset>
</td>
<td>
<fieldset>
<legend>Visualizar datos</legend>
<asp:GridView ID="GridView1" runat="server" AutoGenerateSelectButton="true" OnSelectedIndexChanged="GridView1_SelectedIndexChanged">
<selectedrowstyle backcolor="LightCyan" forecolor="DarkBlue" font-bold="true"/>
</asp:GridView>
</fieldset>
</td>
</tr>
</table>
</div>
</form>
</body>
</html>

En la página para el código (code behind -- consumo.aspx.cs) vamos ir explicando parte por parte:
Lo primero debemos heredar la clase SoapClient ya que esta la usaremos para solicitar y responder al servicio web
ServiceReference1.Service1SoapClient servicioasp = new ServiceReference1.Service1SoapClient();
Luego declaramos una variables para manejo de errores
string error;
Con esto estamos listo para usar los métodos del servicio web, vamos a crear una función que muestre los datos la persona la cual llamaremos en el load de la página (esto es un ejemplo sencillo no estoy validando si es o no postback en el load) y esta información se la paremos a un grid.
protected void Page_Load(object sender, EventArgs e)
{
mostrardatos();
}
public void mostrardatos()
{
try
{
GridView1.DataSource = servicioasp.SelectRow();
GridView1.DataBind();
}
catch (Exception ex) {
error = ex.Message;
}
}
Muy fácil verdad… :)
Bueno para insertar cuando den click en el botón vamos a validar que no estén vacíos los textbox luego llamamos al método que hace en el insert en el web service, en esta función estamos llamando un javascript desde el código behind para mostrar un alerta…
protected void Button2_Click(object sender, EventArgs e)
{
bool w_activo = true;
if (ckactivo.Checked != true)
{
w_activo = false;
}
if (string.IsNullOrEmpty(txtnombre.Text.Trim()) == true)
{
ClientScript.RegisterStartupScript(this.GetType(), "sinnombre", "sinnombre();", true);
return;
}
if (string.IsNullOrEmpty(txtape.Text.Trim()) == true)
{
ClientScript.RegisterStartupScript(this.GetType(), "sinape", "sinape();", true);
return;
}
try
{
servicioasp.InsertRow(txtnombre.Text, txtape.Text, w_activo);
txtnombre.Text = "";
txtape.Text = "";
mostrardatos();
}
catch (Exception ex)
{
error = ex.Message;
}
}
Para la actualización hay que hacer lo siguiente en el grid activar que puedan seleccionar la fila para poder tomar el dato que están seleccionando y pasar esto a los textbox donde la información va hacer cambiada.
Activamos en el grid: AutoGenerateSelectButton="true"
Luego en el evento GridView1_SelectedIndexChanged tomamos los datos seleccionado, solo que hay que explicar algo en este asunto el web service nos regresa el nombre separado del apellido por do rayas (--) y en una sola cadena debemos separar esta información para ponerla en dos textbox diferente, esto es muy sencillo solo debemos saber la posición que ocupa la rayita y con la función substring extraer el nombre y luego el apellido, Comprediendo esto nos vamos al evento antes mecionado
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
//Variable que guardara la cadena que esta en el grid o fila seleccionada
string persona;
//Variable que guardara la fila seleccionada
GridViewRow row = GridView1.SelectedRow;
//Guardamos el texto donde esta la informacion de la persona
persona = row.Cells[1].Text;
//En el textbox 1 guardamos el nombre que va en la cadena desde el inicio hata la -
TextBox1.Text = persona.Substring(0,persona.IndexOf('-'));
//Variable que guardara la posicion de primera -
int i;
//Variable que guarda el tamaño de la cadena a extraer
int j;
//Posicion inicio del apellido
i = persona.IndexOf('-') + 2; //Sumo 2 posicones por que el nombre y el apellido estan separados por dos rayas (--)
//Tamaño del apellido
j = persona.Length - i;
//Guardamos en el textbox 2 el apellido
TextBox2.Text = persona.Substring(i,j);
}
Con esto la información del grid debe mostrarse en los textbox. Aquí hay un detalle el web service no nos regresa el id de la persona para poder hacer el update, así que tendremos que traerlo guardarlo en una variable de sesión y usar el id cuando le den click al botón de actulizar… Entonces el evento GridView1_SelectedIndexChanged no quedara así:
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
//Variable que guardara la cadena que esta en el grid o fila seleccionada
string persona;
//Variable que guardara la fila seleccionada
GridViewRow row = GridView1.SelectedRow;
//Guardamos el texto donde esta la informacion de la persona
persona = row.Cells[1].Text;
//En el textbox 1 guardamos el nombre que va en la cadena desde el inicio hata la -
TextBox1.Text = persona.Substring(0,persona.IndexOf('-'));
//Variable que guardara la posicion de primera -
int i;
//Variable que guarda el tamaño de la cadena a extraer
int j;
//Posicion inicio del apellido
i = persona.IndexOf('-') + 2; //Sumo 2 posicones por que el nombre y el apellido estan separados por dos rayas (--)
//Tamaño del apellido
j = persona.Length - i;
//Guardamos en el textbox 2 el apellido
TextBox2.Text = persona.Substring(i,j);
//Esto es por que en el web service no me regresa el id
SqlConnection conn = new SqlConnection(conexion());
SqlCommand cmd = new SqlCommand("select idpersona from persona where nombre = @nombre and apellido = @apellido", conn);
cmd.Parameters.Add("@nombre", SqlDbType.NVarChar, 50).Value = TextBox1.Text.Trim();
cmd.Parameters.Add("@apellido", SqlDbType.NVarChar, 50).Value = TextBox2.Text.Trim();
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataTable dt = new DataTable();
da.Fill(dt);
foreach (DataRow r in dt.Rows)
{
Session["id"] = r["idpersona"];
}
}
private string conexion()
{
string cadena = @"Data Source=.;Initial Catalog=BD;user id = USUARIO; password = CONTRASEÑA*";
return cadena;

}
También el web service no regresa el estado de la persona la cual podíamos traerlo con el id y pasarlo al checkbox pero para no hacer más grande el ejemplo lo dejaremos así…
Luego en el evento click de la acción actulizar validamos siempre que los campos no estén vacios y llamamos al método de actulizar del web service

protected void Button3_Click(object sender, EventArgs e)
{
bool w_activo = true;
if (ckactivo.Checked != true)
{
w_activo = false;
}
if (string.IsNullOrEmpty(TextBox1.Text.Trim()) == true)
{
ClientScript.RegisterStartupScript(this.GetType(), "sinnombre", "sinnombre();", true);
return;
}
if (string.IsNullOrEmpty(TextBox2.Text.Trim()) == true)
{
ClientScript.RegisterStartupScript(this.GetType(), "sinape", "sinape();", true);
return;
}
try
{
servicioasp.UpdateRow(TextBox1.Text.Trim(), TextBox2.Text.Trim(), w_activo,Convert.ToInt32(Session["id"]));
mostrardatos();
TextBox1.Text = "";
TextBox2.Text = "";
}
catch (Exception ex)
{
error = ex.Message;
}
}
Pueden observar que después del insert y update llamamos a la función mostrardatos() para actualizar los datos en el grid.
Ejecutamos nuestra aplicación y de entrada el grid tiene que ser llenado aquí ya consumimos el web service :) 
Y listo con esto terminamos el ejemplo de cómo consumir un web services … Saludos