March 2008 - Artículos
Quien 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
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
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% |
Enlaces
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.
Este ejemplo tomamos la tabla Categories de la DB Northwind
Cuando creas un dataset tipado lo haces algo asi:
Y queremos agregar una nueva Query
Y luego la opción seleccionada por todos es
Asignamos un nombre a la función
La función se crea correctamente
Si la probamos da esto
Nos devuelve correctamente el valor
Pero si vamos a un ejemplo sencillo
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
Y funciona... devuelve el valor del Id insertado
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
Y la parte que nos interesa
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.
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??
Podemos visualizar esta colección aquí
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
Haciendo uso de las clases parciales, cree un archivo Categorias.Metodos.vb que contiene el código anterior
Probando en el código anterior
Probando
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
Enlaces
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.
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
- 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
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
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.NET\Framework\v2.0.50727\aspnet_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.(..)
Luego tienes que ir a las Extensiones del Servidor y tienes la extensión correspondiente a ASP.NET 2.0
Enlaces