Utilizar paginación en ASP.NET con SQL Server

Publicado en Programación con etiquetas , , , , , el 3 Noviembre 2009 por febrer

Un problema que nos encontramos a la hora de realizar consultas con paginación esta en como rellenar un datatable con los registros necesarios de cada página. Es decir, no existe una manera fácil de realizar una consulta del tipo “devuélveme los registros 15 al 30 de la tabla usuarios“.

En MySQL existe un comando para utilizar en la sentencia SELECT que es LIMIT m,n gracias al cual podemos solicitar al servidor ‘n‘ registros comenzado desde el registro ‘m‘.

Para realizar este mismo proceso en SQL Server, podemos utilizar ROW_NUMBER() con un poco de ingenio. Por ejemplo, necesitamos obtener 10 registros desde el 30 al 40, en la siguiente consulta:

SELECT a.NOMBRE, a.TIPO, a.FECNAC,
a.APELLIDO1, a.COD_POSTAL, b.COD_NOMBRE
FROM usuarios AS a
INNER JOIN codpostal AS b ON a.COD_POSTAL = b.COD_POSTAL
WHERE a.FECNAC BETWEEN ? AND ? AND a.TIPO = ?
ORDER BY a.APELLIDO1

Para realizarlo, los haríamos de la siguiente forma:

SELECT *
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY a.NOMBRE) AS num,
a.NOMBRE, a.TIPO, a.FECNAC,
a.APELLIDO1, a.COD_POSTAL, b.COD_NOMBRE
FROM usuarios AS a
INNER JOIN codpostal AS b ON a.COD_POSTAL = b.COD_POSTAL
WHERE a.FECNAC BETWEEN ? AND ? AND a.TIPO = ?
) AS sub
WHERE (num >= 30 AND num <= 40)

En caso de no necesitar ordenar por ningún campo en concreto, podemos utilizar:

ROW_NUMBER() OVER(ORDER BY (SELECT 1))

Espero que este pequeño truco os pueda ser de ayuda.

Mi primeras impresiones con Mono (mono-project.com)

Publicado en Programación con etiquetas , , , , , el 15 Octubre 2009 por febrer

header-logo

Llevo varios días trasteando con Linux, y más concretamente con el proyecto mono. Ha sido toda una aventura, pero puedo decir que lo están consiguiendo. En general no me he encontrado casi ningún problema en adaptar un desarrollo realizado con ASP.NET y VS2005 a Linux. La compilación perfecta a la primera, eso sí, con unos 100 warnings, pero sin importancia, pricipalmente referente a variables declaradas y no utilizadas. Me he encontrado más problemas con la base de datos. Mi intención era utilizar MySQL, que tan extendida esta entre desarrolladores LAMP (Linux, Apache, MySQL, PHP), pero curiosamente, no existe un paquete en Ubuntu para instalar los controladores correctos para utilizar MySQL con mono. Tampoco existe una versión del conector de MySQL para Linux, lo que hay que hacer para poder utilizarlo, es instalar una dll de windows en el GAC, que permite utilizar la librería MySql.Data.MySqlClient. Sin embargo, para bases de datos como SQLite o Postgre, ubuntu te permite instalar directamente los controladores correctos.

En lo que al entorno de desarrollo se refiere (Monodevelop.com), todavía están bastante lejos de conseguir un producto de la calidad de VS, pero tiempo al tiempo. He tenido bastantes problemas en la depuración de ASP.NET, nada que no se solucione apagando-encendiendo-entrando-saliendo. En definitiva, puedo decir que me ha alegrado mucho los avances del proyecto, y quizá en breve, el desarrollo de aplicaciones .NET en Linux, sea una realidad, aunque todavía los proveedores de internet, no hayan apostado por esta tecnología.

Comentar también que en el CodeCamp 2009, tienen destinada una sala exclusiva para programación y desarrollo con Mono. Seguro que muchos verán las posibilidades y darán el paso a desarrollar aplicaciones en Linux.

Nos vemos en el CodeCamp 2009!!!

Publicado en Eventos con etiquetas , , , el 6 Octubre 2009 por febrer

sticker

Bueno, al final me he decidido, ya tengo permiso de mi mujer e hijos para pasar un buen fin de semana en Tarragona. Me ha costado, pero merece la pena.

“CodeCamp Tarragona 2009 es un evento gratuito organizado por y para la comunidad de .NET, cuyo objetivo es reunir a profesionales, usuarios y entusiastas interesados en la plataforma .NET y Mono para intercambiar experiencias y asistir a un conjunto de ponencias realizadas por especialistas de reconocido prestigio.”

Este año cuentan con una sala dedicada exclusivamente a Mono, creo que es todo un acierto. Quien sabe, quizá en breve nos toque desarrollar aplicaciones en Linux.

Si te animas, no dudes en contactar conmigo :-) .

Más info: www.codecamp.es

Problemillas con Internet Explorer 8

Publicado en Programación con etiquetas , , , , , , el 4 Septiembre 2009 por febrer

En este post, iré comentado los diferentes problemas que me estoy encontrando tras la actualización a IE8.

- Problemas con la visualización de imágenes en GMAIL con HTTPS habilitado. 

Con la configuración por defecto de IE8, no se muestran las imágenes de los correos de GMAIL con HTTPS, aun habilitado la opción de mostrarlos en GMAIL. Esto es debido a que por defecto IE8 no permite mezclar contenido de diferente origen. Para habilitarlo:

 Herramientas -> Opciones de Internet -> Seguridad -> Nivel Personalizado -> Miscelánea -> Mostrar contenido mixto

- Problema con la depuración de javascript y IE8

Por defecto también esta deshabilitada la opción de depurar scripts en IE8, aun marcando la opción de “Habilitar depuración de scripts”, en configuración avanzada de IE8. Para habilitar la depuración de JS, lo que tenemos que hacer es incluir una entrada en el registro y reiniciar IE8: 

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main]
"TabProcGrowth"=dword:00000000

Liberando una HTC Diamond2 (Topaz) de Orange

Publicado en Tecnología con etiquetas , , , , , , , el 12 Agosto 2009 por febrer

Hace un par de días recibí de Orange Empresas un bonito regalo en forma de Móvil. Es un regalo por la antigüedad de mi mujer en Orange, es decir, un regalo por cancelar una portabilidad a otra compañía. Junto con este regalo también incluyen un descuento durante 18 meses de un 40% de la factura, todo un detalle.

En fin, a lo que vamos. Como no podía ser de otra manera, este lujoso móvil, lo tenia que estrenar yo. Y aquí viene el problema, mi actual compañía y desde hace más de 10 años es movistar, por lo que no tenía más opciones que liberar el móvil.

Investigando en HtcSpain y xda-developers, vi que ya existía una ROM original de Orange (por si había que enviar al SAT el móvil), y la información necesaria para realizar el desbloqueo (Actualización de la “radio” (no, no es la radio de música), rom, hardspl, etc …).

Total, que conseguí desbloquear el CID (para permitir la escritura del firmware), con HardSPL, puede actualizar la ROM “Cocinada” que me interesaba, todo iba viento en popa, hasta que por más que instalaba roms y radios, no conseguía desbloquearlo. Siempre el mismo mensaje “Sim bloqueada, introduzca código de desbloqueo”.

Seguí investigando y resulta que el programador del HardSPL (imprescindible para poder actualizar el firmware), a su vez tiene un negocio de desbloqueo de móviles junto con otros programadores de xda-developers,…. lo tienen bien montado. Esto no me parece mal, de alguna manera tienen que financiar sus trabajos.

Total que después de toda esta aventura para ahorrarme unos euros, no tuve más remedio que pasar por caja. Pero bueno, creo que han sido 14 € bien invertidos. Todo sea por la causa. En anteriores ocasiones con una Qtek S200 y una HTC TouchFlo, pude realizar el desbloqueo sin pasar por caja.

Comentar, como cosa curiosa, que el sistema de desbloqueo, por lo que pude observar, no tiene en cuenta el imei del móvil, por lo que el software de desbloqueo entiendo que servirá para más móviles. Lo que hacía es instalar el hardspl, una radio especial, un software llamado EnableRapi, y otro programilla que es el que realiza el desbloqueo (supongo que en breve estará accesible para todo el mundo).

Links interesantes:

http://www.htcspain.com/topaz-diamond2-f162/  –> Aqui encontraras la rom original de orange y vodafone.

http://forum.xda-developers.com/showthread.php?t=520312    –> HardSPL de olinex (ojo, si instalas esto, la mejor manera de liberarlo es utilizar su software en: http://topaz.htc-unlocks.com/

Como siempre digo, utilizar esta información solo con receta médica. No me hago responsable de los daños derivados de utilizar estos “mecanismos”, que evidentemente no están garantizados por el fabricante del producto.

Saludos!

Framework Ajax: jQuery

Publicado en Programación con etiquetas , , , el 1 Julio 2009 por febrer

Según la Wikipedia:

jQuery es una biblioteca o framework de Javascript, creada inicialmente por John Resig, que permite simplificar la manera de interactuar con los documentos HTML, manipular el árbol DOM, manejar eventos, desarrollar animaciones y agregar interacción con la tecnología AJAX a páginas web.

Actualmente, jQuery es el framework Ajax más utilizado en la red. Permite de la creación de aplicaciones Ajax de una forma rápida y sencilla.

Como componente adicional, jQuery dispone de una biblioteca para la generación de interfaces de usuario, jQuery UI. Básicamente dispone de los siguientes elementos (Widgets): Accordion, Datepicker, Dialog, Progressbar, Slider, Tabs.

Estos widgets, junto con la posibilidad de utilizar efectos (Blind, Bounce, Clip, Drop, Explode, Fold, Highlight, Puff, Pulsate, Scale, Shake, Size, Slide, Transfer) e interaciones (Drag,Drop,Resize,Select,Sort) hacen de esta biblioteca una potente herramienta para el desarrollo de aplicaciones AJAX.

A continuación os dejo un ejemplo de como implementear ‘jQuery UI Tabs’ en nuestro código HTML:

<!doctype html>
<html lang="es">
<head>
 <title>jQuery UI Tabs</title>
 <link type="text/css" href="../../themes/start/ui.all.css" rel="stylesheet" />
 <script type="text/javascript" src="../../jquery-1.3.2.js"></script>   <!-- framework jQuery -->
 <script type="text/javascript" src="../../ui/ui.core.js"></script>  <!-- librería base jQuery-UI para desarrollo de interfaces -->
 <script type="text/javascript" src="../../ui/ui.tabs.js"></script>  <!-- librería para el control tabs -->
 <script type="text/javascript">
 $(function() {
  $("#tabs").tabs(); //activamos las pestañas
 });
 </script>
</head>
<body>
 
<div id="tabs">
 <ul>
  <li><a href="#tabs-1">Pestaña 1</a></li>
  <li><a href="#tabs-2">Pestaña 2</a></li>
  <li><a href="#tabs-3">Pestaña 3</a></li>
 </ul>
 <div id="tabs-1">
  <p>Contenido pestaña 1.</p>
 </div>
 <div id="tabs-2">
  <p>Contenido pestaña 2.</p>
 </div>
 <div id="tabs-3">
  <p>Contenido pestaña 3.</p>
 </div>
</div>
</body>
</html> 

 

Verdaderamente recomendable :)

Enlaces de interes:

240 plugins para utilizar con jQuery: http://www.kollermedia.at/archive/2007/11/21/the-ultimate-jquery-plugin-list/     
Framework base: http://jquery.com/  
Framework para la creación de interfaces de usuario:  http://jqueryui.com/

Google Charts – Generando gráficos de forma dinámica

Publicado en Programación con etiquetas , , , el 29 Junio 2009 por febrer

La librería de Google Charts, nos permite generar gráficos de una manera muy simple, sin tener que instalar nada en nuestro servidor, ni realizar complejos desarrollos.
El mayor problema que veo en este tipo de servicios, es la total dependencia de los servidores de Google, el día que no les interese dar este tipo de servicios gratuitamente, no habrá más remedio que pasar por caja.
Hay que andar con ojo, y no abusar de este tipo de servicios gratuitos.

Link a la documentación de la API: http://code.google.com/intl/es/apis/chart/

Gráfico de tarta: http://chart.apis.google.com/chart?cht=p3&chd=t:60,40,12,2,2,3,4,5,12,34,60,23&chs=500×200&chl=Ene|Feb|Mar|Abr|May|Jun|Jul|Ago|Sep|Oct|Nov|Dic

 

Ejemplo de gráfico QR: http://chart.apis.google.com/chart?cht=qr&chs=100×100&chl=FebrerSoftware

 

Ejemplo de mapa: http://chart.apis.google.com/chart?cht=t&chs=400×200&chtm=europe

Cambiar clave de instalación de Microsoft Office

Publicado en Microsoft con etiquetas , , el 20 Junio 2009 por febrer

Llevaba días con la “estrellita azul” de microsoft. Porque claro, ¿a quien no le a pasado alguna vez que ha instalado sin querer, un software pirata? Estas cosas pasan, hasta en las mejores familias.
Llevaba días con la intención de desinstalar, y volver a instalar, y al final, googleando, encontré un método más sencillo, simplemente hay que borrar una entrada del registro para que la aplicación al iniciar, vuelva a solicitarnos la clave de instalación.

En esta documentación de microsoft lo explican muy clarito: http://support.microsoft.com/kb/895456/es

Como borrar el registro de transacciones (Transaction Log) en SQL Server

Publicado en Programación con etiquetas , , , el 19 Junio 2009 por febrer

El procedimiento ‘normal’ para realizar el borrado del registro de transacciones, sería el siguiente:

BACKUP LOG [MIBASEDEDATOS] WITH TRUNCATE_ONLY
DBCC SHRINKFILE(NOMBRE_LOGICO_LOG, 1)

En el caso de que sigamos obteniendo un error del tipo:

Msg 9002, Level 17, State 4, Line 1
The transaction log for database ‘MIBASEDEDATOS’ is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases

Deberemos tomar una solución más drástica, como borrar físicamente el fichero LOG en el disco. Para ello, lo primero que tenemos que hacer es ‘detachear’ o ‘Separar’ la base de datos. El procedimiento es el siguiente:

1 – Forzamos la escritura de las páginas en memoria con CHECKPOINT (repetimos varias veces este comando).
2 – Separamos la base de datos con sp_detach_db

USE [master]
GO
EXEC master.dbo.sp_detach_db @dbname = N’MIBASEDEDATOS’
GO

3 – Borrado del fichero .LDF físico existente en nuestro disco duro. Normalmente, su ubicación es:

C:\Archivos de programa\Microsoft SQL Server\MSSQL.1\MSSQL\Data\MIBASEDEDATOS.LDF (ojo, no MDF, mdf es la base de datos)

4 – Una vez eliminado el fichero .LDF, procederemos a realizar de nuevo el ‘attach’ o ‘Adjuntar’ la base de datos, de esta manera:

USE [master]
GO
CREATE DATABASE [MIBASEDEDATOS] ON
( FILENAME = N’C:\Archivos de programa\Microsoft SQL Server\MSSQL.1\MSSQL\Data\MIBASEDEDATOS.MDF’ )
FOR ATTACH
GO

Sin indicarle el fichero LDF. Automáticamente SQL Server, genera un nuevo fichero LDF de transacciones.

Espero que este método pueda serte útil.

Haciendo Ping desde ASP.NET

Publicado en Programación con etiquetas , , el 10 Junio 2009 por febrer

Esta es una sencilla manera de realizar ping’s a equipos, indicando su ip o su nombre desde una página ASP.NET.

System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();
System.Net.NetworkInformation.PingReply pingreply = ping.Send("ip_o_nombre_equipo");
txtPing.Text += "Address: " + pingreply.Address.ToString();
txtPing.Text += "Roundtrip Time: " + pingreply.RoundtripTime;
txtPing.Text += "TTL (Time To Live): " + pingreply.Options.Ttl;
txtPing.Text += "Buffer Size: " + pingreply.Buffer.Length.ToString();

Recuperando elementos web con WebRequest a través de un proxy y validación básica en destino.

Publicado en Programación con etiquetas , , , el 10 Junio 2009 por febrer

Imaginate que quieres acceder a un gráfico (gif, bmp, etc …) alojado en un servidor externo a tu red local. En nuestro ejemplo son gráficos estadísticos que nos genera nuestro proveedor de internet, al cual hay que acceder mediante una validación. A parte, disponemos de un servidor proxy en nuestra empresa para acceder a internet, que tambien requiere validación.

En este escenario, la menera más sencilla (por supuesto utilizando .NET), es utilizar los objetos NetworkCredential, WebProxy y HttpWebResponse, para recuperar el gráfico deseado.

¿Como lo hacemos?

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
 
namespace TestWebRequest
{
class Program
{
static void Main(string[] args)
{
WebRequest request = WebRequest.Create("http://url_a_nuestro_proveedor/fichero_a_recuperar");

// establecemos las credenciales para el servidor ISA SERVER
NetworkCredential credentials = new NetworkCredential("usuario", "password","dominio.com");
//creamos el objeto proxy que nos permitira acceder a internet
System.Net.WebProxy proxy = new System.Net.WebProxy("nuestro.servidorisa.com",8080);

proxy.Credentials = credentials; //asignamos las credenciales al objeto proxy

request.Proxy = proxy; //asignamos el proxy al objeto WebRequest.

// Credenciales para acceder a nuestro proveedor de internet
NetworkCredential reqCredentials = new NetworkCredential("usuario", "password");
request.Credentials = reqCredentials; // asignamos las credenciales.

WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader streamReader = new StreamReader(stream);

Console.Write(streamReader.ReadToEnd());

Console.Read();
}
}
}

Si nuestra aplicación es de tipo web, tambien podemos indicar el servidor Proxy en el fichero Web.Config de nuestra aplicación web, de esta manera:

<configuration>
  <system.net>
    <defaultProxy>
      <proxy usesystemdefault="True"
        proxyaddress="<a ref="http://nuestro_servidor_proxy:8080/">http://nuestro_servidor_proxy:8080</a>"
        bypassonlocal="True">
    </defaultProxy>
  </system.net>
</configuration>

Leyendo un fichero excel desde .NET con OLEDB

Publicado en Programación con etiquetas , , el 4 Junio 2009 por febrer

Este es un sencillo método para acceder a un fichero excel desde .NET utlizando OLEDB. Simplemente tenemos que indicar la ubicación del fichero en nuestro disco, y el nombre la la hoja a la cual queremos acceder. El paramentro HDR=NO, indica que la primera línea de la hoja excel no es el nombre de las columnas del datatable generado.

///
///
///
private DataTable GetExcel(string fileName, string sheetName)
{
OleDbConnection dbConn = null;
DataTable resultTable = new DataTable(sheetName);
// construimos la cadena de conexión.
string connString = “Provider=Microsoft.Jet.OLEDB.4.0;” +
“Data Source=” + fileName + “;Extended Properties=’Excel 8.0;HDR=NO;’”;

// creamos la conexión y la abrimos.
dbConn = new OleDbConnection(connString);
dbConn.Open();

if (!sheetName.EndsWith(“$”))
{
sheetName += ‘$’;
}
string query = string.Format(“SELECT * FROM [{0}]“, sheetName);
using (OleDbDataAdapter adapter = new OleDbDataAdapter(query, dbConn))
{
adapter.Fill(resultTable);
}

return resultTable;
}

Diferencias entre dos datatables

Publicado en Programación con etiquetas , , , el 10 Febrero 2009 por febrer

Este es un interesante script que devuelve la diferencia entre dos datatables. Su funcionamiento es similar a realizar un LEFT JOIN en Transact SQL. La diferencia es que en este método, utilizamos el objeto DataRelation de .NET. He tenido que utilizar este método ya que los origenes de los datatables, son de conexiones direferentes, por lo que la utilización de LEFT JOIN, no es posible.

///
/// Devuelve un datatable con las diferencias entre los datatables de entrada
///
///
1er datatable ///
2o datatable ///
public static DataTable Difference(DataTable First, DataTable Second)
{
//creamos una tabla vacia
DataTable table = new DataTable(“Diferencias”);

//creamos un dataSet para poder utilizar el objeto DataRelation
using (DataSet ds = new DataSet())
{
//añadimos una copia de las tablas
ds.Tables.AddRange(new DataTable[] { First.Copy(), Second.Copy() });
//creamos un dataColumn con las columnas del datatable 1.
DataColumn[] firstcolumns = new DataColumn[ds.Tables[0].Columns.Count];
for (int i = 0; i < firstcolumns.Length; i++)
{
firstcolumns[i] = ds.Tables[0].Columns[i];
}

DataColumn[] secondcolumns = new DataColumn[ds.Tables[1].Columns.Count];
for (int i = 0; i < secondcolumns.Length; i++)
{
secondcolumns[i] = ds.Tables[1].Columns[i];
}
//creamos la relación
DataRelation r = new DataRelation(string.Empty, firstcolumns, secondcolumns, false);
ds.Relations.Add(r);

//creamos las columnas en el datatable a devolver.
for (int i = 0; i < First.Columns.Count; i++)
{
table.Columns.Add(First.Columns[i].ColumnName, First.Columns[i].DataType);
}

//si la primera fila no esta en la segunda tabla, la añadimos a la tabla.
table.BeginLoadData();
foreach (DataRow parentrow in ds.Tables[0].Rows)
{
DataRow[] childrows = parentrow.GetChildRows(r);
if (childrows == null || childrows.Length == 0)
table.LoadDataRow(parentrow.ItemArray, true);
}
table.EndLoadData();
}

return table;
}

Los 25 errores de programación más peligrosos

Publicado en Tecnología con etiquetas , , , el 14 Enero 2009 por febrer

Un grupo internacional de expertos (Instituto SANS) , ha publicado la lista de los 25 errores de programación más importantes. El grupo incluye, entre otros, al ministerio de seguridad interior de EEUU y NSA, la organización japonesa IPA y empresas privadas como Microsoft y Symantec.

Entre estos errores estan los relacionados con la validación de datos introducidos en formularios por el usuario, que llevan a los ataques vía SQL-Injection o Cross-Site Scripting.

Estos errores han sido los causantes de 1.5 millones de vulnerabilidades durante el 2008, que han posibilitado que muchas de los ordenadores utilizados para visitar los sitios afectados se conviertan en zombis.

Ésta es la lista de errores traducida por Andrés Panitsch: 
http://desdesarrollodesoftware.blogspot.com/2009/01/errores-de-programacin-los-25-ms.html

Fuente original: Instituto SANS, y detalle de vulnerabilidades.

Visifire 2.0 – ya funciona con WPF!!!

Publicado en WPF con etiquetas , , , el 2 Diciembre 2008 por febrer

Visifire es un producto para representar gráficos estadísticos completisímo. Es un producto gratuito “Open Source” de gran calidad.

En sus primeras versiones, este producto solo funcionaba con Silverlight, pero en esta versión, han dado el paso a WPF.

En el siguiente post hay más información al respecto:
http://www.visifire.com/blog/2008/11/21/visifire-20-beta-release/

Os dejo unas capturas del componente: