jueves, 24 de febrero de 2011

Almacenando objetos complejos usando localStorage

En principio solo es posible almacenar parejas clave valor, pero se puede serializar el objeto javascript en un texto JSON y almacenarlo como value.
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Prueba LocalStorage</title>
        <script src="javascripts/jquery-1.5.min.js" type="text/javascript"></script>
  <script>
  
  var items = {'18': 4 , '17' : 44 , '16' : 84};
  
  $(document).ready(function() {
   $("#main").append("<div>Original items:" + JSON.stringify(items) + "</div");
   localStorage.setItem('varItems', JSON.stringify(items));
   var savedItems = localStorage.getItem('varItems');
   $("#main").append("<div>Saved items:" + savedItems + "</div>");
  });
  </script>
</head>
<body>
  <div id="main"></div>
</body>
</html>

viernes, 11 de febrero de 2011

Evento al cierre de browser en Visual WebGui

En Visual WebGui existe el evento ThreadSuspend que se ejecuta cuando cerras la ventana del browser, apretas F5 o navegas otra url.

public void RegisterThreadSuspendHandler()
{
  Application.ThreadSuspend += new EventHandler(Application_ThreadSuspend);
}

void Application_ThreadSuspend(object sender, EventArgs e)
{
  //Codigo para cierre de form
}

lunes, 7 de febrero de 2011

Clases para validación de superposición de rangos

Método que las utiliza:  
static bool RangosSuperpuestos(DataRow dr, string pHoraInicio, string pHoraFin)
{
     DateTime horaIniciodr = DateTime.Parse(dr["Inicio"].ToString());       
     DateTime horaFindr = DateTime.Parse(dr["Fin"].ToString());
     DateTime horaInicio = DateTime.Parse(pHoraInicio);
     DateTime horaFin = DateTime.Parse(pHoraFin);
     return Range.Overlap(new Range(horaIniciodr, horaFindr), new Range(horaInicio, horaFin));
}
Clases Auxiliares:
class Range
{
   public readonly T Start;
   public readonly T End;

   public Range(T start, T end)
   {
        Start = start;
        End = end;
   }
}

static class Range
{
   public static bool Overlap(Range left, Range right) where T : IComparable            
   {
      if (left.Start.CompareTo(right.Start) == 0)
      {
         return true;
      }
      else if (left.Start.CompareTo(right.Start) > 0)
      {
         return left.Start.CompareTo(right.End) <= 0;
      }
      else
      {
         return right.Start.CompareTo(left.End) <= 0;
      }
  }
}

miércoles, 2 de febrero de 2011

Metodo para grabar texto en un archivo usando C#

public void LogText(string text,bool logDate)
{
 string path = @"C:\texto.log";
 FileStream fs;
 if (!File.Exists(path))
   fs=File.Open(path,FileMode.Create,FileAccess.Write);
 else
   fs = File.Open(path, FileMode.Append, FileAccess.Write);
 using (var outfile =new StreamWriter(fs,Encoding.UTF8))
 {
   string logLine = string.Empty;
   if (logDate)
    logLine = String.Format("{0:G} - {1}.", System.DateTime.Now, text);
   else
    logLine = text;
   outfile.WriteLine(logLine);
 }
 fs.Close();
}

viernes, 14 de enero de 2011

Quitar texto entre < > en una cadena

public static string RemoveTags (string str)
{
   return Regex.Replace (str, "<.*?>", string.Empty);
}

sábado, 20 de noviembre de 2010

Obtener el tamaño de todas las tablas de una base de datos en SQL Server

DECLARE @TableName VARCHAR(100)    --For storing values in the cursor

--Cursor to get the name of all user tables from the sysobjects listing
DECLARE tableCursor CURSOR
FOR
select [name]
from dbo.sysobjects
where  OBJECTPROPERTY(id, N'IsUserTable') = 1
FOR READ ONLY

--A procedure level temp table to store the results
CREATE TABLE #TempTable
(
    tableName varchar(100),
    numberofRows varchar(100),
    reservedSize varchar(50),
    dataSize varchar(50),
    indexSize varchar(50),
    unusedSize varchar(50)
)

--Open the cursor
OPEN tableCursor

--Get the first table name from the cursor
FETCH NEXT FROM tableCursor INTO @TableName

--Loop until the cursor was not able to fetch
WHILE (@@Fetch_Status >= 0)
BEGIN
    --Dump the results of the sp_spaceused query to the temp table
    INSERT  #TempTable
        EXEC sp_spaceused @TableName

    --Get the next table name
    FETCH NEXT FROM tableCursor INTO @TableName
END

--Get rid of the cursor
CLOSE tableCursor
DEALLOCATE tableCursor

--Select all records so we can use the reults
SELECT *
FROM #TempTable
ORDER BY tableName ASC
--Final cleanup!
DROP TABLE #TempTable

GO

viernes, 19 de noviembre de 2010

Buscar en el contenido de un stored procedure

SELECT Name,OBJECT_DEFINITION(OBJECT_ID) AS Code
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%cadena_de_busqueda%'

miércoles, 17 de noviembre de 2010

Obtener stored procedures modificados en los ultimos n dias.

Ejemplo para 7 dias:
SELECT name,modify_date
FROM sys.objects
WHERE type = 'P'
AND DATEDIFF(D,modify_date, GETDATE()) < 7
ORDER BY modify_date DESC

sábado, 23 de octubre de 2010

Creando o modificando datos con SQLite

SQLite posee un comando que permite en una sola sentencia crear o modificar datos de una tabla, con la condición que posea una clave primaria o indice único (esto ultimo lo tengo que verificar)
Ejemplo:

var parameters = new List<sqliteparameter>
    {
    new SQLiteParameter("campo1", "valorCampo1"),
    new SQLiteParameter("campo2", "valorCampo2"),
    new SQLiteParameter("campo3", "valorCampo3"),
    new SQLiteParameter("campo4", "valorCampo4"),
    new SQLiteParameter("campo5", "valorCampo5"),
    new SQLiteParameter("Fecha", DateTime.Now)
    };
var query = new StringBuilder();
query.AppendLine("INSERT OR REPLACE INTO ");
query.AppendLine("Tabla(campo1,campo2,campo3,campo4,campo5,Fecha) ");
query.AppendLine("VALUES(@campo1,@campo2,@campo3,@campo4,@campo5,@Fecha)");
return query.ToString();

sábado, 3 de julio de 2010

Obtener datos de una planilla excel usando un OleDbDataAdapter

Requisitos: 
La planilla debe estar guardada en formato excel 2003, el nombre de la hoja no debe superar los 8 caracteres.

var file = @"F:\1.xls";
var cs = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties='Excel 8.0;HDR=NO;IMEX=1;'", file);

var adapter = new OleDbDataAdapter("SELECT * FROM [Hoja1$]", cs);
var ds = new DataSet();
adapter.Fill(ds);
DataTable data = ds.Tables[0];

foreach (DataRow dr in data.Rows)
{
        //Hago algo con los datos
}

sábado, 10 de octubre de 2009

Usando HttpModules y HttpHandlers

Muchas veces necesitamos realizar tareas antes de que una pagina sea solicitada [es comun realizar conteos de estadisticas, validacion de permisos,etc]. Tenemos dos maneras de injectar logica al pipeline request: HttpHandlers y HttpModules.
HttpModule 
Podemos ver al HttpModule como una forma de injectar logica basada en eventos. Cuando un cliente solicita un recurso se inica un pipeline request que dispara una serie de eventos.
  • AcquireRequestState   
  • AuthenticateRequest   
  • AuthorizeRequest   
  • BeginRequest   
  • Disposed   
  • EndRequest   
  • Error   
  • PostRequestHandlerExecute   
  • PreRequestHandlerExecute   
  • PreSendRequestContent   
  • PreSendRequestHeaders   
  • ReleaseRequestState   
  • ResolveRequestCache   
  • UpdateRequestCache   
Un HttpModule no es mas que una clase que implementa la interfaz IHttpModule, que tiene los siguientes metodos [Init y Dispose] requeridos. Dentro del metodo Init recibimos un parametro HttpApplication, en el que tenemos el estado actual del sitio, este es ejecutado antes que cualquier evento asociado al recurso que se esta solicitando, de manera que es el lugar en el que nos subscribiremos a los eventos que necesitemos manejar.
Registrando un HttpModule
<httpmodules>
<add type="classname, assemblyname" name="modulename" />
<httpmodules>

viernes, 2 de octubre de 2009

Desactivando constraints SQL Server

Desactivar todas las Constraints
exec sp_MSforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'

Desactivar todos los Triggers
exec sp_MSforeachtable 'ALTER TABLE ? DISABLE TRIGGER ALL'

Activar todas las Constraints soo
exec sp_MSforeachtable 'ALTER TABLE ? CHECK CONSTRAINT ALL'

Activar todos los Triggers
exec sp_MSforeachtable 'ALTER TABLE ? ENABLE TRIGGER ALL'

Esto es util para limpiar el contenido una base de datos, evitando que sql server valide las claves foraneas, ejecute triggers al eliminar registros, etc. Ideal para entornos de desarrollo o migracion, no recomendado para entornos en produccion.

Fuente: Foro SQL Server Magazine

sábado, 30 de mayo de 2009

Configurando WCF sin autenticacion

Quitar la autenticación nos permite realizar pruebas de funcionalidad sobre el servicio, ya que es la forma mas simple de configurarlo.
Para hacerlo configuramos el servicio en modo de seguridad None, desactivando la seguridad el endpoint a través de un binding que tenga el modo de seguridad en None).
Agregar dentro de la colección bindings lo siguiente,
<basicHttpBinding>
<binding name="httpconfig" >
<security mode="None"></security>
</binding>
</basicHttpBinding>
</bindings>
y modificar el del servicio de esta forma
<endpoint address="" binding="basicHttpBinding" contract="UpdateService.IUpdateService" bindingConfiguration="httpconfig">
Del lado del servidor los servicios se encuentran entre los tags services y del lado del cliente dentro de los tags client.

viernes, 29 de mayo de 2009

Como poner en cero la parte de hora de una variable o columna en SQL Server

DATEADD(dd, 0, DATEDIFF(dd, 0, **FECHA**))
Da como resultado:
SELECT GETDATE()
2009-05-29 16:07:18.373
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
2009-05-29 00:00:00.000
Probado en SQL Server 2005

jueves, 29 de mayo de 2008

Experiencias Configurando WCF + IIS

Posibles causas de la excepcion:
- Error de tipeo al definir el atributo Service dentro de la definicion ServiceHost del servicio.
El tag ServiceHost tiene la siguiente estructura y la definicion es case sensitive, por lo q un error de tipeo es posible.

<%@ ServiceHost Language="C#" Debug="true" Service="UpdateService.UpdateService" CodeBehind="UpdateService.svc.cs" %>
- El tipo definido se encuentra en un assembly dentro de una subcarpeta (puede ser bin o App_Code) que no se incluyo en el sitio. Es posible que el motor este intentando localizar el tipo dentro de una subcarpeta y esta no exista.

Detalle de la Excepcion

Error de servidor en la aplicación '/App/SVC'.

No se encontró el tipo 'UpdateService.UpdateService', proporcionado como el valor del atributo Service en la directiva ServiceHost.

Descripción: Excepción no controlada al ejecutar la solicitud Web actual. Revise el seguimiento de la pila para obtener más información acerca del error y dónde se originó en el código.

Detalles de la excepción: System.InvalidOperationException: No se encontró el tipo 'UpdateService.UpdateService', proporcionado como el valor del atributo Service en la directiva ServiceHost.

Error de código fuente:

Se ha generado una excepción no controlada durante la ejecución de la solicitud Web actual. La información sobre el origen y la ubicación de la excepción pueden identificarse utilizando la excepción del seguimiento de la pila siguiente.

Seguimiento de la pila:


[InvalidOperationException: No se encontró el tipo 'UpdateService.UpdateService', proporcionado como el valor del atributo Service en la directiva ServiceHost.]
System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost(String constructorString, Uri[] baseAddresses) +4073642
System.ServiceModel.HostingManager.CreateService(String normalizedVirtualPath) +11659932
System.ServiceModel.HostingManager.ActivateService(String normalizedVirtualPath) +42
System.ServiceModel.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath) +479

[ServiceActivationException: El servicio '/SVC/UpdateService.svc' no se puede activar debido a una excepción producida durante la compilación. El mensaje de excepción es: No se encontró el tipo 'UpdateService.UpdateService', proporcionado como el valor del atributo Service en la directiva ServiceHost..]
System.ServiceModel.AsyncResult.End(IAsyncResult result) +11531006
System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) +194
System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous(HttpApplication context, Boolean flowContext) +176
System.ServiceModel.Activation.HttpModule.ProcessRequest(Object sender, EventArgs e) +278
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +68
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75


Información de versión: Versión de Microsoft .NET Framework:2.0.50727.3082; Versión ASP.NET:2.0.50727.3082