jueves, 30 de enero de 2014

VB.NET ¿Cómo encontrar un elemento en una lista genérica?


Para encontrar un elemento de una determinada clase en una lista genérica podemos usar una función delegada como se muestra a continuación. En el ejemplo tenemos una lista de usuarios (clase 'Usuario') y deseamos encontrar uno conociendo su login (atributo 'login' de la clase 'Usuario').

Código en VB.NET:
Dim listUsuarios As List(Of Usuario) 
Dim loginUsuario As String 
Dim encontrado As Boolean  

......

If listUsuarios.Exists(Function(usu As Usuario) usu.login = loginUsuario) Then
    encontrado = True
End If

viernes, 20 de septiembre de 2013

ASP.NET ERROR en ValidatorCalloutExtender. "El control extensor 'xxx' no es un control extensor registrado."


 PROBLEMA 

Durante la ejecución surge el error siguiente:
El control extensor 'vce1_ValidatorCalloutExtender' no es un control extensor registrado. Los controles extensores deben registrarse mediante RegisterExtenderControl() antes de llamar a RegisterScriptDescriptors(). Nombre del parámetro: extenderControl

siendo vc1_ValidatorCalloutExtender el nombre de nuestro ValidatorCalloutExtender .

El problema aparece al usar un ValidatorCalloutExtender dentro de una sección div (o similar) que tenga el atributo visible="false".
 

 SOLUCIÓN 

Este bug puede ser evitable si dejamos el atributo visible de la sección div a true (su valor por defecto), e introducimos la acción de ocultar la sección div en el code behind, por ejemplo en el evento de página PreRenderComplete. Para ello habrá que introducir en la etiqueta div los atributos runat=server y id=div1 para que sea accedible desde el code behind.

Código en C#:
<div ID="div1" runat="server">


----

protected void Page_PreRenderComplete(Object sender, EventArgs e)
{
div1.visible= false;
}

jueves, 14 de febrero de 2013

ADO.NET ERROR. "En EntityDataSource, se debe especificar bien Type o bien DbType ..."


 PROBLEMA 

Durante la ejecución surge el error siguiente:
En EntityDataSource, se debe especificar bien Type o bien DbType (pero no ambos) para cada Parameter.

El problema aparece al usar la propiedad Where de un EntityDataSorce,
 

 SOLUCIÓN 

Vemos en la imagen de abajo, el editor de expresiones para la propiedad Where de un EntityDataSource. En la caja de la expresión establecemos la igualdad entre el atributo ID de la Entidad con un valor idTramite pasado por parámetro. Dicho parámetro se establece con el valor de la variable de sesión IDTRAMITE. Esto se configura en la parte inferior derecha, pero nosotros no hemos indicado en ningún sitio el tipo de datos del parámetro, y esto precisamente es lo que causa el error.

Para resolver el error basta con entrar en "Mostrar propiedades avanzadas" y establecer el tipo de datos en la propiedad 'Type' con el valor que corresponda, por ejemplo, Int32.



jueves, 24 de enero de 2013

ADO.NET Entity Framework y Oracle OTN. Error en ejecución "El valor especificado no es una instancia de tipo 'Edm.Decimal'".


 PROBLEMA 

Durante la ejecución surge el error siguiente “El valor especificado no es una instancia de tipo 'Edm.Decimal'. Nombre del parámetro: value”. Sin embargo, no existe ninguna propiedad de tipo Decimal en ninguna entidad del modelo de Entity Framework.

El error es causado por una propiedad de tipo Int32 que mapea un campo de tipo NUMBER (sin especificar longitud ni escala) en la tabla correspondiente.
 

 SOLUCIÓN 

Se arregla especificando longitud y escala de forma que el tipo del campo en la tabla sea NUMBER (10,2).

martes, 6 de noviembre de 2012

WF.NET. y WCF.NET. "ERROR: No se puede encontrar la cadena de conexión para el nombre de conexión 'ApplicationServerWorkflowInstanceStoreConnectionString'."



 PROBLEMA 

Al acceder a un Web Service de Flujo de Trabajo (.xamlx) en IIS con AppFabric habiendo establecido el almacén de persistencia de flujo de trabajo por defecto (defaultSqlPersistenceStore) se obtiene el siguiente error "ERROR: No se puede encontrar la cadena de conexión para el nombre de conexión 'ApplicationServerWorkflowInstanceStoreConnectionString'."


 SOLUCIÓN 

Hay que poner la propiedad  "Habilitar aplicaciones de 32 bits" (Enable 32-bit application) del grupo de aplicaciones (Application Pools) correspondiente al Web Service que falla, a False.


Para cambiar dicha propiedad en IIS7, localiza 'Application Pools' en el 'IIS Manager':




Entra en el grupo de aplicaciones correspondiente al servicio que está fallando:





Cambia el valor de la propiedad 'Enable 32-bit Applications' a False.







martes, 2 de octubre de 2012

ADO.NET Entity Framework. Error "... mientras se actualizaban las entradas." debido a problema en la propiedad StoreGeneratedPattern


 PROBLEMA 

Se produce el error de abajo al depurar una aplicación .NET 4.0 VS2010 con modelo de datos ADO.NET Entity Framework, teniendo un atributo clave de entidad con la propiedad StoreGeneratedPattern con valor "Identity". Utilizamos StoreGeneratedPattern= "Identity" cuando dicho atributo clave se mapea con un campo de la tabla definido como clave primaria y que cuyo valor se establece automáticamente mediante un trigger en la base de datos. Por lo que no deseamos que el modelo ADO.NET establezca el valor del atributo.

System.ServiceModel lanza la siguiente excepción:
"Se produjo un error mientras se actualizaban las entradas. Vea la excepción interna para obtener detalles."

 SOLUCIÓN 

Parece que se debe a un defecto bug en el ADO.NET Entity Framework.

El problema radica en que el diseñador de modelos Entity Framework no establece automáticamente la propiedad StoreGeneratedPattern= "Identity" en la sección del modelo de almacenamiento (SSDL) mientras que sí lo hace en el modelo conceptual (CSDL). Esto se puede comprobar y corregir en el archivo EDMX del modelo, editándolo con el editor de xml.

En el siguiente ejemplo observamos como en el diseñador de modelos hemos establecido el atributo id de la entidad TarjetaMovil con la propiedad StoreGeneratedPattern= "Identity".


Si editamos el archivo .edmx correspondiente a dicho modelo observarermos los siguiente, siendo TEL_TARJETAS_MOVIL la tabla que se asigna a la entidad TarjetaMovil. La definicion de StoreGeneratedPattern aparece en su sitio en el modelo CSDL pero no en el modelo SSDL.
 
<edmx:StorageModels>
        .....
<EntityType Name="TEL_TARJETAS_MOVIL">
<Key><PropertyRef Name="ID" /></Key>
<Property Name="ID" Type="number" Nullable="false" />
        .....
        .....
<edmx:ConceptualModels>
<Key><PropertyRef Name="id" /></Key>
<EntityType Name="TarjetaMovil">
        .....
<Property Type="Int32" Name="id" Nullable="false" annotation:StoreGeneratedPattern="Identity" >


Para resolver el problema bastará con añadir StoreGeneratedPattern="Identity" (ATENCIÓN: sin incluir annotation:) en el lugar correspondiente del modelo de almacenamiento como se ve a continuación:

<edmx:StorageModels>
        .....
<EntityType Name="TEL_TARJETAS_MOVIL">
<Key><PropertyRef Name="ID" /></Key>
<Property Name="ID" Type="number" Nullable="false" StoreGeneratedPattern="Identity" />


martes, 11 de septiembre de 2012

VB.NET ¿Como ordenar una lista genérica de objetos sin modificar la clase a la que pertenecen?


Para ello es necesario que la clase de los objetos a ordenar implementen la interfaz IComparable. Si no podemos o no deseamos modificar la clase de los objetos en cuestión y esta no implementa el interfaz IComparable, podremos usar el método Sort, al cual se le pasa como parámetro una función delegada con el método de comparación. En el método de comparación utilizaremos algún atributo de la clase original cuyo tipo implemente el método CompareTo.


En el ejemplo deseamos ordenar una lista genérica de objetos de la clase 'Persona', para ello utilizaremos el atributo 'dni' que es tipo integer.

Código en VB.NET:
Dim listaPersonas As List(Of ClasePersona)

----

listaPersonas.Sort(Function(persona1 As ClasePersona, persona2 As ClasePersona)
    
persona1.dni.CompareTo(persona2.dni))