sábado, 18 de septiembre de 2010

Interop COM Exception

Introducción

Tengo una aplicación desarrollada para el NET Framework 3.5 SP1 y la he publicado en mi IIS local.

Contexto

Windows 7 64 bits, SQL Server Express 2008 R2, IIS 7

Solución
  1. Permitir 32 bit.

image

image

  1. Autorizar al usuario IUSR en la carpeta donde se encuentre registrado el componente COM.

image

  1. Autorizar al usuario en la base de datos.

 

image

Contexto

Windows Server 2008 Estándar de 32bit

Problema

Retrieving the COM class factory for component with CLSID {E95C0FB5-A09E-46F6-9CB3-ADD6B866A38A} failed due to the following error: 80040154.

System.Runtime.InteropServices.COMException: Retrieving the COM class factory for component with CLSID {E95C0FB5-A09E-46F6-9CB3-ADD6B866A38A} failed due to the following error: 80040154

Solución

Simplemente registrar el componente con regsvr32. Si no conoce qué componente es busque el GUID con regedit.

viernes, 25 de junio de 2010

Error al instanciar MS Outlook Application desde un complemento de MS Project

Durante el desarrollo de un complemento (Addin) para MS Project que se conecta con Outlook me encontré el siguiente error COM al intentar crear el objeto Application de Outlook:
Código
using MSOutlook = Microsoft.Office.Interop.Outlook;
...
MSOutlook.Application outlook = new  MSOutlook.Application();



Excepción (Exception)


Error al recuperar un generador de clases COM para el componente con CLSID {0006F03A-0000-0000-C000-000000000046} debido al siguiente error: 80080005.


La solución


Aunque tediosa por lo lenta, fue reparar la instalación de Visual Studio Tools for Office y de Office (en mi caso versiones 2010) desde el panel de control.


image


image


Lamentablemente no hice la reparación en partes, por lo que no supe si sólo con una de las dos reparaciones se corrige el problema. Dejo un voto para la reparación de Office.




---(Fin)---

lunes, 24 de mayo de 2010

Operador LIKE y COLLATION. Comparación de cadenas Unicode y no Unicode

El problema

Un amigo me preguntó la causa de que sus procedimientos almacenados no funcionaran bien con las comparaciones de cadenas a partir de instalar su base de datos con cierta intercalación (collation) de SQL Server 2008.

Su base de datos tiene varios años de evolución y maduración y se ha migrado desde SQL Server 2000. Originalmente la base de datos se había creado con una intercalación de SQL Server (la famosa SQL_Latin1_General_CP1_CI_AS). Cuando se migró a SQL Server 2008 se decidió actualizar la intercalación a una moderna de Windows llamada Latin1_General_100_CI_AI (Unicode no sensible ni a mayúsculas ni a los acentos).

A partir de entonces las comparaciones simples de variables de cadena en los procedimientos almacenados no funcionaban y esta consulta literal tan simple de comparación mediante LIKE, devolvía un resultado contrario al esperado, es decir devuelve “No” en vez de “Yes”:

IF '/SYSTEM_ROOT/DEVELOPMENT_COMPANY/DEVELOPMENT' LIKE'%/DEVELOPMENT'
SELECT 'Yes' as
IsLikeLiteral
ELSE
SELECT
'No' as
IsLikeLiteral

Lógicamente aquí era de esperar que la cadena “[lo que sea antes]/DEVELOPMENT” sí se encuentre en la primera cadena literal.

El primer problema es que estos literales son interpretados por el motor como cadenas con una intercalación no Unicode entonces si el servidor está configurado (instalado) con una intercalación Unicode como Latin1_General_100_CI_AI, los caracteres no serán interpretados de la manera que esperamos al realizar la comparación y la ordenación.

Lo más simple para ver esto es colocar el indicador de literales Unicode (N) al frente de las cadenas e inmediatamente se obtendrá el resultado correcto esperado, es decir “Yes” (ver y o ejecutar los ejemplos de más abajo en una ventana de su SQL Server Management Studio 2008, si es otra versión previa comente la intercalación de tipo “_100_”, ya que s nueva en SQL Server 2008).

El echo de que los procedimientos almacenados o funciones no realicen bien las comparaciones se debe a que todos los valores de las variables de cadena de la base de datos fueron originalmente definidas como “varchar” y almacenados con la intercalación antigua de SQL_Latin1_General_CP1_CI_AS (estas intercalaciones de SQL se mantienen por compatibilidad con el pasado y se recomienda utilizar las de Windows o bien actualizarlas).

La solución

Lo más adecuado es tomar su base de datos y hacer lo siguiente:

  • Transformar su base de datos (los datos almacenados) a la intercalación del servidor mediante este script maravilloso de Igor F. Kovalenko.
  • Actualice todas sus tablas para que utilicen tipos de datos Unicode en las cadenas (nchar, nvarchar, ntext).
  • Actualice todos sus procedimientos almacenados y funciones y cambie las declaraciones de variables de tipo “varchar” a “nvarchar” (vea el último ejemplo de la serie de consultas más abajo para que vea por qué).
    • Si tuvo la necesidad en el pasado de declarar algo como “varchar(8000)” y espera cadenas de ese largo ya no puede utilizar nvarchar con ese tamaño porque nvarchar está limitado a 4000 caracteres cuando quiere especificar la longitud. Entonces, si requiere más de 4000 caracteres, declare las variables como “nvarchar(max)” que soporta hasta 2 GB.

Fíjese que si los valores no están almacenados en la intercalación correcta aunque utilice COLLECT no obtendrá el resultado adecuado, por eso debe realizar la transformación de datos.

Para sus nuevos desarrollo, no lo dude, utilice una intercalación de Windows Unicode como la indicada aquí, que acepta un amplia variedad de idiomas humanos.

Demostrador

-------------------------------------------------
-- Comparación literal
-------------------------------------------------
IF '/SYSTEM_ROOT/DEVELOPMENT_COMPANY/DEVELOPMENT' LIKE
'%/DEVELOPMENT'
SELECT 'Yes' as
IsLikeLiteral
ELSE
SELECT
'No' as
IsLikeLiteral

-------------------------------------------------
-- Comparación literal explícita Unicode
-------------------------------------------------
IF N'/SYSTEM_ROOT/DEVELOPMENT_COMPANY/DEVELOPMENT' LIKE
N'%/DEVELOPMENT'
SELECT 'Yes' as
IsLikeUnicode
ELSE
SELECT
'No' as
IsLikeUnicode

-------------------------------------------------
-- Conversión a una intercalación determinada
-------------------------------------------------
IF '/SYSTEM_ROOT/DEVELOPMENT_COMPANY/DEVELOPMENT' COLLATE Latin1_General_CI_AI LIKE '%/DEVELOPMENT' COLLATE
Latin1_General_CI_AI
SELECT 'Yes' as
IsLikeCollation
ELSE
SELECT
'No' as
IsLikeCollation

-------------------------------------------------
-- Conversión a una intercalación determinada (100)
-------------------------------------------------
IF '/SYSTEM_ROOT/DEVELOPMENT_COMPANY/DEVELOPMENT' COLLATE Latin1_General_100_CI_AI LIKE '%/DEVELOPMENT' COLLATE
Latin1_General_100_CI_AI
SELECT 'Yes' as
IsLikeCollation100A
ELSE
SELECT
'No' as
IsLikeCollation100A

-------------------------------------------------
-- Conversión a una intercalación determinada (100)
-------------------------------------------------
IF N'/SYSTEM_ROOT/DEVELOPMENT_COMPANY/DEVELOPMENT' COLLATE Latin1_General_100_CI_AI LIKE N'%/DEVELOPMENT' COLLATE
Latin1_General_100_CI_AI
SELECT 'Yes' as
IsLikeCollation100B
ELSE
SELECT
'No' as
IsLikeCollation100B

-------------------------------------------------
-- Comparación con varchar (cadena no unicode)
-------------------------------------------------
DECLARE @varCharInput1 varchar(500
)
DECLARE @varCharInput2 varchar(500
)
SET @varCharInput1 =
'/SYSTEM_ROOT/DEVELOPMENT_COMPANY/DEVELOPMENT'
SET @varCharInput2 =
'%/DEVELOPMENT'

IF @varCharInput1 LIKE
@varCharInput2
SELECT 'Yes' as
IsLikeVarchar
ELSE
SELECT
'No' as
IsLikeVarchar

-------------------------------------------------
-- Finalmente este es el punto.
-- Comparación con nvarchar (cadena unicode)
-------------------------------------------------
DECLARE @nVarCharInput1 nvarchar(500
)
DECLARE @nVarCharInput2 nvarchar(500
)
SET @nVarCharInput1 =
N'/SYSTEM_ROOT/DEVELOPMENT_COMPANY/DEVELOPMENT'
SET @nVarCharInput2 =
N'%/DEVELOPMENT'

IF @nVarCharInput1 LIKE
@nVarCharInput2
SELECT 'Yes' as
IsLikeNVarchar
ELSE
SELECT
'No' as IsLikeNVarchar

Los resultados

image

---(FIN)---

viernes, 23 de abril de 2010

ATI mobility radeon 9200 on windows 7 - FixYa

Funciona en una HP Pavilion zt3007la (en general zt3000), aunque ocasionalmente se produce una pantalla azul...no logro todavía determinar el procedimiento para reproducirlo. Me ha sucedido reproduciendo un video de youtube.

Solución para el driver
ATI mobility radeon 9200 on windows 7 - FixYa
---

martes, 9 de marzo de 2010

Visual Studio 2008 vshost.exe has encountered a problem and needs to close

Este es un problema que me ha sucedido recurrentemente y como después de un tiempo tiende al olvidarse uno se rompe la cabeza reinstalando cosas y buscando posibles causas en la red, por ello he decidido dejarlo documentado.

Contexto

Se instala Visual Studio 2008 en diferentes ediciones e idiomas.

  1. Instalé Visual Studio 2008 Professional Edition en inglés.
  2. Instalé Visual Studio 2008 Express en español (todos los productos de caja).
  3. Instalé el Service Pack 1 para cada idioma (no es determinante para que ocurra el problema descrito).

Situación

Al terminar la instalación, e independientemente del Service Pack 1, el IDE de Visual Studio 2008 Professional queda configurado en una mezcla de español e inglés que es visible en el IDE.

Como se ve en la figura, a pesar de que el producto de VS2008 Professional es en inglés, el IDE ha cambiado su configuración al español.

image 

Problema

Al abrir un proyecto existente con Visual Studio 2008 Professional o Visual C# (ó VB) 2008 Express, a los pocos segundos, el IDE falla y muestra una ventana con el problema mencionado.

image

El problema sucede al abrir o crear un proyecto específico, no al abrir el IDE solamente.

No es posible depurar (hacer debugging) el proyecto en el que se quiere trabajar.

image

Solución

El problema NO se resuelve reparando instalaciones o volviendo a instalar los productos.

IDE en inglés

La solución consiste en cambiar simplemente el idioma de VS2008 Professional a su idioma de instalación.

Así queda después de la instalación referida.

image

Simplemente abra el IDE sin crear o abrir ningún proyecto y cambie la configuración al idioma original de instalación. Así debe quedar:

image

Presione aceptar y reinicie el IDE

image

Listo el IDE funciona ahora normalmente.

La causa no es evidente pero, el cambio de idioma como solución, indica que el IDE falla por no poder tener acceso a algún recurso que espera con ciertas características específicas o en una ubicación específica.

image

image

Etiquetas de Technorati: ,,

miércoles, 24 de febrero de 2010

The specified named connection is either not found in the configuration (Visual Studio 2010 RC)

En versiones anteriores de Visual Studio, como la 2008, había probado la lectura de la configuración (x.config) de una aplicación desde una capa intermedia sin mayor problema.

Por ejemplo una capa de datos que tuviera un ConnectionString (digamos por omisión) en su propio archivo de configuración. Se tendría entonces:

DAL.dll y DAL.dll.config con la conexión al origen de datos.

En tal caso, con las versiones previas, no había ningún problema y sólo si un cliente (Windows, Web) requería redefinir esta conexión entonces simplemente se redefinía la misma, en el archivo de configuración correspondiente al cliente y listo.

Al realizar un ejercicio similar con Visual Studio 2010 RC (entiendo que con el beta pasa lo mismo) y ADO.NET Entity Framework no me era posible conectarme al origen de datos con el siguiente error (o BUG):

System.ArgumentException: The specified named connection is either not found in the configuration, not intended to be used with the EntityClient provider, or not valid.

image

El problema sucede en el constructor predeterminado del contexto de mis entidades. En este constructor, al no especificar la conexión, se espera que la misma se lea justamente desde la configuración.

Intenté redefinir la conexión en el archivo de configuración de mi consola y el mismo error sucedía.

La solución la encontré en este foro y es básicamente darle vuelta haciendo dos cosas:

  1. Copiar la cadena de conexión al archivo de configuración de su aplicación cliente o consumidora (Windows, Web). Esto no es opcional.
  2. tomar la conexión del proveedor de System.Data.EntityClient y en la cadena de conexión (connectionString) buscar la parte que se refiere al proveedor su base de datos y cambiar las entidades XML “"” por una comilla simple (‘). Esto es evidentemente un BUG.

Colocar las comillas simples en el archivo de configuración de la capa intermedia tampoco funciona.

Luego de estos dos cambios me funcionó bien. Espero que sea un BUG y no un cambio de paradigma.

Etiquetas de Technorati: ,,