Posts recientes

El contenido de este blog tiene una licencia Creative Commons.
Creative Commons

Solucionar problema con la intercalación desde linq

En caso de necesitar realitzar búsquedas contra el motor de base de datos sin tener en consideración mayúsculas/minusculas, acentos y otros símbolos de puntuación, desde SQL Server es necesario que la base de datos use una intercalación *_CI_AI
Pero aunque la base de datos esté bien configurada para que las consultas sean no sensitivas a este tipo de carácteres, si se realiza la consulta desde nuestra aplicación la consulta no será efectiva puesto que desde linq no se explota la facilidad que nos ofrece la base de datos.
Para solucionar esto hay un método que es el que muestro en el siguiente código:
string ntext = new string("TEXTO_A_BUSCAR".Normalize(NormalizationForm.FormD).Where(c => c < 128).ToArray());
Lista = Lista.Where(x => (UTF8Encoding.UTF8.GetString(UTF8Encoding.GetEncoding("ISO-8859-8").GetBytes(x.CAMPO_BD)).IndexOf(ntext, StringComparison.InvariantCultureIgnoreCase) > -1)).ToList();

En la primera instrucción normalizamos el texto a localizar en la base de datos, y en la segunda se realiza la búsqueda en sí misma sobre el campo de la base de datos con el cual deseamos hacer el filtro.

Espero que os sirva de ayuda.

Autor: David Acosta Lesmes
Publicado: 03/02/2012  14:43 | 0  Comentarios | 0  Enlaces a este post

Error en el diseño de formularios: 'child' is not a child of this parent

Si alguna vez estáis en el desarrollo de un proyecto, y mientras estáis diseñando una página os aparece de buenas a primeras el error:  << 'child' is not a child of this parent >>, y no os deja acceder al diseño del fórmulario lo que deberíais hacer es acceder al "Designer" del formulario y dentro del procedimiento InitializeComponent() localizar la definición del formulario y añadir una línea por cada control existente en el formulario que tenga la siguiente estructura:

this.Controls.Add(this.myControlName);

Con esta sencilla instrucción para cada uno de los controles existentes solventaréis el error y podréis seguir trabajando con el formulario que se había corrompido.
Autor: David Acosta Lesmes
Publicado: 23/09/2010  9:24 | 0  Comentarios | 0  Enlaces a este post

Zeta Resource Editor: Edita tus ficheros de recursos .NET en paralelo

Zeta Resource Editor es una aplicación gratuita que te permite editar múltiples ficheros de recursos de Microsoft .NET en un simple grid.

Esta forma de representar la información de los ficheros de recursos nos simplifica las traducciones de textos a los distintos idiomas de forma muy sencilla e intuitiva, a la vez que incorpora un gestor de archivos de recursos bastante completo.

Aunque en su versión 2 todavía está en inglés y alemán, su intuitiva interfaz de usuario te permite trabajar aunque no domines estos idiomas y seguro que también guarda alguna que otra sorpresa.

Podéis descargarla desde su web: http://www.zeta-resource-editor.com/.

Autor: Emilio Martín
Publicado: 12/05/2010  13:14 | 0  Comentarios | 0  Enlaces a este post

RS232 Connection from VBScript

A partir del VS2005 hay un COM integrado en el sistema que nos permite trabajar con los puertos serie, así pues este ejemplo lo que hace es explotar las posibilidades de este COM para nuestro objetivo que en este momento se trata de recibir datos a través del RS232.
 
' VBScript File

Function StartComPort()
    ' Se crea el objecto MSComm que realizará la conexión con el puerto
    Dim MSComm1
    Set MSComm1 = CreateObject("MSCOMMLib.MSComm")
    ' Configuración de la conexión: 4800 Bauds, Parity None, DataBits 8, StopBits 1
    MSComm1.Settings = "4800,n,8,1"
    ' Se localiza y se abre el puerto
    Dim i
    i = 1
    Do While i<=10
        MSComm1.CommPort = i
        MSComm1.InBufferCount = 0
        MSComm1.PortOpen = True
        If Err Then
            MSComm1.PortOpen = False
            i = i + 1
        Else
            i = 11
        End If
    Loop
    
    If (MSComm1.PortOpen = True) Then
        ' Variable donde se guarda el valor que nos facilita el RS232
        Dim Buffer 
        Buffer = ""
        ' Quedamos a la espera del valor del RS232
        Do
            Buffer = Buffer & MSComm1.Input
        Loop Until InStr(Buffer, vbCrLf)
        ' Se cierra el puerto
        MSComm1.PortOpen = False
        ' Se libera la memoria
        Set MSComm1 = Nothing
        ' Valor del RS232
        StartComPort = Buffer
    Else
        StartComPort = ""
    End If
End Function
 
Espero os sirva de ayuda.
Autor: David Acosta Lesmes
Publicado: 20/04/2010  17:57 | 0  Comentarios | 0  Enlaces a este post

Consejos para mejorar el rendimiento de tu Entity Framework (VI)

Cargar objetos con el EF.
Desde el framework puedes cargar relaciones usando  include. Por cada uno, el framework añadirá un join que puede originar consultas complejas, y que sean devueltas grandes cargas de datos. A este tipo de cargas se les llama "Eager loading".
Sin embargo, esto puede ser evitado usando el método Load para hacer "lazy or explicit loading”, que abre una conexión a base de datos para recuperar la información necesaria.
Así nos aseguramos de que la consulta  sólo ejecutará una petición a un objeto relacionado mediante una petición explícita.
Por ejemplo:
// Get a specified customer by contact ID.
Contact customer = context.Contact.Where("it.ContactID = @customerId", 
                   new ObjectParameter("customerId", customerId)).First();
// Load the orders for the customer
if (!customer.SalesOrderHeader.IsLoaded)
{
    customer.SalesOrderHeader.Load();
}
El código completo  de este ejemplo se  encuenta en este artículo del msdn de Microsoft.
 
Filtra los datos.
Cuando se usa este tipo de carga (con Load o con LoadWith) se reciben todos los datos asociados con la clave primaria, pero la mayoría de los casos se deben aplicar filtros adicionales. Para ello se usa el método  DataLoadOptions.AssociateWith, que toma el criterio al cargar los datos como parámetro y aplica la consulta.  
using (DataContext context = new DataContext())
{
  DataLoadOptions options = new DataLoadOptions();
  options.AssociateWith(cat=> cat.Products.Where(prod => !prod.Discontinued));
  context.LoadOptions = options;
}
 
Autor: Isabel Cabezas
Publicado: 19/03/2010  9:23 | 0  Comentarios | 0  Enlaces a este post

Consejos para mejorar el rendimiento de tu Entity Framework (IV)

Usar consultas pre-compiladas.

La creación de consultas consume sobre un 10% de la ejecución de ésta. Algunas partes se cachean y las siguientes son más rápidas, pero otras partes no, así que se reconstruye cada vez que la consulta se ejecuta (a no ser que se use EntitySql).

Por eso cuando una aplicación ejecuta muchas veces consultas que tienen una estructura similar en EF se mejora el  rendimiento si se compila la consulta una vez y se ejecuta varias veces con parámetros diferentes que son especificados en tiempo de ejecución. 
Para ello se usa el método CompiledQuery.Compile, el cual usa un delegado Func genérico. Almacenando y usando de este modo también se reduce el coste de hacer una llamada virtual, cada vez que accedes a la colección, que de hecho se reduce a una llamada. Además, ésta será compilada sólo la primera vez que la consulta se ejecute. Pero, si usas CompiledQuery , asegúrate de que se llama a la consulta más de una vez, ya que  la primera vez que se lanza, tarda el doble de tiempo que una consulta simple sin cachear.

Éste es el ejemplo  de Microsoft  para la creación de una consulta compilada:

static readonly Func> s_compiledQuery2 = 
    CompiledQuery.Compile>(
            (ctx, total) => from order in ctx.SalesOrderHeader
                            where order.TotalDue >= total
                            select order);


Para más información, o ver el código completo se puede consultar el artículo completo de Microsoft.

Via: http://msdn.microsoft.com/en-us/library/bb399335.aspx

Autor: Isabel Cabezas
Publicado: 05/03/2010  9:22 | 0  Comentarios | 0  Enlaces a este post

Consejos para mejorar el rendimiento de tu Entity Framework (III)

Deshabitar el control de cambios.
Una instancia ObjectContext  crea un  objeto ObjectStateEntry que se encargará de seguir los cambios que se hacen en las entidades (las propiedades se marcan como modificadas y pero también se guardan los valores originales).
Este seguimiento provoca una carga, que es innecesaria si el objeto no se va a modificar o si se envian los datos a través de un webservice, y que puede reducirse usando la opción MergeOption.NoTracking.

Deshabitar la Concurrencia Optimista.
Linq to SQL admite el control de simultaneidad optimista (técnica que antes de relizar un cambio investiga si otras transacciones han cambiado los valores de una fila antes de que se envíen los cambios, y que bloquea el registro para evitar los conflictos de simultaneidad).
Sin embargo, si la aplicación no tiene problemas de concurrencia, o si puede ejecutarse en modo "la última actualización gana", entonces la carga generada por el UpdateCheck es innecesaria. Por eso se especifica UpdateCheck.Never para deshabilitar la concurrencia en Linq to SQL.
Autor: Isabel Cabezas
Publicado: 26/02/2010  9:21 | 0  Comentarios | 0  Enlaces a este post

Consejos para mejorar el rendimiento de tu Entity Framework (I)

Entity Framework es un conjunto de tecnologías de ADO.NET que posibilita el desarrollo de aplicaciones de software orientadas a datos, que permite a los programadores elevar el nivel de abstracción cuando se trabaja con datos (menos código de acceso, menos mantenimiento, estructura más manejable, y persistencia). Para ello, Entity Framework (EF a partir de ahora),  define objetos a partir del modelo de datos.
Cuanto mayor sea nuestra base de datos y más datos, tablas e interconexiones entre ellas, más importante será mantener una buena política en cuanto al uso del EF, para que su eficiencia y rendimiento sean óptimos. Durante las próximas semanas enumeraré  algunas buenas prácticas que todos deberíamos tener en cuenta cuando generemos nuestro Entity.

Cadenas de conexión
Cuando se crean los Object Queries se recupera la cadena de conexión del archivo .config, sin embargo, hay otra forma de suministrársela: cuando se instancia el ObjectContext (en la propiedad ConnectionString del objeto EntityConnection).

Ubicación de los metadatos y asignaciones del EDM

Los archivos de metadatos y asignaciones del EDM, frecuentemente se desarrollan ir en el mismo directorio del archivo ejecutable de la aplicación, sin embargo, para mejorar el rendimiento, podemos incluidos la solución. Para ello:
1) Abre el proyecto con el EF
2) Abrir el EDMX.
3) Hacer click en el fondo, y abrir la ventana de propiedades.
4) Cambiar la propiedad Procesamiento de artefactos de metadatos (Metadata Artifact Processing) a Incrustado en el ensamblado de salida (Embed in Output Assemply).
Los recursos embebidos se especifican en la propiedad Metadata del connectionString, de la siguiente forma:
Metadata=res://<assemblyFullName>/<resourceName>

Además, es mejor no usar caracteres comodín (*) en la propiedad assemblyFullName para evitar que el EF haga una búsqueda de los recursos en todos los lugares especificados.

Debajo, en un extracto de un web.config,  se puede ver un ejemplo del parámetro connectionString, con  la propiedad metadata, en la que se especifica el ensamblado con nombre OSK.Core.EntityModel.dll

<connectionStrings>
  <
add name="OSKEntities"   connectionString="
metadata=res://OSK.Core.EntityModel,Version=1.0.0.0,
          Culture=neutral,   PublicKeyToken=null/;
          provider=System.Data.SqlClient; provider connection string=
&quot;
         
Data Source=DEIMOS;Initial Catalog=OSK;
          Integrated Security=True;MultipleActiveResultSets=True
&quot;"
          providerName="System.Data.EntityClient"
/>
</
connectionStrings
>

Via: Connection Strings (Entity Framework)

Autor: Isabel Cabezas
Publicado: 29/01/2010  13:12 | 0  Comentarios | 0  Enlaces a este post