viernes, 18 de septiembre de 2009

Validar Estructura HTML

Amigos una forma sencilla de validar la estructura HTML en nuestra aplicación es tratarlo como Xml
con este metodo podemos lograrlo

private void ValiateHTML(string html)
{
ASCIIEncoding myEncoder= new ASCIIEncoding();
Byte[] bytes = myEncoder.GetBytes(html);
MemoryStream ms = new MemoryStream(bytes);

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(ms);
}


en la siguiente imagen, con el texto html que contiene un error, al pasarlo por el metodo este nos mostrara un error que podemos capturarlo y poder hacer las validaciones

el error:

Espero les sea de ayuda

Eloy.


sábado, 12 de septiembre de 2009

Hacer que funcione le menu de Asp.net con Google Chrome

Para aquellos que se encontraron con problemas al crear un menu clásico de asp.net y corrieron bajo google chorme, se encontrarán que el comportamniento es muy diferente y no funciona adecuadamente, pues esto se soluciona de la siguiente manera

1. en su aplicacion web agreguen una carpeta de asp .net del tipo App_Browsers y agreguen un archivo de extencion *.browser


2. luego peguen el siguiente codigo

pues ahora ya pueden ver su menu clasico de asp.net corriendo en google chrome


jueves, 3 de septiembre de 2009

Como evitar el doble Postback

Cuanta veces nos ha ocurrido que en una pagina aspx, sencilla de un matenimiento simple con un boton guardar, cuando pulsamos sobre el se ejecuta el evento y el postback pero, que pasa si


despues de ello al usuario se le ocurre refrescar la pagina desde el navegador o hacer F5, ocurre



algo inesperado pues al hacer nuevamente el postback el evento del boton se vuelve a ejecutar y es como que si ubiesemos hecho click nuevamente. esto causaria molestias al usuario pues no deberia suceder.



asi que voy a postear una forma practica de como solucionarlo




primero tienen que crear una clase donde implementemos el IHttpModule y controlarlo mediante una sesion


using System;
using System.Collections.Generic;
using System.Web;
using System.Web.SessionState;

public class HttpModuleCutom: IHttpModule, IRequiresSessionState
{
public HttpModuleCutom()
{
//
// TODO: Add constructor logic here
//
}

#region IHttpModule Members

public void Dispose()
{
//throw new NotImplementedException();
}

public void Init(HttpApplication context)
{
context.PostRequestHandlerExecute += new EventHandler(context_PostRequestHandlerExecute);

}
void context_PostRequestHandlerExecute(object sender, EventArgs e)
{
if ((sender as HttpApplication).Context.Session != null)
{
if ((sender as HttpApplication).Context.Session["Key"] == null)
{
string s = System.Guid.NewGuid().ToString();
(sender as HttpApplication).Context.Session["Key"] = s;
}
else { (sender as HttpApplication).Context.Session["Key"] = null; }
}
}



y luego hay que registrarla en el web.config

<httpModules>
<add name="HttpModuleCutom" type="HttpModuleCutom"/>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</httpModules>


Ahora creen una pagina sencilla como la de la imagen




Cuando compilen y cargen la pagina esta automaticemente se va al evento PostRequestHandlerExecute donde vamos hacer el trabajo de validadcion y verifica que la session exista y si no existe la va a crear por primera vez

ahora al pulsar el boton se va activar el evento y es alli donde entra a tallar la clase creada pues veremos que el Session["Key"] tiene asignado un valor



Y cuando termina de ejecutarse pasa al evento PostRequestHandlerExecute y como detecta que es un segundo postback le asigana null a la session


y al pasar nuevamente por el evento click del boton no ejecuta la accion por la Session["Key"]= null



lunes, 27 de abril de 2009

Trabajar con Schemas en SQL Server 2005

Los schemas, son muy utiles para controlar y separar las tablas en grupos o categorias y hacer mas facil su uso y localizacion , entre otras utilidades existente, en este caso nos centraremos en como crear y pasar las tablas del dbo a los schemas creados.

Teniendo como base datos de prueba DB_TEST que contiene las siguientes tablas: dbo.Cliente y dbo.Proveedor



Luego procedemos a crear los schemas Ventas y compra





El mismo proceso para el schema Compras

Luego comprobamos los schemas creados


Ahora el paso a seguir es traspasar o transferir el schema dbo (default) al los schemas ya creados, mediante las siguiente intrucción:

Comprobación de los cambios de shema

Ahora para poder consultar las tablas con sus nuevos schemas seria de la siguiente forma:





Restaurar Backups SQL Server 2005

Aqui, una muestra de codigo para la restauración de backups mediante script sql

USE master;–Make sure the database is using the simple recovery model.ALTER DATABASE AdventureWorks SET RECOVERY SIMPLE;GO– Back up the full AdventureWorks database.BACKUP DATABASE AdventureWorks TO DISK = ‘Z:\SQLServerBackups\AdventureWorks.bak’WITH FORMAT;GO–Create a differential database backup.BACKUP DATABASE AdventureWorks TO DISK = ‘Z:\SQLServerBackups\AdventureWorks.bak’WITH DIFFERENTIAL;GO–Restore the full database backup (from backup set 1).RESTORE DATABASE AdventureWorks FROM DISK = ‘Z:\SQLServerBackups\AdventureWorks.bak’WITH FILE=1, NORECOVERY;–Restore the differential backup (from backup set 2).RESTORE DATABASE AdventureWorks FROM DISK = ‘Z:\SQLServerBackups\AdventureWorks.bak’WITH FILE=2, RECOVERY;GO

la fuente esta en :

http://msdn.microsoft.com/es-es/library/ms186216.aspx

sábado, 28 de febrero de 2009

Generador de Codigo GenCode EMSV 2009

Esta version esta mas completa y mejorada ya que solamente nos conectamos al servidor y tenemos a disposicion todas las bases de datos para generar.
luego nos conecta y nos muestra un treeview con las bases de datos disponibles y tambien nos podemos conectar a otro servidor y generar codigo sin problemas

Al seleccionar una tabla podemos ver sus campos, tipos de datos y los controles que se van a usar en la programación
Luego procedemos a generar codigo:


Luego aqui podemos observar que los controles definidos para la tabla se generar en codigo.

Despues las opciones de configurar las clases y stored procedures las tenemos de forma diferente pues ya no es necesario agregarla como proyecto, si no que esta como configuracion que se agrega a un combo para seleccionar y tambien dar mantenimiento a los controles a usar para las tablas




Generador de Codigo GenCode EMSV 2008

Hola amigos, aqui les presento una versión del generador de codigo para C#, VB net y SQL. esta es la version 2008.
Aqui se teniene que crear un proyecto y configurar los spacios de nombres, las clases y los stored procedure por cada base de datos que quisieramos generar codigo.
Aqui nos conectamos a la base de datos y luego definimos las caracteristicas del proyecto

Luego una vez conectados seleccionamos la tabla definimos los campos y empezamos a generar codigo. Aca les pongo 2 ejemplos una entidad en C# y un Stored Procedure, y tambien soporta la caracteristica de generar el cs y el stored procedure en la base de datos



viernes, 6 de febrero de 2009

Parametros con Reporting Services

Aca le mando la forma de enviar parametros a un informe de reporting Services



List parameter = new List();
parameter.Add(new ReportParameter("pIDCompania", AppSettings.IDCompania.ToString()));
parameter.Add(new ReportParameter("IDEmpleado", this.cboIDEmpleado.SelectedValue.ToString()));
parameter.Add(new ReportParameter("IDProyecto", this.cboIDProyecto.SelectedValue.ToString()));
parameter.Add(new ReportParameter("pApeNom", this.cboIDEmpleado.Text));
parameter.Add(new ReportParameter("pProyecto", this.cboIDProyecto.Text));
viewReport.ReportParameter = parameter;

sábado, 31 de enero de 2009

LADP con C#



Cuentas veces hemos tenido la necesidad de conectarnos al Active Directory y obtener los usuarios definidos en el servidor, para poder usarlos en nuestras aplicaciones en diferentes formas y la mas usual es en la seguridad para validar usuarios, les presento aqui un codigo sencillo que encontre en la red y que me sirvio mucho y lo publico para que lo pueden usar y que les de ideas para que entren mas a fondo en este tema de mucho interes.

using System.Security.Principal;
using System.DirectoryServices;
using System.Net.NetworkInformation;



namespace AS.Utilities
{
public class ActiveDirectory
{
public enum LDAPFilterType
{
UsersAndGroups,
OnlyUsers,
OnlyGroups
}
public static string
getLDAPFilterString(LDAPFilterType Type, string Filter)
{
string FilterByName = "(samAccountName=*{0}*)";
string f = string.Empty;
switch (Type)
{
case LDAPFilterType.OnlyUsers:
f = "(&(objectCategory=person)(objectClass=user){0})";
break;
case LDAPFilterType.OnlyGroups:
f = "(&(objectCategory=Group){0})";
break;
case LDAPFilterType.UsersAndGroups:
f = "((&(objectCategory=person)(objectClass=user){0})(&(objectCategory=Group){0}))";
break;
}
if (Filter == string.Empty)
{
return string.Format(f, string.Empty);
}
else
{
return string.Format(f, string.Format(FilterByName, Filter));
}
}
public static string
getDomainName()
{
return IPGlobalProperties.GetIPGlobalProperties().DomainName;
}
public static string
getLDAPDomainName(string domainName)
{
StringBuilder sb = new StringBuilder();
string[] dcItems = domainName.Split(".".ToCharArray());
sb.Append("LDAP://");
foreach (string item in dcItems)
{
sb.AppendFormat("DC={0},", item);
}
return sb.ToString().Substring(0, sb.ToString().Length - 1);
}
public static List
getUserLDAPProperties(string LDAPURL)
{
List properties = new List();
DirectoryEntry entries = new DirectoryEntry(LDAPURL);
DirectorySearcher searcher = new DirectorySearcher(
entries, "(&(objectCategory=person)(objectClass=user))");
try
{
foreach (SearchResult result in searcher.FindAll())
{
foreach (string property in
result.GetDirectoryEntry().Properties.PropertyNames)
{
properties.Add(property);
}
break;
}
}
catch (Exception ex)
{
throw ex;
}
return properties;
}
public static string
getNTAccountName(string wksid)
{
SecurityIdentifier sid = new SecurityIdentifier(wksid);
NTAccount account = (NTAccount)sid.Translate(typeof(NTAccount));
return account.Value;
}
public static string
sIDtoString(byte[] sidBinary)
{
SecurityIdentifier sid = new SecurityIdentifier(sidBinary, 0);
return sid.ToString();
}
public static Dictionary
getADUserMemberOf(IntPtr logonToken)
{
Dictionary groups =
new Dictionary();
WindowsIdentity user = new WindowsIdentity(logonToken);
IdentityReferenceCollection irc = user.Groups;
foreach (IdentityReference ir in irc)
{
groups.Add(getNTAccountName(ir.Value), ir);
}
return groups;
}
public static string
getUserProperties(IntPtr logonToken)
{
WindowsIdentity user = new WindowsIdentity(logonToken);
string propertyDescription = string.Format("The Windows identity named {0}: ", user.Name);
if (!user.IsAnonymous)
propertyDescription += ", is not an Anonymous account";
if (user.IsAuthenticated)
propertyDescription += ", is authenticated";
if (user.IsSystem)
propertyDescription += ", is a System account";
if (user.IsGuest)
propertyDescription += ", is a Guest account";
string authenticationType = user.AuthenticationType;
if ((authenticationType != null))
{
propertyDescription += ", and uses " + authenticationType;
propertyDescription += " authentication type.";
}
propertyDescription += Environment.NewLine;
propertyDescription += "The SID for the owner is : " + user.Owner.ToString();
propertyDescription += Environment.NewLine;
propertyDescription += "Display the SIDs and names for the groups the current user belongs to:";
propertyDescription += Environment.NewLine;
IdentityReferenceCollection irc;
irc = user.Groups;
foreach (IdentityReference ir in irc)
{
propertyDescription += string.Format("Group {0}, SID: {1}{2}",
getNTAccountName(ir.Value), ir.Value, Environment.NewLine);
}
TokenImpersonationLevel token;
token = user.ImpersonationLevel;
propertyDescription += "The impersonation level for the current user is : " + token.ToString();
return propertyDescription;
}
public static List
getItemsInLDAP(string LDAPURL, LDAPFilterType type, string criteria)
{
List items = new List();
DirectoryEntry entries = new DirectoryEntry(LDAPURL);
string filter = getLDAPFilterString(type, criteria);
DirectorySearcher searcher = new DirectorySearcher(
entries, filter);
try
{
foreach (SearchResult result in searcher.FindAll())
{
items.Add((string)result.Properties["samAccountName"][0]);
}
}
catch (Exception ex)
{
throw ex;
}
return items;
}














viernes, 30 de enero de 2009

Obtener información de los objetos sql server

Este codigo sql, nos permite tener información como tipo de dato, longitud y si es un identity,
esto nos permite acercarnos mas al sql server y si miramos un poco mas a fondo podemos sacar provecho de esta informacion. Espero les ayude.


SELECT
DISTINCT C.colid AS IdCol, C.name AS ColName, T.name AS Type,
C.Length, C.Prec, C.Scale, C.IsNullable,
COLUMNPROPERTY(C.id, C.name, 'IsIdentity') AS [Identity],
COLUMNPROPERTY(C.id, C.name, 'IsComputed') AS Computed
FROM syscolumns C
INNER JOIN systypes T on C.xtype = T.xtype and T.xtype=T.xuserType



Tomando como ejemplo la base de datos AdventureWorks, obtendremos el siguiente resultado:

Trabajar con imagenes en .net C#


public byte[] ImageArray(Image objImage)
{
string sTempFile = Path.GetTempFileName();
FileStream fileStream = new FileStream(sTempFile, FileMode.OpenOrCreate, FileAccess.ReadWrite);
objImage.Save(fileStream, System.Drawing.Imaging.ImageFormat.Png);
fileStream.Position = 0;
int _Length = Convert.ToInt32(fileStream.Length);
byte[] bytes = new byte[_Length];
fileStream.Read(bytes, 0, _Length);
fileStream.Close();
return bytes;
}
public Image GetImage(byte[] byteArray)
{
if (byteArray == null) return null;
MemoryStream memoryStream = new MemoryStream(byteArray);
Bitmap _bitmap = null;
try
{
_bitmap = new Bitmap(memoryStream);
}
catch (Exception ex)
{
new ArgumentException(ex.Message);
}
return _bitmap;
}