martes, 8 de diciembre de 2009

Que es ADO.NET Entity Framework

2 comentarios:
Teoría básica:
ADO.NET Entity Framework se ha diseñado para admitir servicios y aplicaciones centradas en datos, y proporciona una plataforma para programación con datos que eleva el nivel de abstracción del nivel lógico relacional al nivel conceptual. Permitiendo a los programadores trabajar con datos en un nivel de abstracción superior, Entity Framework admite código que es independiente de cualquier motor de almacenamiento de datos o esquema relacional determinados.
A continuación veremos un ejemplo de por qué usarlo.
¿Por qué usarlo?
La programación orientada a objetos supone un desafío al interactuar con sistemas de almacenamiento de datos. Las teorías de normalización suelen dividir las tablas, lo que representa un problema usar una serie de código extra, para que los programadores cada vez que necesitamos alcanzar información de otra tabla. Miremos el siguiente ejemplo.




ejemplo.
En el ejemplo se muestra la tabla products y category para alcanzar estas tablas seria de las siguientes formas.

sql
SELECT Products.ProductName, Categories.CategoryID, Categories.CategoryName
FROM Categories INNER JOIN
Products ON Categories.CategoryID = Products.CategoryID
Note que aun no está el código para conectarse a la base de datos ni el DataAdapter y el DataSet.

linq
DataClassesDataContext db = new DataClassesDataContext();
var query = from p in db.Products
join c in db.Categories
on p.CategoryID equals c.CategoryID
select new { p.ProductName, c.CategoryID, c.CategoryName };
GridView1.DataSource = query;
GridView1.DataBind();


Con entities:
NorthwindModel.NorthwindEntities ne = new NorthwindModel.NorthwindEntities();
var products = from p in ne.Products.Include("Categories")
select new { p.ProductName, p.Categories.CategoryName };

GridView1.DataSource = products;
GridView1.DataBind();


Puede notar que es más fácil utilizar Entities cuando nuestra base de datos está normalizada, seguro ustedes han superado este problema simplemente creando una vista o un store procedure sin embargo quiero hacer notar que entities lo hace automáticamente.

Como inicio:
Agregue un nuevo elemento, se mostrara la pantalla siguiente:



Elija Ado .net Entity Data Model y siga el asistente, en el asistente elija las tablas que necesita ahorita seria Product y category. Al terminar se mostrara el siguiente modelo y ya puede usar el código superior.

Ver

jueves, 26 de noviembre de 2009

Sr. Leroy - Chiste

No hay comentarios.:
Dos sujetos entran arrastrando a un joven flaco y debilucho a un departamento obscuro, caliente y húmedo.
En el departamento se encontraba Big Leroy, un negro enorme, sudado, hediondo, con cara de gente mala, palillo en la boca y limpiándose las uñas con un cuchillo de carnicero.
Al llegar, uno de los hombres dice: Oye Big Leroy, el jefe ordenó que te cojas a este sujeto... dice, que es para que aprenda a no hacerle al valiente con la gente del barrio.
El debilucho grita desesperado e implora perdón, pero Leroy apenas asiente con la cabeza ignorando los lamentos del joven y dice:
Pueden dejarlo ahí, en ese rincón, que yo me encargo de ese hijo de puta dentro de un momento.
Cuando los dos hombres salen del departamento el muchacho dice:

_Sr. Leroy, por favor, no me haga eso, déjeme ir y le prometo que no le diré a nadie que usted me dejó ir sin castigo. Leroy le dice...'
_Cállate la boca y quédate quieto ahí'.
Al rato llegan los dos hombres arrastrando a otro individuo...

_Big Leroy, el jefe quiere que le cortes las dos piernas y le saques los ojos a este tipo para que aprenda a no llevarse el dinero del jefe.
Leroy les dice:...

_Déjenlo ahí, en ese rincón que pronto resuelvo ese asunto.
Poco tiempo después llegan los mismos hombres arrastrando a un tercer muchacho.
_Big Leroy, el jefe quiere que le cortes el pito a este tipo, para que aprenda a nunca mas meterse con la mujer del jefe, ah!, y dijo también que le cortes la lengua y todos los dedos para que no pueda volver a tocar a otra mujer en su vida.
Leroy, con voz grave dice:...

_Ponlo ahí en el rincón, junto a los otros dos hijos de puta esos y yo atiendo la orden del jefe pronto.
Cuando se retiran los dos hombres, el muchacho que había llegado primero le dice en voz baja a Leroy:

Sr. Leroy, con todo respeto, sólo para que usted no se vaya a confundir, yo soy al que hay que cogerse
Ver

martes, 24 de noviembre de 2009

Obtener el primer y último día de un mes en SQL Server

4 comentarios:
declare @d varchar(2),@m varchar(2),@a varchar(4), @FE varchar(50) , @FI varchar(50) , @FN varchar(50),@FcF varchar(50)
--//recupera el dia ctual
set @d=day(getdate())
--//recupera el mes actual
set @m=month(getdate())
--//recupera el año actual
set @a=year(getdate())
--//fecha dada por el sistema
set @FE=@d + '/' + @m + '/' + @a
--//Primer dia del Mes
set @FI='01' + '/' + @m + '/' + @a
--//Ultimo dia del mes
set @FN=dateadd( month,1,@FI) -1
--//Ultimo dia del mes en formato dd/mm/yyyy
set @FcF=cast(day(@FN)as varchar) + '/' + cast(month(@FN)as varchar) + '/' + cast(year(@FN)as varchar)

Print 'Primer dia del Mes==>>' + @FI
Print 'Ultimo dia del Mes==>>' + @FcF
Ver

martes, 17 de noviembre de 2009

Data Repeater Controls en ASP.NET

1 comentario:
El Repeater de ASP.NET es un control contenedor de base que le permite crear listas personalizadas de todos los datos disponibles en la página. Es un control muy útil, sobre todo porque la mayoría de las páginas ASP.NET que muestran datos necesidad de repetir el mismo tipo de datos una y otra vez, es mas rapido que un gridview y puede llegar hacer lo mismo, en algunos casos.
Ejemplo 1

Html

< asp:Repeater runat="server" >
< ItemTemplate >
< %# DataBinder.Eval(Container.DataItem, "orderid") % >
< hr >
< %# DataBinder.Eval(Container.DataItem, "orderdate") % >
< /ItemTemplate >
< SeparatorTemplate >
< br >
< /SeparatorTemplate >
< /asp:Repeater >

code

protected void Page_Load(object sender, EventArgs e)
{
SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM orders",
"server=(local);database=northwind;Integrated Security=SSPI");
DataTable table = new DataTable();
adapter.Fill(table);
Repeater1.DataSource = table;
Repeater1.DataBind();

}


Esto les mostrara ya la información de su tabla, pueden incorporar html con ItemTemplate eso me hace recordar al asp.

Partes del Repeater
< HeaderTemplate > -- se representan la primera y única vez dentro de la producción
< ItemTemplate > -- se repiten para cada registro
< FooterTemplate > -- hizo una vez en la salida
< AlternatingItemTemplate > -- elemento para describir la apariencia de las filas alternas de la producción. En el siguiente ejemplo cada otra fila en la tabla se mostrarán en un color gris claro:



Ejemplo:



< HeaderTemplate >
< table border="1" width="100%" >
< tr>
< th >codigo< /th >
< th >Empresa< /th >
< th >País< /th >
< th >Ciudad< /th >
< th >Direccion< /th >
< th >Codigo Postal< /th >
< /tr >
< /HeaderTemplate >

< ItemTemplate >
< tr>
< td>< %#Container.DataItem("customerid")% >< /td >
< td>< %#Container.DataItem("companyname")% >< /td >
< td>< %#Container.DataItem("country")% >< /td >
< td>< %#Container.DataItem("city")% >< /td >
< td>< %#Container.DataItem("address")% >< /td >
< td>< %#Container.DataItem("postalcode")% >< /td >
< /tr >
< /ItemTemplate >

< SeparatorTemplate >
< tr >
< td colspan="6" >< hr / >< /td >
< /tr >
< /SeparatorTemplate >


< FooterTemplate >
< /table >
< /FooterTemplate >

Ver

lunes, 9 de noviembre de 2009

Por que la frase de mi blog

No hay comentarios.:
Casi siempre escribo artículos o chistes, esta vez les quiero contar el por que del texto en la parte superior del blog, esta basado en la película La Familia Del Futuro, cuando vi esta película estaba pasando un momento complicado y me inspiro mucho.

Al final de la película sale una frase buena de Walt Disney que dice así:


“En este lugar perdemos demasiado tiempo mirando hacia atrás.
Camina hacia el futuro, abriendo nuevas puertas y probando cosas nuevas, se curioso... porque nuestra curiosidad siempre nos conduce por nuevos caminos.”

Espero que la película los inspire como me inspiro a mi a seguir intentado ser mejor cada día.

Video de la película:




Ver

viernes, 30 de octubre de 2009

backup log with truncate_only esta Obsoleto

6 comentarios:
si aun que usted no lo crea en Microsoft Sql server 2008 los sql siguiente:

backup log with truncate_only
backup log with no_log

YA NO FUNCIONAAAAAAAAAA osea que estan OBSOLETOS
Que Estrés tons se estaran preguntando seguramente como rayos bajo el tamaño de mi log.

Pues le tengo 2 cosas que informarle
1.) usted esta obsoleto
2.) si continua leyendo dejara de estarlo =)


bueno como lo hago ahora, facil, de echo hay varias formas de hacerlo
opcion 1 - hacer un shrink a toda la db, ojo tambien baja el log

USE [nortwind]
GO
DBCC SHRINKDATABASE(N'nortwind' )
GO


opcion 2 - si lo quieren hacer mas controlado a la antigua

primero trunquemos el log

USE [nortwind]
GO
DBCC SHRINKFILE (N'nortwind_log' , 0, TRUNCATEONLY)
GO


segundo y ultimo
bajemos el tamaño del log


USE [nortwind]
go
ALTER DATABASE nortwind
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 80 MB.
DBCC SHRINKFILE (nortwind_log, 80);
GO
-- Reset the database recovery model.
ALTER DATABASE nortwind
SET RECOVERY FULL;


Espero que les sirva.
Ver

miércoles, 28 de octubre de 2009

Encriptar el Web.Config

1 comentario:
El verdadero titulo de este post deberia ser encriptar una sección del web config, pero estoy seguro que lo que quieren es ocultar el es el connectionString.
Vamos a utilizar el proveedor de configuración protegida
RSA y la herramienta aspnet_regiis.exe para poder lograr la encriptación de secciones del Web.Config.

Es posible importar y exportar las claves RSA de un servidor a otro, esto nos ayudará a utilizar el mismo cifrado en varios servidores.

Para encriptar la sección connectionString del Web.Config vamos a realizar los siguientes pasos:

1. Vamos a crear un sitio llamado EncriptacionRSA

2. Vamos a agregar el siguiente código en la sección connectionString dentro del archivo Web.Config

< connectionStrings >
< add name="MyLocalSQLServer"
connectionString="Initial Catalog=northwind;
data source=localhost;user id=sa;password=password"
providerName="System.Data.SqlClient"/ >
< /connectionStrings >


3. Ahora vamos a la línea de comandos para ejecutar la siguiente instrucción:

%WinDir%\Microsoft.NET\Framework\\aspnet_regiis -pe "connectionStrings" -app "/EncriptacionRSA"

El comando anterior, con el modificador -app, asume que hay un directorio virtual IIS llamado MachineRSA. Si está utilizando el servidor Web de Visual Studio .NET 2005 en lugar de IIS, utilizaremos el modificador -pef, que nos permitirá especificar la ubicación física del directorio del Web.Config

%WinDir%\Microsoft.NET\Framework\\aspnet_regiis.exe -pef "connectionStrings" C:\Projects\EncriptacionRSA

Si el comando es ejecutado de forma correcta deberemos de obtener el siguiente resultado:

Encrypting configuration section...
Succeeded!

Las claves RSA se almacenan en la siguiente ruta:

\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys

Una vez que ejecutamos esto, en el archivo Web.Config tendremos el siguiente resultado:

< connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider" > < EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns="http://www.w3.org/2001/04/xmlenc#" >
< EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" / >
< KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#" >
< EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#" >
< EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" / >
< KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#" >
< KeyName >Rsa Key< /KeyName >
< /KeyInfo >
< CipherData >

< CipherValue>R7cyuRk+SXJoimz7wlOpJr/YLeADGnwJVcmElHbrG/B5dDTE4C9
rzSmmTsbJ9Xcl2oDQt1qYma9L7pzQsQQYqLrkajqJ4i6ZQH1cmiot8ja7Vh+yItes7TRU
1AoXN9T0mbX5H1Axm0O3X/285/MdXXTUlPkDMAZXmzNVeEJHSCE=
< /CipherValue >
< /CipherData >
< /EncryptedKey >
< /KeyInfo >
< CipherData >

< CipherValue>d2++QtjcVwIkJLsye+dNJbCveORxeWiVSJIbcQQqAFofhay1wMci8FFlb
QWttiRYFcvxrmVfNSxoZV8GjfPtppiodhOzQZ+0/QIFiU9Cifqh/T/7JyFkFSn13bTKjbYmHObKA
zZ+Eg6gCXBxsVErzH9GRphlsz5ru1BytFYxo/lUGRvZfpLHLYWRuFyLXnxNoAGfL1mpQM7M46x5Y
WRMsNsNEKTo/PU9/Jvnh/lT+GlcgCs2JRpyzSfKE7zSJH+TpIRtd86PwQ5HG3Pd2frYdYw0rmlml
I9D
< /CipherValue >
< /CipherData >
< /EncryptedData >
< /connectionStrings >

Ahora vamos a comprobar si el encriptación y desencriptación funciona correctamente, para esto vamos a nuestra página Default.aspx y vamos a agregar el siguiente código de la sección HTML

< %@ Page Language="C#" % >
< script runat="server" >
protected void Page_Load(object sender, EventArgs e) {
Response.Write("Clear text connection string is: " + ConfigurationManager.ConnectionStrings
["MyLocalSQLServer"].ConnectionString);
}
< /script >

< html >
< body/ >
< /html >

MyLocalSQLServer es la cadena de conexión que especificamos en el Web.Config

Por último para regresar la sección del configurationString a su estado original vamos a ocupar el siguiente comando:

%WinDir%\Microsoft.NET\Framework\\aspnet_regiis -pd "connectionStrings" -app "/EncriptacionRSA"

y para si ocupamos una ruta física ocupamos el siguiente comando:
%WinDir%\Microsoft.NET\Framework\\aspnet_regiis -pdf "connectionStrings" C:\Projects\EncriptacionRSA

Si el comando funciona correctamente obtendremos el siguiente resultado:

Decrypting configuration section...
Succeeded!
Ver

Chiste de los indios

No hay comentarios.:
Chistes:

Los indios
En pleno otoño, los indios de una reservación muy lejana le preguntan a su nuevo jefe si el próximo invierno será frío o templado. Ya que el jefe pertenece a una generación modera y jamás aprendió los secretos de sus ancestros, mira al cielo y no puede predecir qué va a suceder con el clima. Aun así, les advierte que recojan leña. Como es un hombre práctico, poco tiempo después llama por teléfono al servicio meteorológico nacional.
¿El próximo invierno será muy frió? – Pregunta.
– Es probable – le contestan.
El jefe vuelve con su pueblo y les dice que se ponga a juntar más leña.
Una semana después, llama de nuevo por teléfono.
– ¿Será un invierno muy frio? -- Vuelve a preguntar.
– Sí, será un invierno muy frio – le responden.
El jefe vuelve a ordenar a su gente recolectar toda la leña que puedan.
Dos semanas más tarde, el feje hace otra llamada telefónica:
¿Están seguros que el próximo invierno será muy frio?
– Completamente – le contestan. – va a ser uno de los inviernos más fríos que se hayan conocido.
– ¿y cómo están tan seguros? – indaga el jefe.
– ¡Porque los indios esta juntando leña como locos!

Esposos:
La esposa le pregunta a su esposo:
¿Te fijaste, cariño? Compré un nuevo cepillo para el inodoro.
– Si – responde el hombre –, pero me sigue gustando más el papel.

Fuente: Revista selecciones septiembre 2009
Ver

jueves, 15 de octubre de 2009

Totalizar en el pie de GridView ( totals GridView footer)

8 comentarios:
Seguramente han necesitado totalizar una columna de en un gridview.



lo primero es que tiene que hacer el llenado del grid:

Base de datos:

Nortwind

Librerias:

using System.Data;
using System.Data.SqlClient;

Para mostrar el pie de página, tiene que establecer el atributo de ShowFooter="True".

LLENADO:

string sql="SELECT OrderID, ProductID, UnitPrice, Quantity, UnitPrice * Quantity AS total";
sql += " FROM [Order Details]";
sql += " WHERE OrderID=10285";
SqlConnection cn = new SqlConnection(STRINGCN);
SqlDataAdapter da = new SqlDataAdapter(sql, cn);
DataSet ds=new DataSet();
da.Fill(ds, "Details");
GridView1.DataSource = ds.Tables["Details"];
GridView1.DataBind();

tenemos que dimencionar una variable para totalizar: decimal dTotal = 0;
ahora vamos a capturar el evento: RowDataBound

ejemplo completo:

decimal dTotal = 0;
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if(e.Row.RowType == DataControlRowType.DataRow)
{
dTotal += Convert.ToDecimal(DataBinder.Eval(e.Row.DataItem, "total"));
}
if (e.Row.RowType == DataControlRowType.Footer)
{
e.Row.Cells[3].Text = "Total:";
e.Row.Cells[4].Text = dTotal.ToString("c");
e.Row.Cells[4].HorizontalAlign = HorizontalAlign.Right;
e.Row.Font.Bold = true;
}
}
Ver

miércoles, 14 de octubre de 2009

GDI+ Drawing ASP NET Cuaros, circulos, graficas (pie,square,elipse)

1 comentario:
Seguramente mas de algun día tendran la necesidad de crear cuadros o graficas de pie en una pagina asp net que sea dinamica, bueno con la libreria GDI+ Drawing lo pueden lograr.

En este primer ejemplo vamos hacer un cuadro y una linea.

Lo primero es llamar las librerias siguiente:
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Text;

ahora en el evento load de su pagina ingrese el siguiente codigo:

protected void Page_Load(object sender, EventArgs e)
{
Bitmap objBitmap; //inicio del objeto
Graphics objGraphics;

objBitmap = new Bitmap(400, 440); // tamaño que ocupara en la pagina
objGraphics = Graphics.FromImage(objBitmap);
objGraphics.Clear(Color.White); // Color de fondo de la pantalla

Pen p = new Pen(Color.Yellow, 0); // color de la linea del circulo.

Rectangle rect = new Rectangle(0, 0, 100, 50); // creado el cuadro
objGraphics.DrawRectangle(p, rect); // enviando a pantalla el cuadro

objGraphics.DrawLine(p,0,0,100,100); // creando linea

//enviando a pantalla atraves de una imagen.
objBitmap.Save(Response.OutputStream, ImageFormat.Gif);
objBitmap.Save(Server.MapPath("x.jpg"), ImageFormat.Jpeg);
objBitmap.Dispose();
objGraphics.Dispose();

}

el resultado esto sera asi:


si quiere un elipse solo tiene que cambiar
objGraphics.DrawRectangle(p, rect);
por
objGraphics.DrawEllipse(p, rect);

y tendran un circulo al lugar de un cuadro
ahora que estan listo para un ejemplo de verdad voy a crear pie con letras y colores.
para probarlo solo copien el siguiente codigo en su evento load.
no olvide agregar las librerias:

using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Text;

//codigo del load

Bitmap objBitmap;
Graphics objGraphics;

objBitmap = new Bitmap(400, 440);
objGraphics = Graphics.FromImage(objBitmap);
objGraphics.Clear(Color.White);
Pen p = new Pen(Color.Yellow, 0);
Rectangle rect = new Rectangle(10, 10, 280, 280);
objGraphics.DrawEllipse(p, rect);

Brush b1 = new SolidBrush(Color.Red);
Brush b2 = new SolidBrush(Color.Green);
Brush b3 = new SolidBrush(Color.Blue);
objGraphics.FillPie(b1, rect, 0f, 60f);
objGraphics.FillPie(b2, rect, 60f, 150f);
objGraphics.FillPie(b3, rect, 210f, 150f);

FontFamily fontfml = new FontFamily(GenericFontFamilies.Serif);
Font font = new Font(fontfml, 16);
SolidBrush brush = new SolidBrush(Color.Blue);
objGraphics.DrawString("Mi Primer PIE =)", font, brush, 70, 300);
objBitmap.Save(Response.OutputStream, ImageFormat.Gif);
objBitmap.Save(Server.MapPath("x.jpg"), ImageFormat.Jpeg);
objBitmap.Dispose();
objGraphics.Dispose();


el resultado es así:



Bueno espero que les sirva de algo.

Este post es para mi amigo Fernando, espero que te ayude con tu clavo.
Ver

viernes, 9 de octubre de 2009

Formatos de tiempo usando la función ToString

No hay comentarios.:
Formatos de hora

Este post es un poco simple pero siempre les pueda ayudar en algo.

vamos a mostrar la forma de mostrar fechas.
Ejemplo

DateTime d = DateTime.Now;
Label1.Text = d.ToString("MM/dd/yyyy hh:mm tt");

Otras formas de utilizarlos.


























Format Style Output
hh:mm : 11:17
hh:mm ss : 11:17 36
hh:mm ss tt : 11:17 36 AM
HH:mm ss tt : 11:17 36 AM
HHmm : 1117
MM-dd-yyyy HH:mm ss tt : 10-09-2009 11:17 36 AM
MM-dd-yyyy hh:mm ss tt : 10-09-2009 11:17 36 AM
Ver

lunes, 28 de septiembre de 2009

El poderoso OnClientClick

2 comentarios:
Te has topado con que quieres hacer un ultimo aviso de si quiere borrar o no? y esto te representa mucho codigo, pues te tengo la solucion en una linea a través del evento OnClientClick.

Ejemplo.

evento en el boton
< asp:button id="btnClick" runat="server" OnClientClick="return confirm('Quiere destruir el mundo?');" text="Button">< /asp:button >



codigo aspnet
protected override void OnPreRender(EventArgs e)
{

btnClick.Attributes.Add("onclick", "return confirm('Quiere destruir el mundo?');");

}

Pueden hacer en el evento load

void Page_Load(object sender, EventArgs e)
{

btnClick.Attributes.Add("onclick", "return confirm('Quiere destruir el mundo?');");

}
Ver

miércoles, 16 de septiembre de 2009

Personalizar el control de errores ASPNET

3 comentarios:

Cuando hacemos una aplicacion aspnet por lo regular olvidamos manejar los errores y por lo general aparece una pantalla muy parecida a la que tienen a su mano izquierda.

Lo ideal es que no aparesca esta pantalla, manejar el error y llevar un estricto control de los mismos.

Personalización de la página de error

Para personalizar la página de error por defecto, tiene que cambiar la configuración de la aplicación en el web config.

Hay tres modos de error en el que una aplicación ASP.Net que puede trabajar:

Off Mode
On Mode
RemoteOnly Mode

El atributo de modo de error determina si o no un mensaje de error se muestra ASP.Net. De forma predeterminada, el valor de modo está Comentariado sin embargo funciona con la opcion "On Mode" y muestra la pantalla antes mencionada.

Off Mode
Cuando el atributo de error está en "Off", ASP.Net utiliza su página de error por defecto para los usuarios locales y remotos en caso de un error.

On Mode
En el caso de "On Mode" , ASP.Net definidos por el usuario utiliza la página de error personalizados en lugar de su página de error por defecto para los usuarios locales y remotos. Si una página de error personalizada no se especifica, ASP.Net muestra la página de error que describe cómo habilitar la visualización remota de errores.

RemoteOnly
ASP.Net página de error se muestra sólo a los usuarios locales. Peticiones remotas comprueba en primer lugar los ajustes de configuración de la página de error personalizado o, finalmente, mostrar un error de IIS.


Ahora que ya conocemos como funciona la teoria pasemos a la parte practica.

1.) Dirijase al web config y cambie las entradas de customErrors de tal manera que funcionar customerrors. Ejemplo.

Web.Config File
< ?xml version="1.0" encoding="utf-8" ? >
< configuration >
< system.web >
< customErrors defaultRedirect="error.htm" mode="On"/>
< /system.web >
< /configuration >

Como se muestra en el archivo de configuración, el atributo "defaultRedirect" se ha establecido por la pagina error.htm. La página de error puede ser una página web ASP.Net, esta puede ser una página ASP o una página HTML simple.

Ejemplo de la pagina que mostrara el error:
Error.htm

< html xmlns="http://www.w3.org/1999/xhtml" >
< head >
< title >< /title >
< /head >
< body >
Sentimos mucho las molestias causadas, estamos trabajando para servirle mejor...
< br >
< /body >
< /html >

Notificar al Administrador
Ya hemos mostrado una pagina mas bonita de errores ahora nos toca llenar
un control de los errores, por esa razon escribiremos entradas al Event Log del sistema operativo.

Para lograr este objetivo agregue o edite su global.asax en el evento Application_Error.
pero primero agregue unos usign en la parte superior del archivo y luego busque el evento Application_Error y agregue necesario aqui un ejemplo.

< %@ Import Namespace="System.Web" % >
< %@ Import Namespace="System.Web.SessionState" % >
< %@ Import Namespace="System.Diagnostics" % >
void Application_Error(object sender, EventArgs e)
{
string ErrorDescription = Server.GetLastError().ToString();
string EventLogName = "ErrorSample";
if ((!EventLog.SourceExists(EventLogName)))
{
EventLog.CreateEventSource(EventLogName, EventLogName);
}
EventLog Log = new EventLog();
Log.Source = EventLogName;
Log.WriteEntry(ErrorDescription, EventLogEntryType.Error);


}

En este mismo evento podria enviar un mail, ejemplo:

< %@ Import Namespace="System.Web" % >
< %@ Import Namespace="System.Web.SessionState" % >
< %@ Import Namespace="System.Web.Mail" % >


void Application_Error(object sender, EventArgs e)
{

MailMessage mail = new MailMessage();
string ErrorMessage = "The error description is as follows : " + Server.GetLastError().ToString;
mail.To = "administrator@domain.com";
mail.Subject = "Error in the Site";
mail.Priority = MailPriority.High;
mail.BodyFormat = MailFormat.Text;
mail.Body = ErrorMessage;
SmtpMail.Send(mail);

}

O puede unir ambos ejemplos, espero les sirva.
Ver

viernes, 11 de septiembre de 2009

Linq la evolución de ADO .net

2 comentarios:
Una de las grandes novedades de Visual Studio 2008 y de .NET Framework 3.5 es el Language Integrated Query (LINQ) que habilita la definición de consultas integradas en el lenguaje de programación y es una de las piedras angulares de las nuevas versiones de C# y VB. Precisamente. No es facil dejar atras nuestros Dataset y nuestros amigos DataAdapters pero es momento de continuar, un consejo para superar la perdida es que imaginen que adonet(dataset,dataadapter,connection) era su carro viejo que funciona y esta perferto sin embargo salio el nuevo de agencia y que esta mejor, corre mas rapido, es mas eficiente, mas bonito y no daña el ambiente.

asi que para ayudarlos a migrarse les doy unos ejemplos con connecion a bases de datos sql server.

Lo primero es la hacer la connecion para lograr esto agreguen un nuevo item en su proyecto y elijan linq.
ejemplo:



ahora ya agregado el dbml tiene que agregar las tablas del server explorer:


bueno ahora ha jugar:
hagamos queries:


Primero la consulta comun:

DataClassesDataContext db = new DataClassesDataContext();
var clientes = from c in db.Customers
select new {c.CustomerID, c.CompanyName, c.ContactName, c.Country,c.City };

como usar el resultado
usando Bind

GridView1.DataSource = clientes;
GridView1.DataBind();


o leerlo con un ciclo:

foreach (var customer in clientes )
{
Console.WriteLine("Customer {0}: {1}", customer.CustomerId, customer.CompanyName);
}


Like


para usar like tiene que hacer un using System.Data.Linq.SqlClient;

DataClassesDataContext db = new DataClassesDataContext();
var clientes = from c in db.Customers
where SqlMethods.Like(c.Country, "%" + TextBox1.Text + "%")
select new {c.CustomerID, c.CompanyName, c.ContactName, c.Country,c.City };


Concatenar dos campos

var query = from c in db.Customers
where c.customerid==txtcodito.text && c.country=="spain"
select new { c.Nombre, nombrecompleto = string.Format("{0} {1}", c.companyname,c.contactname) };

execute scalar ejemplo con function

string nombre=(from c in db.customers where p.customerid== txtusuario.text select c.companyname).Single();

string nombre=(from c in db.customers
 where p.customerid== txtusuario.text select c).Single().companyname;

Group by

var pais = from p in db.Customers
group p by new { p.Country } into r
select new { r.Key.Country };


var rows = from item in TablaEmpleado.AsEnumerable()
           group item by
                   new
                       {
                          empid = item["employeeid"].ToString(),
                          depto = item["DeptoId"].ToString()
                        }
           into g
              select new
                       {
                         EmpresaId = g.Key. empid,
                         depto = g.Key. depto,
                         total = g.Count())
                       };


 Sum en linq


System.Nullable totalFreight =
    (from ord in db.Orders
    select ord.Freight)
    .Sum();


System.Nullable totalUnitsOnOrder =
    (from prod in db.Products
    select (long)prod.UnitsOnOrder)
    .Sum();


in en linq

string[] countries = new string[] { "Guatemala", "USA", "Mexico" };
var customers =from c in context.Customers
where countries.Contains(c.Country)
select c;

comentario:
Eve para que mire que la tomo en cuenta.


Between
var query = from p in db.orders
where p.Fecha >= Convert.ToDateTime(TextBox1.Text) && p.Fecha <= Convert.ToDateTime(TextBox2.Text) select new { p.Fecha };

Distinct

var query = (from c in db.customers
       orderby c.country
select c.country).Distinct();


var query = (from c in db.customers
select c.country).Distinct().OrderByDescending(x=>x.country);


Join
var groupJoinQuery2 =
from category in categories
join prod in products on category.ID equals prod.CategoryID
orderby category.Name
select new
{
Category = category.Name,
Products = prod.Name
};




sub consulta


var groupJoinQuery2 =
from category in categories
join prod in products on category.ID equals prod.CategoryID into prodGroup
orderby category.Name
select new
{
Category = category.Name,
Products = from prod2 in prodGroup
orderby prod2.Name
select prod2
};


Left Outer Joins


var query = (from p in dc.GetTable()
join pa in dc.GetTable() on p.Id equals pa.PersonId into tempAddresses
from addresses in tempAddresses.DefaultIfEmpty()
select new { p.FirstName, p.LastName, addresses.State });

SQL:

SELECT [t0].[FirstName], [t0].[LastName], [t1].[State] AS [State]
FROM [dbo].[Person] AS [t0]
LEFT OUTER JOIN [dbo].[PersonAddress] AS [t1] ON [t0].[Id] = [t1].[PersonID]



mas ejemplos de join clic aquí

si son de las personas que usan Store Procedure
pues bien es mas facil =)

lo primero que tiene que hacer es bajar el sp de server explorar al contex del linq


codigo:
//Obtaining the data source

var dbNorthwind =new NorthwindDataContext() ;

// Create the query
var query = dbNorthwind.SalesByCategory("Beverages","1997");

// Execute the query
foreach (var c in query)
{
Console.WriteLine(c.ProductName + "," + c.TotalPurchase);
}

// si quiere el store procedure solo retorna un valor, esto lo usan para busquedas o totales.

var query = dbNorthwind.ObtenerCategoria(txtcodigo.text).Single();
return query.categoryname;

// otro ejemplo de llamar store procedure con linq
var contactNames =
from result in db.GetCustomersInCity("London")
select result.ContactName;


foreach (string contactName in contactNames)
{
Console.WriteLine(contactName) ;
}

Las transacciones tambien son soportadas en linq ejemplo:

using(TransactionScope ts = new TransactionScope())
{
db.ExecuteCommand("exec sp_DoSomethingCool");
db.SubmitChanges();
ts.Complete();
}

alternativa:

db.LocalTransaction = db.Connection.BeginTransaction();
{
db.SubmitChanges();
db.LocalTransaction.Commit();
db.AcceptChanges();
}
catch {
db.LocalTransaction.Abort();
throw;
}
finally {
db.LocalTransaction = null;
}


si quiere manejar la concurecnia en este punto, puede guiarse con el siguiente ejemplo:
db.SubmitChanges(ConflictMode.FailOnFirstConflict);
db.SubmitChanges(ConflictMode.ContinueOnConflict);




si quieren usar LINQ con Listas
var custOrders =
from c in db.Customers
join o in db.Orders on c.CustomerID equals o.CustomerID into orders
where c.CustomerID == "ALFKI"
select new {c.ContactName, orders};

var list = custOrders.ToList() ;

foreach (var listItem in list)
{
Console.WriteLine(listItem.ContactName + " has " + listItem.orders.Count() + " orders, which have been shipped to:") ;
foreach (Order order in listItem.orders)
{
Console.WriteLine(" Order shipped to - " + order.ShipCountry) ;
}
}



Listas genericas


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class MainClass {
public static void Main() {
List customers = GetCustomerList();
var waCustomers =
from c in customers
where c.Region == "R1"
select c;
foreach (var customer in waCustomers) {
Console.WriteLine("Customer {0}: {1}", customer.CustomerId, customer.CompanyName);
foreach (var order in customer.Orders) {
Console.WriteLine(" Order {0}: {1}", order.Id, order.OrderDate);
}
}
}
static List GetCustomerList() {
List empTree = new List();
empTree.Add(new Product { ProductName = "A", Category = "O", UnitPrice = 12, UnitsInStock = 5, Total = 36, OrderDate = new DateTime(2005, 1, 1), Id = 1 });
empTree.Add(new Product { ProductName = "B", Category = "O", UnitPrice = 2, UnitsInStock = 4, Total = 35, OrderDate = new DateTime(2005, 1, 1), Id = 1 });
empTree.Add(new Product { ProductName = "C", Category = "O", UnitPrice = 112, UnitsInStock = 3, Total = 34, OrderDate = new DateTime(2005, 1, 1), Id = 1 });
empTree.Add(new Product { ProductName = "D", Category = "O", UnitPrice = 112, UnitsInStock = 0, Total = 33, OrderDate = new DateTime(2005, 1, 1), Id = 1 });
empTree.Add(new Product { ProductName = "E", Category = "O", UnitPrice = 1112, UnitsInStock = 2, Total = 32, OrderDate = new DateTime(2005, 1, 1), Id = 1 });
empTree.Add(new Product { ProductName = "F", Category = "O", UnitPrice = 11112, UnitsInStock = 0, Total = 31, OrderDate = new DateTime(2005, 1, 1), Id = 1 });

List l = new List();
l.Add(new Customer { CompanyName = "A", Region = "R1", UnitsInStock = 1, Orders = empTree, CustomerId =0});
l.Add(new Customer { CompanyName = "B", Region = "R2", UnitsInStock = 2, Orders = empTree, CustomerId = 1 });
l.Add(new Customer { CompanyName = "C", Region = "R3", UnitsInStock = 3, Orders = empTree, CustomerId = 2 });
l.Add(new Customer { CompanyName = "D", Region = "R4", UnitsInStock = 4, Orders = empTree, CustomerId = 3 });
l.Add(new Customer { CompanyName = "E", Region = "R5", UnitsInStock = 5, Orders = empTree, CustomerId = 4 });
return l;
}
}

class Customer : IComparable {
public string CompanyName { get; set; }
public string Region { get; set; }
public List Orders { get; set; }
public int UnitsInStock { get; set; }
public int CustomerId { get; set; }

public override string ToString() {
return String.Format("Id: {0}, Name: {1}, Region: {3}", this.CustomerId, this.CompanyName, this.Region);
}
int IComparable.CompareTo(Customer other) {
if (other == null)
return 1;

if (this.CustomerId > other.CustomerId)
return 1;

if (this.CustomerId < other.CustomerId) return -1; return 0; } } class Product : IComparable {
public string ProductName { get; set; }
public string Category { get; set; }
public int UnitPrice { get; set; }
public int UnitsInStock { get; set; }
public int Total { get; set; }
public DateTime OrderDate { get; set; }
public int Id { get; set; }

public override string ToString() {
return String.Format("Id: {0}, Name: {1} , Category: {3}", this.Id, this.ProductName, this.Category);
}
int IComparable.CompareTo(Product other) {
if (other == null)
return 1;
if (this.Id > other.Id)
return 1;

if (this.Id < other.Id) return -1; return 0; } } http://www.java2s.com/Code/CSharp/LINQ/Useforeachlooptodealwiththeresultfromlinq.htm
Ver

viernes, 4 de septiembre de 2009

Pagina para probar Stored Procedures Con ASP.NET

1 comentario:
Si estás escribiendo aplicaciones de bases de datos SQL Server (Oracle o DB2), vas a gastar mucho tiempo de la construcción y pruebas de los procedimientos almacenados, en especial los procedimientos almacenados que retornan información a través de parámetros en lugar de conjuntos de filas. No importa lo mucho que pruebe ese tipo de procedimientos almacenados usando herramientas de base de tatos , siempre cuando se conecta desde su programa, no hace lo que usted desea.

También en el desarrollo de estos procedimientos almacenados utilizando las herramientas de bases de datos, es posible que se encuentre escribiendo un montón de código T-SQL para declarar los parámetros antes de la llamada y mostrar los resultados después. En lugar de escribir todo ese código, sería útil disponer de una utilidad que puede recopilar información acerca de un procedimiento almacenado, lo que le permite especificar los valores para cada parámetro y ejecutar el procedimiento almacenado sin tener que escribir ningún código.


En este artículo, usted aprenderá cómo extraer una lista de procedimientos almacenados de una base de datos, además de información acerca de los parámetros asociados con el procedimiento almacenado. Por último, verás cómo aprovechar esta información y utilizarla para llamar a un procedimiento almacenado.

precaución. Desde que el programa de la muestra permitirá a un usuario para ejecutar un procedimiento almacenado en ejecucion, puede ser un problema de seguridad grande. Por esta razón, el programa solicita al usuario información de base de datos de autenticación y no se basa en la información guardada en un archivo Web.config o incluida en el código. Sin embargo, debe extremar la precaución al usar este programa. En realidad no debería ser usado contra una base de datos de producción a menos que se puede garantizar que sólo los usuarios autorizados pueden ejecutarlo.

Obteniendo los procedimientos almacenados

Con el fin de ejecutar un procedimiento almacenado en la marcha, es necesario recoger una lista de procedimientos almacenados. Este programa utiliza el sistema de almacenado sp_stored_procedures procedimiento para recoger una lista de procedimientos almacenados que pueden ser ejecutadas por el usuario, utilizando la información de conexión especificado por el usuario. Luego se une a la lista a un control DropDownList para que el usuario puede elegir qué procedimiento almacenado para ejecutar (vea la Figura 1).



FIGURA 1: Después de recoger la información de conexión de los controles TextBox, al pulsar el botón Iniciar sesión que va a extraer el conjunto de procedimientos almacenados que el usuario puede ejecutar.

Al hacer clic en el botón Iniciar sesión y se genera el evento LoginButton_Click (vea la Figura 2). Esta rutina comienza por la construcción de un nuevo objeto SqlConnection utilizando la información de conexión proporcionada por el usuario en el formulario web. Entonces se crea un nuevo objeto SqlCommand con el objeto SqlConnection y sp_stored_procedures referencia al procedimiento almacenado. A continuación, un new SqlDataAdapter se crea con el objeto SqlCommand.

Sub LoginButton_Click(sender As Object, e As EventArgs)
Dim ds As New DataSetDim conn As New SqlConnection(_
"Data source=" & DatabaseServer.Text & _
";User id=" & Userid.text & _
";Password=" & Password.Text & _
";Initial catalog=" & Database.Text)

Dim cmd As New SqlCommand("sp_stored_procedures", conn)
Dim adpt As New SqlDataAdapter(cmd)
Try
Status.Text = ""
adpt.Fill(ds, "SPs")
SPs.DataSource = ds.Tables("SPs")
SPs.DataTextField = "PROCEDURE_NAME"
SPs.DataBind()
Catch ex as SqlException
Status.Text = ex.Message
End Try
End Sub

FIGURA 2: El evento LoginButton_Click se dispara cuando el usuario se conecta al servidor de base de datos para llenar un DropDownList con los nombres de los procedimientos almacenados, el usuario puede ejecutar.

En el cuerpo principal de la rutina, un intento comando se usa para atrapar cualquier error de base de datos. Cualquier mensaje de error se mostrará en el cuadro de texto de estado. Dentro de la Prueba declaración, el cuadro de texto es el primer Estado aclaró, y luego la SqlDataAdapter se utiliza para rellenar un objeto DataSet con los resultados de la sp_stored_procedures procedimiento almacenado. Por último, el objeto DataTable devuelto por el adaptador de datos está Unido(bound) a el control DropDownList( SP ).


Desplegando los parámetros
Una vez que la lista de procedimientos almacenados se recupera de la base de datos, el usuario puede seleccionar un nombre de procedimiento almacenado de la lista desplegable y haga clic en el botón Get parámetros para construir una cuadrícula de datos que contienen información sobre sus parámetros (vea la Figura 3).




FIGURA 3: Después de seleccionar un procedimiento almacenado de la lista desplegable, haga clic en el botón Get parámetros para recuperar información de formato y acerca de cada parámetro asociado con el procedimiento almacenado.

En lugar de utilizar las herramientas normales de edición DataGrid, este programa utiliza un modelo de columna para insertar un cuadro de texto para el valor de entrada de cada parámetro en la cuadrícula de datos (vea la Figura 4). El resto de las columnas también se definen explícitamente como BoundColumns para simplificar el proceso de enlace de datos.


< asp:DataGrid id="ParametersDataGrid" runat="server" AutoGenerateColumns="False" >
< Columns >
< asp:BoundColumn DataField="column_name" HeaderText="Name" >
< /asp:BoundColumn >
< asp:BoundColumn DataField="type_name" HeaderText="Type" >
< /asp:BoundColumn >
< asp:BoundColumn DataField="length" HeaderText="Length" >
< /asp:BoundColumn >
< asp:BoundColumn DataField="precision" HeaderText="Precision" >
< /asp:BoundColumn >
< asp:BoundColumn DataField="scale" HeaderText="Scale" >
< /asp:BoundColumn >
< asp:BoundColumn DataField="column_type" HeaderText="Column Type" >
< /asp:BoundColumn >
< asp:TemplateColumn HeaderText="Input Value" >
< ItemTemplate >
< asp:TextBox runat="server" >
< /asp:TextBox >
< /ItemTemplate >
< /asp:TemplateColumn >
< asp:BoundColumn HeaderText="Output Value" >
< /asp:BoundColumn >
< /Columns >
< /asp:DataGrid >
< /asp:DataGrid >

FIGURA 4: El control DataGrid especifica explícitamente cada una de las columnas que se muestran en la tabla de los parámetros del procedimiento almacenado.

Utilizando el código de base que se utilizó para recuperar la lista de procedimientos almacenados de la base de datos, el evento GetParametersButton_Click recupera la lista de los parámetros asociados con el procedimiento almacenado seleccionado de la base de datos usando el procedimiento almacenado sp_sproc_columns (vea la Figura 5). La principal diferencia en esta rutina es que Parameters.Add se utiliza para definir el parámetro @ procedure_name el objeto SqlCommand que contiene el procedimiento almacenado.

Sub GetParametersButton_Click(sender As Object, e As EventArgs)
Dim ds As New DataSet
Dim conn As New SqlConnection( _
"Data source=" & DatabaseServer.Text & _
";User id=" & Userid.text & _
";Password=" & Password.Text & _
";Initial catalog=" & Database.Text)
Dim cmd As New SqlCommand("sp_sproc_columns", conn)
Dim adpt As New SqlDataAdapter(cmd)
Try
Status.Text = ""
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@procedure_name", SqlDbType.NVarchar, 390).Value = _SPs.SelectedItem.Value
adpt.Fill(ds, "Parameters")
ParametersDataGrid.DataSource = ds.Tables("Parameters")
ParametersDataGrid.DataBind()
ResultsDataGrid.Visible = False
Catch ex as SqlException
Status.Text = ex.Message
End Try
End Sub

FIGURA 5: El evento carga GetParametersButton_Click la información sobre los parámetros de un procedimiento almacenado en la ParametersDataGrid.

Una vez que el método de adaptador de datos Fill ha poblado de un objeto DataSet, el objeto resultante tabla de datos está enlazado al control ParametersDataGrid, que muestra los parámetros para el usuario. Por último, el ResultsDataGrid está desactivada en la preparación para ejecutar el procedimiento almacenado seleccionado.

El sp_sproc_columns procedimiento almacenado contiene una gran cantidad de información, además de la información que aparece en pantalla. Por ejemplo, la columna NULLABLE indica si una columna puede contener valores NULL, la columna COLUMN_DEF contiene el valor predeterminado de la columna, y el ORDINAL_POSITION contiene la posición relativa de cada parámetro en el procedimiento almacenado.

Ejecutar el procedimiento almacenado
Al hacer clic en el botón Ejecutar consulta se ejecuta el código que aparece en la Figura 6. Después de definir un objeto de conexión utilizando la información del formulario Web, un objeto SqlCommand se crea una instancia con el objeto SqlConnection y el procedimiento almacenado seleccionado de la lista desplegable en el formulario web. Un objeto SqlDataAdapter también se crea, que se utiliza para recuperar todos los datos que el procedimiento almacenado puede devolver de la base de datos.

Sub ExecuteQueryButton_Click(sender As Object, e As EventArgs)
Dim ds As New DataSet
Dim conn As New SqlConnection( _
"Data source=" & DatabaseServer.Text & _
";User id=" & Userid.text & _
";Password=" & Password.Text & _
";Initial catalog=" & Database.Text)
Dim cmd As New SqlCommand(SPs.SelectedItem.Value, conn)
Dim adpt As New SqlDataAdapter(cmd)
Try
Status.Text = ""
cmd.CommandType = CommandType.StoredProcedure
AddParameters(cmd)
adpt.Fill(ds, "Results")
UpdateParameters(cmd)
ResultsDataGrid.DataSource = ds.Tables("Results")
ResultsDataGrid.DataBind()
ResultsDataGrid.Visible = True
Catch ex as SqlException
Status.Text = ex.Message
End Try

FIGURA 6: Al hacer clic en el botón Ejecutar consulta se ejecuta el procedimiento almacenado seleccionado desde el formulario web.

Utilizando el objeto de comando de reciente creación, el CommandType se establece en StoredProcedure y luego la rutina de AddParameters está llamado a crear la colección de SqlParameters para el objeto SqlCommand. El SqlDataAdapter ejecuta la consulta y almacena los datos devueltos en un objeto DataSet. Las copias subrutina UpdateParameters los valores de los parámetros del procedimiento almacenado en el formulario web. Luego objeto DataTable que contiene los datos devueltos se une a la ResultsDataGrid en el formulario web. Si no se devuelve ningún registro, el control DataGrid no se mostrará.

Agregando los parámetros
El verdadero truco para hacer que este programa de trabajo es la rutina AddParameters muestra en la Figura 7. Esta rutina se recorre la colección de filas en el DataGrid. Una instrucción Select Case examina la información de tipo de datos contenidos en la segunda columna de la cuadrícula de datos y elige la declaración apropiada para agregar el parámetro a la colección SqlParameters.

Sub AddParameters(cmd As SqlCommand)

Dim di As DataGridItem
For Each di in Parameters
DataGrid.Items
If CType(di.Controls(5), TableCell).Text <> "5" Then
Select Case CType(di.Controls(1), TableCell).Text.ToLower

case "int"

cmd.Parameters.Add(CType(di.Controls(0), TableCell).Text, SqlDBType.Int).Value = _
CInt(CType(di.Controls(6).Controls(1), TextBox).Text)

case "char"

cmd.Parameters.Add(CType(di.Controls(0), TableCell).Text, SqlDBType.Char, CInt(CType(di.Controls(2), TableCell).Text)).Value = CType(di.Controls(6).Controls(1), TextBox).Text

case "datetime"

cmd.Parameters.Add(CType(di.Controls(0), TableCell).Text, SqlDBType.Datetime).Value = CDate(CType(di.Controls(6).Controls(1), TextBox).Text)


case "varchar"

cmd.Parameters.Add(CType(di.Controls(0), TableCell).Text, SqlDBType.VarChar, _
CInt(CType(di.Controls(2), TableCell).Text)).Value = _
CType(di.Controls(6).Controls(1), TextBox).Text

End Select
End If

If CType(di.Controls(5), TableCell).Text = "1" Then
cmd.Parameters(CType(di.Controls(0), TableCell).Text).Direction = _ParameterDirection.InputOutput

End If
Next di
End Sub

Agregar parámetros FIGURA 7: a la colección SqlParameters consiste en determinar el tipo de datos asociados.

Tenga en cuenta que el parámetro @ RETURN_VALUE se omite. Los valores que devuelve una COLUMN_TYPE de 5, que se almacena en la sexta columna del DataGrid.

Sólo dos tipos se muestran en la Figura 7 para mantener la lista corta, pero estos dos tipos de ilustrar el enfoque básico de agregar el parámetro. El nombre del parámetro se almacena siempre en la primera columna del DataGrid. La función CType arroja el valor devuelto por la colección de controles a un TableCell, y luego el valor real de la célula puede ser extraído de la propiedad Text. El valor del parámetro se puede convertir en el control TextBox al valor entero asociado con el parámetro.

El tipo de datos Varchar ilustra cómo la información adicional sobre el tipo de datos, tales como la longitud, se extrae de la información almacenada en el DataGrid. Otros tipos de datos se manejan de la misma manera.

Después de la instrucción Select Case agrega el parámetro a la colección, la sexta columna del DataGrid se revisa para ver si la propiedad de dirección se debe establecer en InputOutput para el parámetro. Un valor de 2 significa que el parámetro se puede devolver un valor desde el procedimiento almacenado, mientras que un valor de 1 significa que el parámetro es un parámetro de entrada y un valor de 5 indica que el parámetro contiene el valor de retorno para el procedimiento almacenado.

Actualización de Valores de los parámetros
La rutina UpdateParameters contiene un único caso de loop que explora a través de las filas de la cuadrícula de datos y actualiza el valor en la última columna de la cuadrícula de datos utilizando la información de los parámetros contemplados en la primera columna. Tenga en cuenta que desde el retorno no es un parámetro de valor real, su valor no se copia en el DataGrid.

Sub UpdateParameters(cmd As SqlCommand)

Dim di As DataGridItem

For each di in ParametersDataGrid.Items
If CType(di.Controls(5), TableCell).Text <> "5" Then
CType(di.Controls(7), TableCell).Text = cmd.Parameters(CType(di.Controls(0), TableCell).Text).Value.ToString

End If
Next di
End Sub

Después de introducir un valor CustomerID válido y haga clic en el botón Ejecutar consulta, los parámetros de actualización DataGrid se muestra en la Figura 8. Si el procedimiento almacenado devuelve un conjunto de filas, el ResultsDataGrid que contiene el conjunto de filas que aparecen debajo de los parámetros de DataGrid.

Ver

miércoles, 2 de septiembre de 2009

Limpiar Campo con Java Script

No hay comentarios.:
Scrip: Limpiart campo con un Script

Descripción: Este script borra un cuadro de texto cuando se hace clic sobre el.

Copia el siguiente código en su < HEAD > < / HEAD >.
< script language="Javascript" >
< !--
function doClear(theText) {
if (theText.value == theText.defaultValue) {
theText.value = ""
}
}
//-- >
< /script >

Copia el código siguiente entre las < BODY > < / BODY > de su página HTML

< form >
< input type="text" size=15 value="Enter name" onFocus="doClear(this)" >
< /form >

si quieren que se borre cuando empiezan a escribir usen: onkeypress="doClear(this)"

Como ya se que este les sirvio les dejo otro script clasico
como salir de un Frameset

solo ponga esto en medio de su < header >

< script language="javascript" >< !--
if (self.location.href != top.window.location.href)
{ top.window.location.href = self.location.href }
//-- >
< /script >

Si quieren Cerrar la ventana, por medio de un link.

< a href="javascript:self.close()" >
Cerrar ventana
< /a >

ejemplo de como funciona:

Cerrar ventana


sin embargo es posible que esto no funciona si tenes frameset alli tiene que agregar lo siguiente:
< script type="text/javascript" >
< !--
document.write('Cerrar Ventana');
document.links[document.links.length - 1].onclick = function() { top.close(); return false };
// -- >
< /scrip t>
Ver

martes, 1 de septiembre de 2009

Lamborghini Gallardo Superleggera VS Ducati 1098

No hay comentarios.:
La pregunta de siempre es que es mas rapido una moto o un carro, pues en este video compite un Lamborghini Gallardo Superleggera Versus una Moto Ducati 1098.

Ver

Trabajando con temas en ASP.NET

1 comentario:
Introducción
En este artículo describe cómo trabajar con la carpeta App_Themes. Carpeta App_Themes ha sido introducido desde ASP.NET 2.0 y es generalmente es de baja prioridad, a pesar de que juega un papel muy importante en el desarrollo web. Sin embargo, hay muchas paginas de interés relacionados con App_Themes que cada desarrollador debe saber. Estoy tratando de cubrir algunos de ellos. Por favor, siéntase libre de sugerir algo que no he cubrir en este artículo.

¿Cómo definir un tema?
Para definir un tema, debe hacer clic derecho del proyecto Web Project > Add ASP.NET Folder >Theme. Esto por defecto crear una nueva carpeta llamada App_Themes> Theme1. Puede cambiar el nombre de la carpeta Theme1 pero no la carpeta App_Themes. El nombre de la carpeta en la carpeta App_Themes será considerado como el nombre del tema y todos los archivos .css and .skin deben estar alli. Se Puede crear todos los temas que desee en la carpeta App_Themes.

Un tema puede tener más de un archivo .css y/o .skin

¿Qué es el archivo. Css?
Un archivo .CSS es Cascading Style Sheet que contiene el estilo, el comportamiento de una página html y sus elementos. Estos estilos están escritos en el archivo. Los Css son como un bloque de código y se les conoce como clase css. Esto en términos generales puede contener tres tipos de clases.

1.) Para un elemento en particular - esto define el estilo de cualquier elemento HTML y es nombrado como el nombre de la etiqueta HTML como p, tabla, tr, etc estilo siguiente se aplicará a todos tabla de la página.




table
{
border-collapse:collapse;
border:1px solid #c0c0c0;
}


2.) Para cualquier elemento HTML - define el estilo que pueden aplicarse en todos los elementos HTML.
Esto comienza con un (punto) . y seguido por el nombre de la clase CSS.




.ChangeBackground
{
background-color:#c9c9c9;
}


Atravez de la clase del CSS se puede especificar en cualquier elemento HTML.
Por ejemplo

En la etiqueta HTML:
< span class="ChangeBackground" > Mi texto < / span >
En ASP.NET Control:
< asp:Label ID="lblMessage" runat="server" CssClass="ChangeBackground" / >

3. para un determinado identificador - esto define el estilo de un elemento HTML cuyo ID es específico. Esto empieza con el # seguido por el nombre de la clase CSS.




#divMain
{
width:100%;
border:1px solid #cccccc;
}


La clase CSS se llevará a cabo con el elemento HTML cuyo ID es "divMain".
Este es un ejemplo


¿Qué es el archivo .skin?
Un archivo .skin es un nuevo tipo introducido en ASP.NET 2.0, este puede contener estilo Informacíon de cualquier control de servidor asp.net. Estas informaciones están escritas en este archivo como si están escritas página asp.net pero la propiedad ID no se especifica. por ejemplo,




< asp:Label runat="server" Font-Names="Courier" / >
< asp:Label SkinID="LabelMessage" runat="server" ForeColor="Green" BackColor="Yellow" / >
< asp:Label SkinID="LabelError" runat="server" ForeColor="Red" BackColor="Yellow" / >


Observe que en el código anterior no he speicified el ID del control.

Si usted ha utilizado el tema skin en su proyecto, la 1ra. línea define el estilo de todos los controles Label que se utilizarán en la página ASPX. La 2da. línea define el estilo de sólo los controles de etiqueta cuyo SkinID se especifica como LabelMessage. De esta manera usted tiene la libertad de colocar el número de controles de etiqueta en el archivo. Archivos de la skin con SkinID diferentes para los diferentes tipos de uso. (Como se puede definir un skin para el control Label para mostrar el mensaje de éxito y otro de la skin para mostrar el mensaje de error en la página.

Si desea que el comportamiento exacto del control Label es como se ha definido para SkinID "LabelMessage", debe utilizar el valor SkinID del control Label en el aspx como "LabelMessage".

El comportamiento del control Label en el aspx variará en función de si ha especificado el SkinID del control Label o no, o se ha espesificado en el CssClass o no.

No hay limitación de número de archivos Css y Skin que puede crear en un tema, pero se sugiere limitar el número para facilitar el mantenimiento y seguimiento.

Cómo utilizar el tema
Una vez que haya definido un tema para el proyecto asp.net, se puede utilizar de dos maneras diferentes.

1.Predeterminadamente en la página. Aspx
Se puede definir el nombre del tema que desee utilizar en las directivas de la página aspx (No se puede definir en la página principal). Como a continuación:





< %@ Page Theme="Theme1" Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" % >



O en el WEB Config para todas las paginas.




< configuration>
< system.web >
< pages theme="ThemeName" / >
< /system.web >
< /configuration >




Documentación tecnica:
http://msdn.microsoft.com/en-us/library/0yy5hxdk.aspx

Tenga en cuenta que Theme1 es el nombre de la carpeta dentro de la carpeta App_Themes y se refiere como el nombre del tema.



2.) Una vez que haya utilizado el tema en su página aspx o web config , la página está lista para usar todas los skins definidos y todas las clases definidas en el CSS. Archivos CSS. También puede obtener IntelliSense en el IDE de Visual Studio como este.

IntelliSense para el archivo Skin.


IntelliSense para el archivo CSS.



Para mas documentación:
http://www.dotnetfunda.com/articles/article14.aspx
Ver

martes, 25 de agosto de 2009

Usando Forms-based authentication con Active Directory

2 comentarios:
Usando Forms-based authentication con Active Directory

La autenticación de Forms es un sistema en el que las solicitudes no autenticadas se redirigen a un formulario web donde los usuarios están obligados a proporcionar sus credenciales.


Después de la presentación de la forma, y de ser adecuadamente verificada por su solicitud, un ticket de autorización es expedido por la aplicación Web, en la forma de una cookie. Esta cookie contiene las credenciales de autorización del usuario o una clave para readquirir la identidad del usuario (por lo tanto hacer de la identidad persistente del usuario). En esencia, la autenticación de formularios es un medio para el llenado de la aplicación Web con una fina capa de seguridad, que le permite tener su propia interfaz de inicio de sesión personalizado y funcionalidad de verificación.

Active Directory

Active Directory es un elemento esencial e inseparable de la arquitectura de la red de Windows que permite a las organizaciones compartir y gestionar de manera eficiente la información sobre los recursos de red y los usuarios. Básicamente se trata de un único punto de gestión para Windows basado en cuentas de usuarios, clientes y aplicaciones. También ayuda a las organizaciones a integrar la no aplicación de Windows con aplicaciones basadas en Windows y dispositivos, lo que consolida los directorios y facilitar la gestión de todo el sistema operativo de red. Las organizaciones también utilizan Active Directory para ampliar los sistemas de forma segura a Internet, al obligar a sus usuarios de la aplicación Web para autenticar contra su único punto de Active Directory.

Requisitos

Microsoft Windows
Microsoft ® Visual Studio. NET
Conocimiento de Microsoft Visual C # ™

Antes de empezar

En este artículo voy a mostrar cómo implementar la autenticación de formularios mediante las credenciales de Active Directory. Los formularios de autenticación de ASP.NET permite a los usuarios escriben sus credenciales (nombre de usuario y contraseña) en un formulario web para identificarse. La aplicación Web recibe la credencial, y se puede autenticar al usuario verificar su nombre de usuario y contraseña en un conjunto de datos disponibles. En este artículo se describe cómo autenticar a los usuarios de Microsoft ® Active Directory ® utilizando el protocolo LDAP (Protocolo ligero de acceso a datos). También se describe cómo almacenar esa información en un objeto GenericPrincipal y cómo almacenarlo en la propiedad HttpContext.Current.User que sigue a la petición de lanzar la aplicación Web ASP.NET.

Crear la página de inicio de sesión

Lo primero que tenemos que hacer es crear una nueva solución en Visual Studio 2005. Y añadir un nuevo sitio web. El sitio web debe tener una página de acceso simple, como la que muestran en la imagen siguiente. El objetivo de esta página es como cada página de inicio de sesión, para validar el nombre de usuario y contraseña en un dominio, la diferencia es que el proceso de validación validará en Active Directory.




En el evento de load de la página de acceso puede agregar el siguiente código para mostrar el dominio de la identidad y nombre de usuario asociado con la solicitud Web actual, esto con la finalidad de ayudar al usuario.



if(!Page.IsPostback())
{
string domainUser = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
string[] paramsLogin = domainUser.Split('\\');
txtUser.Text = paramsLogin[1].ToString();
txtDomain.Text = paramsLogin[0].ToString();
}

Configuración de la aplicación

Ahora tenemos que configurar la aplicación para que admite la autenticación de formularios. Usted puede hacer esto a través del archivo Web.config. Tienes que cambiar el modo de autenticación en el web.config y agregue un elemento secundario para configurar la página de acceso, el tiempo de espera de sesión y el cookie que contiene la información de autenticación.

Además, debe agregar la etiqueta para permitir que sólo los usuarios autenticados, tienen acceso a la aplicación. Si el proceso de inicio de sesión no se realizó correctamente, el usuario será redirigido a la página de inicio de sesión.
Para los que van a virtual de la aplicación de directorio en Propiedades y, a continuación, haga clic en la pestaña de seguridad en el acceso anónimo y el grupo de control de autenticación y desactive la casilla Acceso anónimo.

Después de que se necesita una pequeña modificación en el web.config. Usted tendrá que agregar un elemento debajo del elemento en Web.config y establecer el atributo impersonate en true. Esto hace que ASP.NET para suplantar la cuenta anónima especificada anteriormente.

Así que el archivo de configuración que se parece a éste:

< authentication mode="Forms" >
< forms loginUrl="logon.aspx" name="adAuthCookie" timeout="60" path="/" / >
< /authentication >

< authorization >
< deny users="?" / >
< allow users="*" / >
< /authorization >

< identity impersonate="true" / >

Como resultado de esta configuración, cada solicitud dirigida a la aplicación se ejecutará en el contexto de cuenta configurada anónimos de seguridad. El usuario deberá proporcionar credenciales a través del formulario Web para autenticarse en Active Directory, pero la cuenta que se utilizarán para tener acceso a Active Directory será la cuenta configurada de forma anónima

Implementando la validación en active directory

Llego el momento para escribir el código de autenticación del Active Directory. Va a crear una nueva clase que proporcionará un método que recibe un nombre de dominio, nombre de usuario y la contraseña como parámetro y devuelve un valor booleano que indica si existe un registro coincidente en Active Directory.

Vamos crear una Libreria de clases con una clase que implementa un método de autenticación contra AD. Usted tendrá que agregar una referencia al Asembly System.DirectoryServices.dll. Esto proporciona acceso al espacio de nombres System.DirectoryServices que contiene tipos administrados como ayuda en la consulta y el tratamiento en Active Directory.
La conexión a Active Directory es a través de LDAP. Usted tiene que especificar la ruta de conexión. Para el proceso de búsqueda de AD tendrá un atributo de filtro.



Inicialmente, el método intenta conectar con Active Directory utilizando las credenciales proporcionadas. EL método utiliza la clase administrada DirectorySearcher para buscar el objeto de usuario especificado.
Código de la clase:

using System.Text;
using System.Collections;
using System.DirectoryServices;

private string _path;
private string _filterAttribute;

public Class LdapAuthentication
{

public LdapAuthentication(string path)
{
_path = path;
}

public bool IsAuthenticated(string domain, string username, string pwd)
{
string domainAndUsername = domain + @"\" + username;
DirectoryEntry entry = new DirectoryEntry( _path,
domainAndUsername, pwd);
try
{
// Bind to the native AdsObject to force authentication.
Object obj = entry.NativeObject;
DirectorySearcher search = new DirectorySearcher(entry);
search.Filter = "(SAMAccountName=" + username + ")";
search.PropertiesToLoad.Add("cn");
SearchResult result = search.FindOne();
if(null == result)
{
return false;
}
// Update the new path to the user in the directory
_path = result.Path;
_filterAttribute = (String)result.Properties["cn"][0];
}
catch (Exception ex)
{
throw new Exception("Error authenticating user. " + ex.Message);
}
return true;
}

}

Implementando el Proceso de autenticación

En este paso se van a desarrollar plenamente el proceso de autenticación que se pondrá en marcha cuando el usuario hace clic en el botón de inicio de sesión utilizando la clase construida antes.

Para los usuarios autenticados, la autenticación de form-base será creada y el usuario será redirigido a la página original que había pedido.
Ahora abría de agregar en el botón de inicio de sesión un event handler con código que cree una nueva instancia de la clase de validación del Active Directory. El proceso de autenticación tiene que realizar los siguientes pasos:

a. Autenticar al usuario contra el Active Directory.
b. crear una credencial de FormsAuthenticationTicket que identifica al usuario.
c. Encriptar la credencial.
d. Crear una nueva cookie que contiene el Ticket.
e. Agregue la cookie a la lista de las cookies que se devuelven al explorador del usuario.

// Path to you LDAP directory server.
// Contact your network administrator to obtain a valid path.
string adPath = "LDAP://localhost;
LdapAuthentication adAuth = new LdapAuthentication(adPath);


try
{
if(true == adAuth.IsAuthenticated(txtDomainName.Text, txtUserName.Text,txtPassword.Text))
{
// Create the authetication ticket
FormsAuthenticationTicket authTicket =
new FormsAuthenticationTicket(1, // version
txtUserName.Text,
DateTime.Now,
DateTime.Now.AddMinutes(60), False , groups);
// Now encrypt the ticket.
string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
// Create a cookie and add the encrypted ticket to the
// cookie as data.
HttpCookie authCookie =
new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
// Add the cookie to the outgoing cookies collection.
Response.Cookies.Add(authCookie);
// Redirect the user to the originally requested page
Response.Redirect(
FormsAuthentication.GetRedirectUrl(txtUserName.Text,false));
}
else
{
lblError.Text = ”Authentication failed, check username and password.";
}
}
catch (Exception ex)
{
lblError.Text = "Error authenticating. " + ex.Message;
}

Recuerde que debe cambiar la ruta de acceso de modo que tiene como objetivo el AD Server, y el nombre de la cookie debe ser el mismo nombre que hemos especificado en el archivo Web.config.

Implementando la solicitud de autenticación

Ahora la pregunta es cómo la aplicación sabe si el usuario está autenticado o no cada vez que la aplicación realiza una solicitud.

Se puede hacer este procedimiento en el archivo Global.asax. que tiene que implementar un evento denominado Application_AuthenticateRequest. Recuerde que en los pasos anteriores se genera una cookie de con un un Ticket de autenticación. En este evento debe extraer información de las cookies y crea un objeto GenericPrincipal de identificar al usuario autenticado.

Por último, el objeto GenericPrincipal se asociará con el objeto HttpContext actual crea para cada solicitud Web.

using System.Web.Security;
using System.Security.Principal;

// Extract the forms authentication cookie
string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = Context.Request.Cookies[cookieName];
if(null == authCookie)
{
// There is no authentication cookie.
return;
}

FormsAuthenticationTicket authTicket = null;
Try
{
authTicket = FormsAuthentication.Decrypt(authCookie.Value);
}
catch (Exception ex)
{
// Log exception details (omitted for simplicity)
return;
}
if (null == authTicket)
{
// Cookie failed to decrypt.
return;
}

// Create an Identity object
GenericIdentity id = new GenericIdentity(authTicket.Name,"LdapAuthentication");

// This principal will flow throughout the request.
GenericPrincipal principal = new GenericPrincipal(id, null);

// Attach the new principal object to the current HttpContext object
Context.User = principal;

Probando la Aplicación
Ya terminado el proceso de autenticación y es hora de probarlo. Introduzca un nombre de dominio válido, nombre de usuario y contraseña y haga clic en Iniciar sesión, si está autenticado correctamente, debería ser enviado de nuevo a la página que establece como valor predeterminado. Si intenta cambiar la URL manualmente antes de inicio de sesión, obtendrá el mismo resultado que un inicio de sesión no válida, la solicitud se tenga en cuenta que no hay ningún usuario autenticado por lo que será redirigido a la página inicio de sesión de nuevo.

Articulos relacionados

How To: Use Forms Authentication with Active Directory in ASP.NET 2.0
http://msdn.microsoft.com/en-us/library/ms998360.aspx
System.DirectoryServices Namespace
http://msdn.microsoft.com/en-us/library/system.directoryservices.aspx
http://www.15seconds.com/issue/050203.htm
http://www.beansoftware.com/ASP.NET-Tutorials/Forms-Authentication-Active-Directory.aspx
Personas participantes en el artículo:
Luis Oswaldo Gonzales
Carlos Juan Orellana
Ver

jueves, 20 de agosto de 2009

Mejorar el rendimiento en ASP.net

1 comentario:
Mientras cree cualquier sitio web, debe mantener en mente algunos puntos para mejorar su rendimiento.

1.) Configure el debug=false de la siguiente manera:

< compilation default Language="c#" debug="false" >

2.) Use Server.Transfer en vez de Response.Redirect.

3) Compruebe siempre Page.IsValid cuando se utilizan controles Validator.

4) Use Foreach loop en lugar de For loop para String Iteration.

5) Utilizar la validación del lado cliente donde sea posible.

6.)Verifique “Page.IsPostBack”. Para evitar la repetición de la ejecución de código.

7.)GIF y PNG son similares, pero PNG normalmenteson de menor tamaño. (Es verdad, pero algunos navegadores no apoyar el formato PNG)

8.)Usar el AppOffline.htm cuando se actualiza binarios.

9.)Desactivar Tracing, a menos que sea requerido. (por defecto esta desactivada, uselo en las páginas en las que es necesario)

< trace enabled="false" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true"/ >

10.)Precompile las páginas y desactivar AutoEventWireup; colocar el atributo AutoEventWireup en false en el archivo Machine.config.

11.)Apague el estado de la sesión, si no es necesario.

< sessionstate timeout="20" cookieless="false" mode="Off" stateconnectionstring="tcpip=127.0.0.1:42424" sqlconnectionstring="data source=127.0.0.1;Trusted_Connection=no" >

12.)Seleccione el modo de Release (versión final) antes de hacer la construcción para su aplicación.

14.)Deshabilitar Viewstate cuando no se requiere.

EnableViewState="false"

15.)Evite frecuentes viajes de ida y vuelta a la base de datos.

16.)Use caché para mejorar el rendimiento de su aplicación.

17.)Validar todos los ingresos recibidos de los usuarios.

18.)Utilice método Finally para matar a los recursos.

19.) Use el StringBuilder en lugar del String ya que ocupan una posición de memoria diferente en cada momento de la modificación.

20.) Nunca use directamente el Objeto; primero obtenga el valor del objeto en la variable local que usara. Se tarda más tiempo entonces la lectura de variables.

21.)Evite las excepciones: Use la condición if (si se trata de comprobar la condición adecuada)

22.)Optimización de código: Evite el uso de código como x = x +1; es siempre mejor usar x + = 1.

23.)Técnicas de Acceso a datos: DataReaders proporciona un método rápido y eficaz de recuperación de datos. DataReader es mucho más rápido de DataSets en lo que refiere al rendimiento

24.)Como siempre, evitar las variables de sesión, ya que cada página ASP se ejecuta en un subproceso diferente y pide período de sesiones se serializa una por una. Así pues, este pondra mas lenta la aplicación. En lugar de las variables de sesión se puede utilizar la colección QueryString o variables ocultas en la forma que tiene los valores

25.)Habilite buffering mejorará el rendimiento.

< % response.buffer=true % >
< % response.flush=true % >


26.)Utilice el control Repeater en lugar de DataGrid, DataList, porque es eficiente, personalizable y programable.

27.)Las Lista de datos(Data listing) consumen más tiempo para grandes volúmenes de datos cuando se recupere datos de la base de datos.

Paginación mostrará sólo los datos en particular, sino tomar la carga de todos los datos.
Buscar sólo los datos que se necesita para la página actual.


28.)Evite los JavaScript y CSS en linea(Inline)

29.)Utilizan un solo archivo CSS en lugar de múltiples archivos CSS.

Lo posible se deben combinar todas las clases CSS basado en un solo css. Archivo como mucho. Archivos CSS provocará una gran cantidad de solicitudes, independientemente del tamaño de los archivos.

. archivos CSS normalmente se almacena en caché de los navegadores, así que un único y fuerte. css no causa de una larga espera en cada solicitud de página.

En línea. Clases CSS podría hacer HTML pesados, por lo que de nuevo: seguir adelante con un archivo de single.css

30) Reducir el tamaño de las cookies.

31.) Comprimir CSS, JavaScript e imágenes.

Compresores en línea están disponibles, para comprimir el archivo por favor se refiere siguientes web y reemplazar el contenido de su archivo con optimizar el código.

32.)Use Cache apropiadamente.

33.) No haga las variables public or proteted, trate de mantenerlo private y use public/proteted como propiedades.

34.)Use strString=string.Empty en lugar de strString="" [Y tal vez en lugar de strString=null tambien (?)]

35.) Hacer sus paginas lo más ligero posible. La idea es tratar de evitar márgenes innecesarias, por ejemplo, uso de elementos div en lugar de tablas.

36.)Escribir mensajes estáticos en div y hacerlo visible cuando sea necesario. Esto es más rápido que dejar que el servidor establezer la propiedad Text en el label o div.

37.)Recuperar datos de la base de datos en una sola vez, si es posible. Asi no se hacen muchos viajes a la base de datos. Para ello, se combinan los campos de datos de diferentes tablas y seleccionarlos.

Otros consejos:

HTML Page Performance
http://msdn.microsoft.com/en-us/magazine/cc163854.aspx
Ver

viernes, 14 de agosto de 2009

crear una aplicacion para usar Ftp - FtpWebRequest

No hay comentarios.:
El FtpWebRequest le permite crear conexiones de FTP a los servidores de FTP y la transferencia de archivos. Si usted está interesado en el uso de la FtpWebRequest clase para subir archivos a un servidor, aquí está un ejemplo de código:

Información Tecnica:
.NET Framework Class LibraryFtpWebRequest Class
Implements a File Transfer Protocol (FTP) client.
Namespace: System.Net
Assembly: System (in System.dll)
http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.aspx

código de ejemplo:
FtpWebRequest ftpRequest;
FtpWebResponse ftpResponse;
try
{

//Ajustes necesarios para establecer una conexión con el servidor
this.ftpRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://ServerIP/FileName"));
this.ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
this.ftpRequest.Proxy = null;
this.ftpRequest.UseBinary = true;
this.ftpRequest.Credentials = new NetworkCredential("UserName", "Password");


//Selección de archivo a ser cargado
FileInfo ff = new FileInfo("File Local Path With File Name");//e.g.: c:\\Test.txt
byte[] fileContents = new byte[ff.Length];


//destruirá el objeto inmediatamente después de ser utilizado

using (FileStream fr = ff.OpenRead())
{
fr.Read(fileContents, 0, Convert.ToInt32(ff.Length));
}


using (Stream writer = ftpRequest.GetRequestStream())
{
writer.Write(fileContents, 0, fileContents.Length);
}

//Obtiene el FtpWebResponse de la operación de carga
this.ftpResponse = (FtpWebResponse)this.ftpRequest.GetResponse();
Response.Write(this.ftpResponse.StatusDescription); //Display response
}

catch (WebException webex)
{
this.Message = webex.ToString();
}
Ver

jueves, 13 de agosto de 2009

HttpWebRequest

No hay comentarios.:
La clase HttpWebRequest le permite hacer peticiones web a un servidor HTTP, en otras palabra permite al usuario interactuar directamente con servidores que utilicen HTTP


Este código muestra cómo leer el contenido de un archivo desde un servidor web remoto utilizando la clase HttpWebRequest.

http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.aspx
Espacio de nombres: System.Net
Ensamblado: System (en system.dll)


Visual Basic:

If Not (IsPostBack) Then
Try
Dim fr As System.Net.HttpWebRequest
Dim targetURI As New Uri("http://algo.asp.net/algo.txt")
fr = DirectCast(System.Net.HttpWebRequest.Create(targetURI), System.Net.HttpWebRequest)
If (fr.GetResponse().ContentLength > 0) Then
Dim str As New System.IO.StreamReader(fr.GetResponse().GetResponseStream())
Response.Write(str.ReadToEnd())
str.Close();
End If
Catch ex As System.Net.WebException
Response.Write("File does not exist.")
End Try
End If

C#:

if (!(IsPostBack))
{
try
{

System.Net.HttpWebRequest fr;
Uri targetUri = new Uri("http://algo.asp.net/algo.txt");
fr = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(targetUri);
if ((fr.GetResponse().ContentLength > 0))
{
System.IO.StreamReader str = new System.IO.StreamReader(fr.GetResponse().GetResponseStream());
Response.Write(str.ReadToEnd());
if (str != null) str.Close();
}
}
catch (System.Net.WebException ex)
{
Response.Write("File does not exist.");
}
}
Ver