viernes, 2 de septiembre de 2011

Alternar colores en filas de Grid en .Net

Para alternar colores al mover el mouse sobre las filas de un grid en .Net, debemos poner el siguiente código en el evento RowDataBound del grid:


if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Attributes.Add("onmouseover", "this.originalcolor=this.style.backgroundColor;this.style.backgroundColor='Khaki';");
        e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=this.originalcolor;");
}


lunes, 29 de agosto de 2011

Enviar correos desde Visual Basic .Net

Si lo que necesitamos es enviar mail desde Visual Basic .Net, lo que debemos hacer es escribir el siguiente código:

Primero debemos utilizar el Namespace:

Imports System.Net.Mail

Ahora en nuestro método para enviar el correo escribimos lo siguiente:

Dim smtp As New SmtpClient
Dim mail As MailMessage = New MailMessage

mail.From = New MailAddress("remitente@midominio.com")
mail.To.Add("destinatario@midominio.com")
'mail.CC.Add(vRemitente) 'Esta linea es para agregar una copia
mail.Subject = "Asunto del correo"
mail.Priority = MailPriority.High
mail.Body = "Cuerpo del correo" 'Se pueden utilizar Tags de HTML para darle formato al texto.
'mail.Attachments.Add(New Attachment("Aqui va el path del archivo")) 'Por si se desea aduntar un documento

smtp.Host = "dirección del SMTP que se utilizará para enviar el correo"
smtp.Port = Puerto del SMTP para enviar el correo
smtp.EnableSsl = True
smtp.DeliveryMethod = SmtpDeliveryMethod.Network

 smtp.Credentials = New System.Net.NetworkCredential("remitente@midominio.com", "password")
 smtp.Send(mail)

Con esto ya podremos enviar correos desde nuestra apliacación de Visual Basic.

Tenemos que tomar en cuenta que la configuración del SMTP corresponde al servidor que utilizaremos para enviar mail.

Salu2.

jueves, 30 de junio de 2011

Borrar Log de IIS7

El IIS7 puede darnos el problema de que sus Logs crecen bastante y nos dejan sin espacio el Disco Duro de nuestro servidor.  Para poder borrarlo debemos ejecutar esta instrucción usando PowerShell:

get-childitem -Path C:\inetpub\logs\LogFiles\w3svc1 -recurse | where-object {$_.lastwritetime -lt (get-date).addDays(-7)} | Foreach-Object { del $_.FullName }

En este código se borran los últimos 7 días, pero ese parámetro pueden modficarlo si necesitan eliminar más historial.  Así mismo con el nombre de la carpeta ya que dentro de LogFiles pueden haber varias carpetas.  En resumen, lo que está en Rojo es lo que puden cambiar.


El PowerShell lo puden descargar aquí.


Espero este artículo sea de utilidad para todos ustedes.

miércoles, 25 de mayo de 2011

Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack

Se han topado alguna vez con este engorroso error??

Esto aparece cuando utilizamos los métodos Response.End, Response.Redirect o Server.Transfers, en estos métodos se produce una excepción de tipo ThreadAbortException que puede ser capturada con un try-catch.

Solución:

Para Response.End utilizar HttpContext.Current.ApplicationInstance.CompleteRequest en lugar de Response.End.

Para Response.Redirect llamarlo de la siguiente forma Response.Redirect(String url, bool endResponse) enviando false en el parámetro endResponse, por ejemplo:

Response.Redirect("siguientePagina.aspx", false);

Para Server.Transfer usar en lugar de este método, este otro: Server.Execute.

Espero esta información pueda serles de utilidad.

Como crear un indice en oracle increiblemente rapido

Esto aplica mas que todo en un datawarehouse, si quiere que un indice en una tabla que contiene millones de filas se cree mucho mas rapido ejecuten este comando antes de crear el indice:
alter session set sort_area_size=400000
Luego ejecuten el indice, en las veces que he utilizado el comando el indice se crea hasta 5 veces mas rapido que sin utilizar el comando. Adicionalmente asegurense de utilizar paralelismo para crear el indice. El paralelismo solo funciona en la version enterprise de oracle.

miércoles, 30 de marzo de 2011

Agregar referencia de proyecto a un sitio Web en Visual Studio

Agregar una referencia de proyecto a un sitio Web en Visual Studio

Después de agregar un proyecto a la solución, puede hacer referencia al proyecto desde el proyecto del sitio Web.

Para hacer referencia a otro proyecto en un sitio Web

  1. En el Explorador de soluciones, seleccione el proyecto del sitio Web al que desea agregar la referencia de proyecto.
  2. En el menú Sitio Web, elija Agregar referencia. De forma alternativa, puede hacer clic con el botón secundario en el proyecto del sitio Web y, a continuación, hacer clic en Agregar referencia.
    Aparece el cuadro de diálogo Agregar referencia.
  3. Haga clic en la ficha Proyectos.
  4. De la lista de proyectos disponibles, seleccione aquel del que quiere una referencia y, a continuación, haga clic en Aceptar.
    Se agrega lo siguiente a la carpeta Bin del sitio Web:
    • Una copia del ensamblado creada a partir del proyecto agregado.
    • Copias de ensamblados dependientes, archivos de documento XML, archivos de licencia, archivos de recursos, etc.
    • El archivo de base de datos de programa (.pdb), que contiene información sobre depuración y sobre el estado del proyecto para la versión de depuración del ensamblado agregado. Este archivo se copia si está presente en la ubicación original, independientemente de la configuración de generación.

Botón de imprimir de Reporting Services no aparece en FireFox ni Chrome

Si alguna vez se han topado con que el botón de impresión de Reporting Services no aparece en FireFox ni en Google Chrome si no que solamente en Internet Explorer, aqui les tengo la solución al problema.

En este momento lo tienen así:


Será alguna artimaña de Microsoft???  Sin importar si así es, he aquí la solución a ello:

Primero deben decargar esta dll y agregarla como referencia a su Sitio Web: PrintButtonDLL (Opción 1)  

Si este link no funciona, por favor usen este: PrintButtonDLL (Opción 2)

Si necesitan ayuda para agregar una referencia a su proyecto Web, pueden consultar este artículo: Agregar Referencia a proyecto Web

En su página Web deben agregar un control llamado ReportViewer y en este caso lo llamaremos "rvReportes".

Es necesario agregar la siguiente referencia:

<%@ Register assembly="printButtonDLL" namespace="printButtonDLL" tagprefix="cc1" %>

Luego dentro de la etiqueta Body de su página agreguen esta línea:

<cc1:PrintButton ID="PrintButton1" runat="server" ReportName="rvReportes" />

Ya con el ReportViewer agregado, debe quedar así:

<body>
    <form id="form1" runat="server">
    <div>
        <rsweb:ReportViewer ID="rvReportes" runat="server" ProcessingMode="Remote"
            Width="850px" Height="590px" Font-Names="Verdana" Font-Size="8pt">
            <ServerReport ReportServerUrl="" />
    </rsweb:ReportViewer>  
      
        <br />
        <cc1:PrintButton ID="PrintButton1" runat="server" ReportName="rvReportes" />
      
    </div>
    </form>
</body>

El siguiente paso es agregar el siguiente código en la misma página, dentro del Head, debe quedar así:


<head id="Head1" runat="server">
    <title></title>
  
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js" language="javascript" type="text/javascript"></script>
<script type="text/javascript">
    function $_create(elem, tag, target) { return addElem(elem, target, tag) }
    function $_add(elem, target) { return addElem(elem, target) }
    function $_GB() { return GetBrowser(); }

    function GetBrowser() {
        //JQuery Script;
        if ($.browser.mozilla)
            return 'FF';
        else if ($.browser.msie)
            return 'IE';
        else if ($.browser.webkit)
            return 'OP';
        else if ($.browser.opera)
            return 'WK';
        else
            return 'FF';
    }

    function addElem(elem, target, tag) {
        if (typeof elem === 'string') {
            var el = document.getElementById(elem);
            if (!el) {

                el = document.createElement(tag);

                el.id = elem;
            }
            elem = el;
        }
        if (target) {
            var dest;
            if (typeof target === 'string')
                dest = document.getElementById(target);
            else
                dest = target;

            dest.appendChild(elem);
        }

        return elem;
    }

    function insert(elem, target) {
        if (typeof target === 'string')
            target = document.getElementById(target);
        var myDoc = target.contentWindow || target.contentDocument;
        if (myDoc.document) {
            myDoc = myDoc.document;
        }
        var headLoc = myDoc.getElementsByTagName("head").item(0);
        var scriptObj = myDoc.createElement("script");
        scriptObj.setAttribute("type", "text/javascript");
        scriptObj.innerHTML = 'window.print();';
        if (elem)
            elem = document.getElementById(elem);

        if (elem)
            headLoc.appendChild(elem);
        else
            headLoc.appendChild(scriptObj);

    }
  </script>

</head>


Ya con esta solución queda así:


Por último, al hacer clic en el botón de imprimir, deben seleccionar la opción que recomiendo a continuación:



Listo!!!!!!!!!

Vivamos como perros

Te has preguntado por qué los perros viven menos que las personas??? 
                 
 Aquí la respuesta (por un niño de 6 años).

Siendo un Veterinario, fui llamado para examinar a un Sabueso Irlandés de 10 años de edad llamado Belker. Los dueños del perro, Ron, su esposa Lisa y su pequeño Shane, estaban muy apegados a Belker, y estaban esperando un milagro.

Examine a Belker y descubrí que estaba muriendo de Cáncer. Les dije a su familia que no podíamos hacer ya nada por Belker, y me ofrecí para llevar cabo el procedimiento de eutanasia en su casa.

Hicimos los arreglos necesarios,  Ron y Lisa dijeron que sería buena idea que el niño de 6 años, Shane observara el suceso. Ellos sintieron que Shane podría aprender algo de la experiencia.

Al día siguiente, sentí la familiar sensación en mi garganta cuando Belker fue rodeado por la familia. Shane se veía tranquilo, acariciaba al perro por última vez, y yo me preguntaba si él comprendía lo que estaba pasando. En unos cuantos minutos Belker se quedó dormido pacíficamente para ya no despertar.

El pequeño niño pareció aceptar la transición de Belker sin ninguna dificultad o confusión. Nos sentamos todos por un momento preguntándonos el porqué de el lamentable hecho de que la vida de las mascotas sea mas corta que la de los humanos.
Shane, que había estado escuchando atentamente, dijo: ''yo sé porqué.''

Sorprendidos, todos volteamos a mirarlo. Lo que dijo a continuación me maravilló, nunca he escuchado una explicación mas reconfortante que ésta. Este momento cambio mi forma de ver la vida.
El dijo,''la gente viene al mundo para poder aprender como vivir una buena vida, como amar a los demás todo el tiempo y ser buenas personas, verdad?''

''Bueno, como los perros ya saben cómo hacer todo eso, pues no tienen que quedarse por tanto tiempo como nosotros.''
La moraleja es :

Si un perro fuera tu maestro, aprenderías cosas como:

Cuando tus seres queridos llegan a casa, siempre corre a saludarlos.

Nunca dejes pasar una oportunidad para ir a pasear.

Deja que la experiencia del aire fresco y del viento en tu cara sea de puro Éxtasis.

Toma siestas.

Estírate antes de levantarte.

Corre, brinca y juega a diario.

Mejora tu atención y deja que la gente te toque.

Evita morder cuando un simple gruñido sería suficiente.

En días cálidos, recuéstate sobre tu espalda en el pasto, patas abiertas.

Cuando haga mucho calor, toma mucha agua y recuéstate bajo la sombra de un árbol.

Cuando estés feliz, baila alrededor, y mueve todo tu cuerpo.

Deléitate en la alegría simple de una larga caminata.

Sé leal.

Nunca pretendas ser algo que no eres.

Si lo que quieres está enterrado, escarva hasta que lo encuentres.

Cuando alguien tenga un mal día, quédate en silencio, siéntate cerca y suavemente hazles sentir que estás ahí.



"La felicidad no es una meta sino un camino...disfruta mientras lo recorres"



"Mas vale perder el tiempo con los amigos....Que perder amigos con el tiempo....Por éste dulce motivo,
pierdo el tiempo contigo.... Porque NO quiero perderte con el tiempo"
ANONIMO

martes, 18 de enero de 2011

Forzar un PostBack en aspx.net

Probablemente en por lo menos una ocasión hemos tenido el problema que necesitamos forzar un PostBack en algún momento determinado, o bien, por alguna extraña razón no funciona la propiedad AutoPostBack = True de algún control.

Bueno, si este fuera el caso, provocar un PostBack es bastante sencillo a través de JavaScript.  Lo que tenemos que hacer es declarar la siguiente función:

<script type='text/javascript'>
          function Forzar() {
               __doPostBack('', '');
       }
</script>


Luego, en el code behind de nuestra página llamamos a dicha función donde necesitemos forzar un PostBack:


ScriptManager.RegisterStartupScript(this, typeof(Page), "jsKeys", "javascript:Forzar();", true);


Y listo!!!!!!

miércoles, 5 de enero de 2011

SQL - Procedimientos almacenados paso a paso

Un procedimiento almacenado (Stored Procedure) no es más que una secuencia ordenada de instrucciones T-SQL, que pueden recibir y proporcionar parámetros provistos por el usuario y se pueden guardar en el servidor con un nombre, para posteriormente se invocados y ejecutados, por lo regular desde una aplicación (Escritorio o Web). Desde la versión 2005, se incorpora la posibilidad de utilizar procedimientos almacenados usando el CLR de .NET. Es decir tenemos dos tipos de procedimientos almacenados.

Un procedimiento almacendado CLR es una referencia a un método de un ensamble (dll) de .NET Framework que puede aceptar y devolver parámetros suministrados por el usuario.

Ventajas de usar SP
  • Compilación: La primera vez que se invoca un SP, el motor lo compila y a partir de ahí, se sigue usando la versión compilada del mismo, hasta que se modifique o se reinicie el servicio de SQL. Esto siginifica que se tendrá un mejor rendimiento que las consultas directas que usan cadenas con las instrucciones T-SQL, que se compilan cada vez que se invocan.
  • Automatización: Si tenemos un conjunto de instrucciones T-SQL, las cuales queremos ejecutar de manera ordenada, un SP es la mejor manera de hacerlo.
  • Administración: Cuando realizamos aplicaciones con un gran número de líneas de código, y queremos hacer cambios, solo implica modificar un SP y no toda la aplicación, lo que significa solo cambiamos los SP en el servidor y no tenemos que actualizar la aplicación en todos los equipos cliente.
  • Seguridad: una parte importante es que a los usuarios de nuestra aplicación, solo les proporcionamos los permisos para ejecutar los procedimientos almacenados y no el acceso a todos los objetos de la base de datos. Es decir, si en nuestra aplicación encuentran una vulnerabilidad como SQL Injection no se podrá explotar ejecutando SQL directamente.
  • Programabilidad: Los SP admiten el uso de variables y estructuras de control como IF, Bucles, Case, etc. además del manejo de transacción y permite controlar excepciones. Y cuando trabajamos con SP CLR podemos hacer uso de cualquier lenguaje .NET como lo son C# y VB.NET.
  • Trafico de Red: Pueden reducir el trafico de la red, debido a que se trabaja sobre el motor (en el servidor), y si una operación incluye hacer un trabajo de lectura primero y en base a eso realizar algunas operaciones, esos datos que se obtienen no viajan por la red.
Creando un Procedimiento almacenado

Para crear un procedimiento almacenado solo basta con ir a la base de datos desplegar el árbol hasta la parte de programación y luego en procedimientos almacenados y damos clic derecho en nuevo procedimiento almacenado como se ve en la siguiente figura:


Lo cual genera el siguiente código:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Author,,Name>
-- Create date: <Create Date,,>
-- Description:    <Description,,>
-- =============================================
CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName>
    -- Add the parameters for the stored procedure here
    <@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>,
    <@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
END
GO



Es aquí en donde editamos nuestro procedimiento como mejor nos interese, en este caso usando la base de datos Northwind, crearemos un SP sencillo que queda más o menos así:


USE [Northwind]
GO

CREATE PROCEDURE [dbo].[GetAllEmployees]
    -- Add the parameters for the stored procedure here
    @LastName nvarchar(50),
    @FirstName nvarchar(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT  LastName, FirstName, Title
    FROM dbo.Employees
    WHERE FirstName = @FirstName AND LastName = @LastName
END


En este sencillo ejemplo, sólo devuelve el empleado especificado (nombre y apellidos), y el titulo a partir de una vista. Este procedimiento almacenado acepta coincidencias exactas de los parámetros pasados.

Para ejecutar el código debemos hacerlo de esta manera:

EXEC dbo.GetAllEmployees 'Davolio', 'Nancy'

Cómo lo consumimos desde una aplicación en .NET??, pues de esta manera:


static void Main(string[] args)
        {
            //Creamos una nueva conexion.
            SqlConnection miConn = new SqlConnection("Data Source=NORTABLEPC\\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True");

            //Creamos un nuevo comando
            SqlCommand miComm = new SqlCommand();
            //Le asignamos la conexion.
            miComm.Connection = miConn;
            //especificamos que el comando es un stored procedure
            miComm.CommandType = System.Data.CommandType.StoredProcedure;
            //y escribimos el nombre del stored procedure a invocar
            miComm.CommandText = "dbo.GetAllEmployees";
            //Creamos un nuevo parametro
            SqlParameter paramLastName = new SqlParameter();
            paramLastName.ParameterName = "@LastName";
            paramLastName.SqlDbType = System.Data.SqlDbType.NVarChar;
            paramLastName.Value = "Davolio";

            miComm.Parameters.Add(paramLastName);

            SqlParameter paramFirstName = new SqlParameter();
            paramFirstName.ParameterName = "@FirstName";
            paramFirstName.SqlDbType = SqlDbType.NVarChar;
            paramFirstName.Value = "Nancy";
            miComm.Parameters.Add(paramFirstName);
            //Y los agregamos a la coleccion de parametros del comando myComm.Parameters.Add(myParam) 'Creamos un nuevo DataAdapter con nuestro comando.
            SqlDataAdapter miDA = new SqlDataAdapter(miComm);
            //Creamos un dataset para soportar los datos devueltos por el stored procedure
            DataSet EmpleadosDS = new DataSet();
            //Pedimos al Data Adapter que llene el dataset (Esto llama a nuestro comando)
            miDA.Fill(EmpleadosDS);
            //Y lo mostramos por pantalla

            foreach (DataRow row in EmpleadosDS.Tables[0].Rows)
            {
                Console.WriteLine(row["LastName"].ToString() + " " + row[1].ToString() + " " + row[2].ToString());
            }
        }














Procedimientos Almacenados con CLR

En Common Language Runtime (CLR), los procedimientos almacenados se implementan como métodos estáticos públicos en una clase de un ensamblado de Microsoft .NET Framework. El método estático se puede declarar como void o puede devolver un valor entero. Si devuelve un valor entero, éste se trata como el código devuelto desde el procedimiento. Los parámetros que se pasan a un procedimiento almacenado CLR pueden ser cualquiera de los tipos nativos de SQL Server que tengan un equivalente en código administrado. Para que la sintaxis Transact-SQL cree el procedimiento, estos tipos se deben especificar con el equivalente del tipo nativo de SQL más adecuado.

Ejemplo:

Para crear un SP con integración del CLR vamos a usar VS, y creamos un Proyecto de tipo SQL, al que llamaremos StoreProcedure_Demo, lo primero que hace Visual Studio es preguntar el origen de datos, como se ve en la figura siguiente:



En donde seleccionamos Microsoft SQL Server (SqlClient) y damos clic en continuar. Ahora toca el turno de elegir el Servidor


En donde yo selecciono el servidor NORTABLEPC\SQLEXPRESS, y la base de datos Northwind, luego verifico la conexión y si todo va bien, por ultimo nos pedirá que si queremos habilitar la integración con el CLR, damos clic y listo. Luego damos clic derecho en nuestro proyecto Agregar->Procedimiento almacenado, como se ve en la figura:


Al procedimiento lo llamamos: GetEmpleado, damos clic en Aceptar. Ahora vamos a escribir el siguiente código:


using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure (Name="GetEmpleado")]
    public static void GetEmpleado()
    {
        // Inserte el código aquí
        SqlContext.Pipe.Send("Hola Mundo! son las : " + System.DateTime.Now.ToString() + "\n");
        using (SqlConnection connection = new SqlConnection("context connection=true"))
        {
            connection.Open();
            SqlCommand command = new SqlCommand("SELECT LastName, FirstName FROM Employees", connection);
            SqlDataReader reader = command.ExecuteReader();
            SqlContext.Pipe.Send(reader);
        }

    }
};






En el código anterior solo mandamos un mensaje, y devolvemos un select sencillo de los empleados.  Bien para que esto funcione, debemos generar una solución de nuestro proyecto y después una implementación del mismo, esto permite que automáticamente se envié la dll a nuestra base de datos con el nombre de nuestro proyecto, y al mismo tiempo agrega el procedimiento llamado GetEmpledo


Ahora solo nos resta ejecutar nuestro procedimiento con la siguiente instrucción:


EXEC dbo.GetEmpleado


Lo interesante de esto, es que una vez que ya hemos llamado al SP, cuando se ejecute de nuevo, ya no se compilara instrucción por instrucción solo se llama al dll y listo, el resultado de ejecutarlo es el siguiente, por un lado manda el resultado y por otro el mensaje de “hola mundo” con la hora de la maquina, como se ve en la figura:



En el Servidor de SQL es necesario habilitar CLR mediante las siguientes instrucciones:

USE master;
GO
EXEC sp_configure 'clr enabled', '0';
RECONFIGURE WITH OVERRIDE;
GO

sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO


Hasta aquí dejamos este post, ya veremos en otro como ejecutar dichos procedimientos almacenados desde una aplicación. Espero que les sea de utilidad.