[OT] Salve a los Desarrolladores! Campaña: "Say No To IE 6"

imageQuien no encontró un desarrollador/diseñador web que cuando se le pregunta por IE6 & IE7 no quiere lanzar bocanadas de fuego… por la incompatibilidad entre estos “brothers in law”, y solventan esto haciendo uso de técnicas de “hack CSS” que explicaba un poco aquí, pero que no es del todo ortodoxo.
Recuerdo hace algunos años la frase “Optimizado para IE5x o superior”… que significaba si tienes otro browser,  sorry!

Hoy di con este sitio
image

www.savethedevelopers.org

Donde se lo invita al usuario a actualizar su navegador a cualquiera (si tiene IE6 se lo invitaría a IE7)

Incluso podemos agregar un script a nuestro website que despliega al mejor estilo advertisment
image

image

Y si podemos hacerlo con plugin de Flash, porque no con IE 😉

 

Estadísticas de navegadores

Fuera de cualquier humor, las estadísticas muestran que si nuestra hay que tener en cuenta este porcentaje de visitas.

Claro que las estadísticas nunca son separadas de un objetivo, es decir no es lo mismo el visitante de un sitio especializado en diseño gráfico o arquitectura que de un sitio de noticias.
Por eso es bueno darle un seguimiento a nuestras visitas, no solo en la cantidad sino también en la calidad de la visita (browser, tiempo transcurrido, desde que pagina se dirigen), para eso tenemos que hacer uso de lo mejor que podamos, ejemplo Google Analitycs.

 

IE7

IE6

IE5

Firefox

Mozilla

Safari

Opera

Feb-08 22.00% 30.70% 1.70% 36.50% 1.10% 2.00% 1.40%
Ene-08 22.20% 32.00% 1.50% 36.40% 1.30% 1.90% 1.40%
Dic-07 21.00% 33.20% 1.70% 36.30% 1.40% 1.70% 1.40%
Nov-07 20.80% 33.60% 1.60% 36.30% 1.20% 1.80% 1.60%
Oct-07 20.70% 34.50% 1.50% 36.00% 1.30% 1.70% 1.60%
Sep-07 20.80% 34.90% 1.50% 35.40% 1.40% 1.60% 1.50%

image

 

 

Enlaces

TableAdapter: Recuperar RETURN VALUE desde el procedimiento almacenado

Un amigo me comenta que no puede recuperar los valores de retorno para un procedimiento almacenado, utilizando Dataset tipados.

Así que en vez de escribir un email personalizado, arme algo que nos quede por aquí…

La idea es recuperar por ejemplo el SCOPE_IDENTITY como RETURN VALUE

NOTA: Primeramente me comentaba sobre @@IDENTITY, pero SCOPE_IDENTITY devuelve el último valor de identidad insertado en una columna de identidad en el mismo ámbito. Un ámbito es un módulo: un procedimiento almacenado, desencadenador, función o lote. Por tanto, dos instrucciones están en el mismo ámbito si se encuentran en el mismo procedimiento almacenado, función o lote.

 

image 

Este ejemplo tomamos la tabla Categories de la DB Northwind

Cuando creas un dataset tipado lo haces algo asi:

clip_image004

Y queremos agregar una nueva Query

clip_image006

clip_image008

clip_image010

Y luego la opción seleccionada por todos es

clip_image012

Asignamos un nombre a la función

clip_image014

La función se crea correctamente

clip_image016

Si la probamos da esto

clip_image018

Nos devuelve correctamente el valor

clip_image020

Pero si vamos a un ejemplo sencillo

clip_image022

Vemos que el devuelve un tipo

           System.Nullable(Of Integer)

Cuando probamos no nos da los resultados deseados

 

Solución 1: Agregar SELECT

Para ir a la solucion porque se comporta asi, podremos solucionarlo primeramente agregando un SELECT al final de nuestro procedimiento con la salida deseada.
Esto funciona, y nos devuelve como return de la funcion

En este caso particular la salida es convertida a INT para poder utilizar el mismo código de arriba
image

Y funciona… devuelve el valor del Id insertado

image

Pero esto por que funciona?

Si investigamos un poco el código que genera .NET en la función InserEjemplo que mapea nuestro procedimiento almacenado

image

image

image

Y la parte que nos interesa

image

Utiliza un ExecuteScalar:
(…)
     Ejecuta la consulta y devuelve la primera columna de la primera fila del conjunto de resultados devuelto por la consulta. Las demás columnas o filas no se tienen en cuenta.
     Valor devuelto
     La primera columna de la primera fila del conjunto de resultados, o una referencia nula si el conjunto de resultados está vacío.
(…)

Por esta razón no tenemos el retorno que necesitamos para nuestro SP original

Tampoco podemos seleccionar el metodo ExecuteNonQuery, porque devuelve el número de filas afectadas.

image

Si volvemos al código generado cuando inicializa  la colección de comandos y vemos el único que tenemos  que corresponde a la funcion InsertEjemplo podremos ver algo como @RETURN_VALUE??

image

Podemos visualizar esta colección aquí

image

image

 

 

Solución 2: Crear método de lectura para RETURN VALUE

Gracias al Equipo de Datos de VS (VS Data Team), viene la ayuda

Agregar un método GetReturnValue para poder leer el valor del parámetro @RETURN_VALUE que esta en la posicion 0. Recibe el indice del comando

image

Haciendo uso de las clases parciales, cree un archivo Categorias.Metodos.vb que contiene el código anterior

image

 

Probando en el código anterior

image

Probando

image

Tendríamos que hacer un casteo o conversión a Int32, ya que como vimos devuelve un Objeto

 

Porque 1 en GetReturnValue(1)?
En el diseñador miramos la inicialización en el metodo InitCommandCollection donde

image

 

 

Enlaces

Error: Al abrir diagramas de base de datos en SQL2005. "Database diagram support objects cannot be installed because this database does not have a valid owner"

Por un trabajo me enviaron un base de datos sobre SQL2005, y al restaurar y querer ir a los diagramas me salto el mensaje

Database diagram support objects cannot be installed because this database does not have a valid owner. To continue, first use the Files page of the Database Properties dialog box or the ALTER AUTHORIZATION statement to set the database owner to a valid login, then add the database diagram support objects.

Versión en español:

Los objetos de soporte del diagrama de base de datos no se pueden instalar. Esta base de datos carece de propietario válido. Para continuar, primero use la página Archivos del diálogo Propiedades de la base de datos o la instrucción ALTER AUTHORIZATION para establecer como propietario de la base de datos un inicio de sesión válido y después agregue los objetos de soporte del diagrama de base de datos.

 

image

 

Solución

Buscando la solución di con la documentación de este problema, y me funciono 😉

Restaurando el nivel de compatibilidad
       EXEC sp_dbcmptlevel 'database_name', '90';

La instalación de estos objetos de soporte puede generar un error en una base de datos adjuntada o restaurada a partir de otra instancia de SQL Server. Esto puede ocurrir cuando el nombre del propietario de la base de datos (almacenado en la base de datos) no es un nombre de inicio de sesión válido para la instancia de SQL Server a la que se adjunta o en la que se restaura la base de datos.

Utilice la siguiente instrucción Transact-SQL para cambiar el propietario de la base de datos a un inicio de sesión válido en la instancia de SQL Server y, después, vuelva a intentar realizar la operación de diagrama de base de datos.

    ALTER AUTHORIZATION ON DATABASE::miDatabase TO valid_login

 

Notas (…from msdn)

  • Aunque cualquier usuario con acceso a una base de datos puede crear un diagrama, una vez que se ha creado, los únicos usuarios que pueden verlo son su creador y cualquier miembro de la función db_owner.
  • La propiedad de los diagramas sólo se puede transferir a los miembros de la función db_owner. Esto sólo es posible si el propietario anterior del diagrama se ha eliminado de la base de datos.
  • Si se ha eliminado de la base de datos el propietario de un diagrama, el diagrama permanecerá en la base de datos hasta que el miembro de la función db_owner intente abrirlo. En ese momento, el miembro de db_owner podrá decidir si asume su propiedad.
  • Para instalar el soporte del diagrama de base de datos en SQL Server Management Studio, la base de datos debe estar en el nivel de compatibilidad de base de datos de SQL Server 2005

 

Otra posible solución (idem la anterior)

Llegue también a este solución que no la probé que es cambiar el db owner

          USE [<miDatabase>]
      GO
      EXEC dbo.sp_changedbowner @loginame = N’sa’, @map = false
      GO

Muy explicito el nombre “Cambiar el DB owner”, pero con podemos cambiar el propietario de cualquier asegurable mediante la instrucción ALTER AUTHORIZATION

 

Enlaces

Request de paginas .aspx devuelve HTTP Error 404 en IIS6

Instalando un app web ASP.NET 2.0 en un Windows 2003 IIS6 me daba un error algo doloroso… HTTP Error 404 – File or directory not found
Como en repetidas oportunidades me preguntaron sobre este tema y justo me toco a flor de piel, capture pantalla para el que necesita.

Cuando me dan el servidor para verificarlo y voy a las Extensiones de servicio web

 image

No estaban instalado o mejor dicho registrado correctamente ASP.NET 2.0 en el servidor IIS.

 

Registrando ASP.NET nuevamente

Mediante la herramienta de registro que trae el framework podremos asociarlo al IIS, generalmente esta en este ubicación:
     %windir%Microsoft.NETFrameworkv2.0.50727aspnet_regiis -i

(..)Instala la versión de ASP.NET asociada a Aspnet_regiis.exe y actualiza las asignaciones de secuencias de comandos ubicadas en la raíz de la metabase de IIS y por debajo de ésta.
Sólo se actualizan las asignaciones de secuencias de comandos de las aplicaciones que utilizan una versión anterior de ASP.NET. Las aplicaciones que utilizan una versión posterior no se ven afectadas.(..)

image

image

 

Luego tienes que ir a las Extensiones del Servidor y tienes la extensión correspondiente a ASP.NET 2.0

image

image

 

 

Enlaces