miércoles, 31 de diciembre de 2008

The last post (de este año).

Y el año que viene muchos más, si me dejan xD.

Feliz año nuevo a todos, y nos seguiremos leyendo por el ciberespacio.

Saludos.

lunes, 29 de diciembre de 2008

Un poco de propaganda a JDW

Simplemente quería darle un poco de publicidad a una web de unos amigos que quieren comenzar su andadura en el mundo de la informática, prestando sus servicios de forma profesional, en diversas áreas (web, diseño y mantenimiento). Pero bueno mejor os pásais vosotros mismos por la web.

http://www.jadaweb.es

viernes, 28 de noviembre de 2008

IV Aniversario GUSENET

Mañana asistiré a las charlas programadas en el IV Aniversario del grupo GUSENET (www.gusenet.com). ¡Cómo pasa el tiempo! La verdad es que hace 4 días recuerdo estar en Sta. Pola celebrando el III Aniversario y conociendo a gente maravillosa y dispuesta a ayudar a los demás.

En la web del grupo podréis ver el programa de mañana.

Desde aquí quiero animar a la gente que no conoce el grupo a que acuda a disfrutar tanto de las charlas cómo de la gente que compone el grupo, a exponer sus dudas y a participar en los diferentes eventos que se programan mes tras mes.
Hace poco disfrutamos de dos integrantes del equipo de programación de Visual Basic venidos desde Redmond.

Novedades SQL Server 2005 y 2008

Bueno después de estar un tiempo desconectado, he dado un vistazo a las novedades que me he perdido de SQL Server. Para empezar, comentaros que en Septiembre se publicó un CU1 (Cummulative Update) para SQL Server 2008 y hace pocos días se ha publicado un segundo CU2, más en concreto el día 18 de Noviembre (si queréis ver lo que corrige lo podéis ver en http://support.microsoft.com/kb/958186/en-us), recordad que para descargarlo es bajo demanda.

Por otro lado se ha publicado el tan aclamado SP3 para SQL Server 2005 pero en estado BETA, sólo para testeo (se hizo el día 28 de Octubre, sí ya ha llovido desde entonces jejeje, es lo que tiene no estar al día de las cosas, y pensar más en los videojuegos).

sábado, 8 de noviembre de 2008

Interfaz de conexión contra una BD C#

Buscando y buscando di el otro día con la interfaz de conexión que utiliza Visual Studio para conectarnos a una BD. Os dejo un ejemplo de cómo implementarlo en un proyecto.

Para poder utilizar esta interfaz necesitamos agregar a nuestro proyecto un par de referencias que tenemos localizadas en el directorio de instalación de Visual Studio bajo la carpeta:
Microsoft Visual Studio 9.0\Common7\IDE\Microsoft.Data.ConnectionUI.Dialog.dll
Microsoft Visual Studio 9.0\Common7\IDE\Microsoft.Data.ConnectionUI.dll
(En este caso para VS2008, en VS2005 también está disponible en su lugar será 8.0 ;P)


Una vez añadidas las referencias necesitamos importarlas mediante:
using Microsoft.Data.ConnectionUI;

Y por último para utilizarlas en nuestro proyecto:
Microsoft.Data.ConnectionUI.DataConnectionDialog dialogo = new Microsoft.Data.ConnectionUI.DataConnectionDialog();
//Añado por defecto las conexiones estándar, podemos seleccionar o limitar el tipo de conexión que mostrará la ventana de conexión.
Microsoft.Data.ConnectionUI.DataSource.AddStandardDataSources(dialogo);
Microsoft.Data.ConnectionUI.DataConnectionDialog.Show(dialogo);


Si queremos obtener la cadena de conexión resultante de los datos introducidos en la ventana de conexión es tan simple cómo asignar a una cadena el resultado de:
dialogo.ConnectionString

Configurando el Firewall de Windows para SQL Server

El tema de hoy es facilón, pero seguro que a muchos y no quiero dar nombres les ha dado más de una vez un dolor de cabeza. Al grano.

Lo primero que tenemos que hacer es mostrar la ventana dónde configurar las exclusiones del firewall.Para ello, nos vamos a inicio, ejecutar y escribimos firewall.cpl, abrirá la siguiente ventana:



Pinchamos en cambiar la configuración y veremos la siguiente ventana:



Ahora añadiremos las excepciones, para ello hacemos click en el TAB Excepciones.Pulsamos en el botón Agregar un puerto y en la venta rellenaremos los campos Nombre con el valorSQL Server y el campo Número de puerto con el valor 1433. En la opción de protocolo seleccionaremosTCP.
También podemos abrir un puerto que escuche al servicio SQL Server Browser. Puede que te preguntespara qué sirve este servicio, pues sirve para que nos podamos conectar a nuestra instancia de SQL Serversi esta no está escuchando en el puerto 1433.Para configurarlo volveremos a agregar un puerto tal y como hemos hecho antes. La descripción seráSQL Server Browser, en el puerto 1434 de tipo UDP.



-Una alternativa a configurar una instancia con nombre para escuchar en un puerto fijo es crear una excepción en el firewall para el ejecutable de SQL Server, lo que nos permitirá conectar a él independientemente del puerto que tenga abiertopara escucha.


Ruta en mi equipo dónde se encuentra el ejecutable de SQL Server 2005
C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn

SQL Server 2008
C:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\Binn

En ambos casos elegiremos el fichero ejecutable sqlservr.exe

Si queréis profundizar un poco más en la configuración del firewall para Analisys Services, ...os dejo los enlaces en los BOL, para SQL Server 2008:
2008 ==> ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.es/s10sq_GetStart/html/f55c6a0e-b6bd-4803-b51a-f3a419803024.htm

lunes, 22 de septiembre de 2008

Corrompiendo una BD (parte I) y solucionando el error

Herramientas que necesitamos:
-SQL Server 2005 (en SQL Server 2008 todavía no lo he probado).
-Heditor hexadecimal (en mi caso utilizo XVI32, es freeware)

El error que os voy a describir es de fácil solución, puesto que vamos a corromper un índice nonclustered, pero puede serviros a la hora de practicar posibles soluciones a un error y posiblemente para alguna cosilla más xDDD.

Lo primero de todo es crearos una BD, en mi caso la he llamado Corrupta, estableciendo sobre ella que no verifique ningún error a nivel de página (ALTER DATABASE Corrupta SET PAGE_VERIFY NONE), y después nos creamos una tabla X sobre la que crearemos un índice nonclustered único. A continuación introducimos una serie de registros, en nuestro caso 9 registros.


Ahora veamos, ¿qué es lo que necesitamos? (empezar por algún lado).
Necesitamos saber la página dónde está nuestro índice nonclustered, ¿cómo podemos obtenerla?



si os fijáis en los recuadros en rojo (ese pulso). Veréis que os indico el id del índice (tipo 2 significa nonclustered) y la dirección de la primera página donde se aloja.
Ahora bien, rebuscando un poco he encontrado que Kalen Delaney's tiene una función mediante la cual podemos transformar una dirección hexadecimal en una página:

create function [dbo].[convert_page_nums] (@page_num binary(6))
RETURNS varchar(11)
AS
BEGIN
RETURN(convert(varchar(2), (convert(int, substring(@page_num, 6, 1)) * power(2, 8)) +
(convert(int, substring(@page_num, 5, 1)))) + ':' +
convert(varchar(11),
(convert(int, substring(@page_num, 4, 1)) * power(2, 24)) +
(convert(int, substring(@page_num, 3, 1)) * power(2, 16)) +
(convert(int, substring(@page_num, 2, 1)) * power(2, 8)) +
(convert(int, substring(@page_num, 1, 1)))) )
END
La utilizaremos para convertir nuestra dirección en algo más entendible
SELECT dbo.convert_page_nums(0x7E0000000100)

que nos da como resultado en mi caso la página (1:126)
Para comprobar que es correcto podemos ejecutar
DBCC IND(Corrupta, Datos, -1) (esta instrucción no está documentada en los BOL, podéis encontrar info en el blog de sqlserverstorageengine)
que nos muestra como resultado lo siguiente:



os remarco en rojo la información relevante, la página, el id del índice y el tipo de página.

Después de toda la información que hemos recabado tenemos que hacer un volcado de los datos que contiene esa página, ¿cómo? (sigue leyendo que esto se pone interesante)
Primero activamos la visualización del DBCC PAGE en pantalla mediante:
DBCC TRACEON(3604, -1)
GO
Y después obtenemos el volcado de los datos de la página
DBCC PAGE(Corrupta, 1, 126, 1)
Una vez tenemos los datos nos tenemos que fijar en el Slot 0, que nos indica la primera fila en la página, y en el Slot 8 que nos indica la última página.

Slot 0, Offset 0x60, Length 14, DumpStyle BYTE
Record Type = INDEX_RECORD Record Attributes =
Memory Dump @0x4E85C060
00000000: 06312020 20205a00 00000100 0000††††††.1 Z.......


Slot 8, Offset 0xd0, Length 14, DumpStyle BYTE
Record Type = INDEX_RECORD Record Attributes =
Memory Dump @0x4E85C0D0
00000000: 06392020 20205a00 00000100 0800††††††.9 Z.......

Una vez tenemos estos datos es hora de parar nuestro instancia de SQL Server y abrir en el editor hexadecimal el fichero Corrupta.mdf, acto seguido buscaremos la primera aparición de la cadena hexadecimal 06312020 20205a00 00000100 0000

Ahora cambiaremos los datos por el valor 00 y guardaremos el fichero.

podría haber continuado hasta el último slot pero es un coñazo con este editor o todavía no lo domino lo suficiente (xDDD).

Volvemos a iniciar nuestra instancia y ejecutamos una comprobación de la BD
DBCC CHECKDB('Corrupta') que nos muestra el siguiente resultado:

Resultados de DBCC para 'Datos'.
Mens. 8928, Nivel 16, Estado 1, Línea 1
Id. de objeto 5575058, Id. de índice 2, Id. de partición 72057594038845440, Id. de unidad de asignación 72057594043957248 (tipo In-row data): no se pudo procesar la página (1:126). Vea otros errores para obtener información detallada.
Mens. 8941, Nivel 16, Estado 55, Línea 1
Error de tabla: Id. de objeto 5575058, Id. de índice 2, Id. de partición 72057594038845440, Id. de unidad de asignación 72057594043957248 (tipo In-row data), página (1:126). Error de prueba (dbccAuditRecSucceeded == TRUE). Zona 0, el desplazamiento 0x60 no es válido.
Hay 9 filas in 1 páginas para el objeto "Datos".
CHECKDB detectó 0 errores de asignación y 2 errores de coherencia en la tabla 'Datos'. (Id. de objeto 5575058).

Y al final de todo:
CHECKDB detectó 0 errores de asignación y 2 errores de coherencia en la base de datos 'Corrupta'.
repair_allow_data_loss es el nivel mínimo de reparación para los errores detectados por DBCC CHECKDB (Corrupta).
Ejecución de DBCC completada. Si hay mensajes de error, consulte al administrador del sistema.

¿Bien y ahora qué? la reparamos mediante un REPAIR_REBUILD, REPAIR_ALLOW_DATA_LOSS, restauramos una copia de seguridad.
Lo primero que podríamos hacer es verificar el objeto que tiene el error y para eso lo podemos hacer de la siguiente manera:

SELECT object_name(object_id)AS 'Table',name,index_id,type_desc FROM sys.indexes
WHERE object_id = '5575058'
AND index_id = 2
que nos devuelve los siguientes datos:
Table name index_id type_desc
--------------------------------------------------
Datos SK_Datos 2 NONCLUSTERED
Yuhu, es un índice nonclustered (que novedad si no fuera porque os lo he dicho y lo hemos creado :-)), lo mejor de todo es que al ser nonclustered podremos reconstruirlo mediante la sentencia

ALTER INDEX SK_Datos ON dbo.Datos REBUILD
Una vez hecho esto volvemos a ejecutar un DBCC CHECKDB('Corrupta')

CHECKDB detectó 0 errores de asignación y 0 errores de coherencia en la base de datos 'Corrupta'.
Ejecución de DBCC completada. Si hay mensajes de error, consulte al administrador del sistema.
y voilà los errores de consistencia han desaparecido, nos hemos quitado un marrón (dolor de cabeza, o como lo quieras llamar) de encima y nos quedamos satisfechos de nuestro trabajo realizado.
Bueno eso es todo amigos, espero os guste y os sirva para salir de un apuro. Saludos y hasta pronto.

BD's con más consumo de I/O

--Bases de datos que utilizan más I/O
--BD, Tipo de fichero, IO en megas, IO Stall en segundos (tiempo de espera para lectura o escritura), Porcentaje de IO stall, Posición de más a menos IO Stall (Ranking)

WITH Consumo AS
(
SELECT DB_NAME(IV.database_id) AS db, CASE WHEN MF.type = 1 THEN 'log' ELSE 'data' END AS file_type, SUM(IV.num_of_bytes_read + IV.num_of_bytes_written) AS io, SUM(IV.io_stall) AS io_stall
FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS IV JOIN sys.master_files AS MF ON IV.database_id = MF.database_id AND IV.file_id = MF.file_id
GROUP BY DB_NAME(IV.database_id), MF.type
)
--si no queremos verlo en segundos podemos modificar el io_stall /1000 para verlo en milisegundos, etc
SELECT db, file_type, CAST(1. * io / (1024 * 1024) AS DECIMAL(12, 2)) AS io_mb, CAST(io_stall / 1000. AS DECIMAL(12, 2)) AS io_stall_s, CAST(100. * io_stall / SUM(io_stall) OVER() AS DECIMAL(10, 2)) AS io_stall_pct, ROW_NUMBER() OVER(ORDER BY io_stall DESC) AS rnk
FROM Consumo
ORDER BY io_stall DESC;

Avisaros que en SQL 2000 no os funcionará ya que utiliza DMV de SQL Server 2005

viernes, 12 de septiembre de 2008

BD Sospechosa y SQL Server 2008

Gran puntazo a favor de SQL Server 2008!!! Ya no podemos separar por error o desconocimiento una base de datos en estado sospechoso, os adjunto una captura de un futuro post que estoy preparando: (cómo bien reza, sólo podemos repararla o quitarla (DROP :-)), muhahaha)

lunes, 8 de septiembre de 2008

Errores en la web

Errores tontos como diría un compañero, que también tiene su blog personal. Petada al canto al intentar ver más vídeos en la peich de JumpStartTV. La verdad es que tiene vídeos interesantes pero la navegación deja mucho que desear.
Seguro que cuando vean la petada al que se le olvidó poner el Try Catch no se le vuelve a olvidar xDDD.




Bueno aún no han corregido el error (13/09/2008) pero la petada ya no es evidente para los demás, parece ser que el Try Catch ha funcionado

viernes, 5 de septiembre de 2008

Resolución de problemas relacionados con Tiempo de Espera agotado

Buscando y rebuscando en los libros en pantalla (sí no tengo otra cosa mejor que hacer ;-) y os sorprenderíais de la documentación que nos aportan y que mucha gente desconoce), he encontrado la solución que nos aporta Microsoft para solucionar los problemas de tiempo de espera agotado al intentar conectar desde nuestra aplicación contra el servidor que contiene la BD.
A muchos os puede parecer lógico o algo fácil, pero seguro que alguien en algún momento lo ha sufrido y ha tenido que buscar información al respecto (verdad Berni ;-) ).
Bueno no me enrollo más y os pongo el link a los BOL

ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.es/s10de_4deptrbl/html/ad6e3f43-7d0b-4d6c-ab2a-038a5a3b2690.htm

y en internet

http://msdn.microsoft.com/es-es/library/ms190181.aspx

Reconstruir las Bases de Datos de sistema en SQL Server 2008

Más conocido como “Rebuild master”. Para hacerlo debemos seguir los siguientes pasos:

1.- Abrimos una consola de msdos y nos situamos en la carpeta dónde tenemos instalado SQL Server 2008 en nuestra máquina, en mi caso C:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\Release

2.- Ejecutaremos Setup.exe con las siguientes opciones, si tenemos activado el modo de autenticación usaremos la siguiente sintaxis:

Setup /ACTION=REBUILDDATABASE /QUIET /INSTANCENAME= /SQLSYSADMINSACCOUNTS=

habrá que sustituirlo por el nombre de nuestra instancia o MSSQLSERVER en caso de que sea la instancia por defecto

son los grupos de Windows o cuentas individuales.

Si tuviéramos configurado el modo de autenticación mixta usaríamos la misma sintaxis añadiendo la opción /SAPWD para especificar la contraseña del usuario SA. Si no lo hacemos nos daría un error.

Si quisiéramos reconstruir las bases de datos de sistema con una intercalación diferente a la usada en la instalación de SQL Server, necesitaremos especificar el parámetro /SQLCOLLATION. Si omitimos el parámetro entonces se reconstruirán con la intercalación que utilizamos en la instalación de SQL Server.

3.- Cuando termine el setup de reconstruir las bases de datos, retornará al prompt sin dar ningún aviso. Si sucediera algún error este se visualizaría en el prompt. En el caso de que no viéramos errores podríamos dar un vistazo al log “Summary”.

4.- Los log se almancenan en \100\setupbootstrap\logs, podemos revisarlo abriendo el fichero Summary.txt

Por supuesto todo esto lo podemos hacer si la necesidad de tener el DVD de instalación, lo tenemos todo en \Binn\templates, por ejemplo la ruta en mi equipo es C:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\Binn\Templates. En este directorio tenemos todas las bases de datos del sistema que se copian en el momento de la instalación. Por lo tanto una vez reconstruyamos las bases de datos tendremos que cogerlas de este directorio y copiarlas en nuestro directorio de datos.
Si en este directorio no tuviéramos estas bases de datos al intentar hacer la reconstrucción nos daría un error.

Si no tuviéramos las bases de datos entonces tendríamos que ejecutar la instalación desde el DVD y seleccionar la opción reparar o bien buscar dentro del DVD la siguiente ruta, dependiendo de si es para una plataforma x86, x64 o ia64:
setup\sql_engine_core_inst_msi\PFiles\SqlServr\MSSQL.X\MSSQL\Binn\Template
y copiarlas bases de datos en la carpeta templates de nuestro equipo. Una vez copiadas las bases de datos, ejecutaremos la reconstrucción con la instrucción que os he dado un poco más arriba.

Otro de los aspectos no mencionados en este ladrillazo es lo siguiente, ¿qué pasa con la base de datos Resource? Muy sencillo, la reconstrucción no vuelve a generar una nueva bd Resource (mssqlsystemresource). Para ello tendremos que ejecutar la instalación desde el DVD y seleccionar la opción Reparar.

miércoles, 3 de septiembre de 2008

Vídeos de SQL SERVER

Leyendo diversos post por la red de un lado para otro cuando el tiempo me lo permite he descubierto un site interesante

http://www.sqlservervideos.com/

Tenemos los vídeos ordenados por temática, también podemos verlos por nivel de dificultad, por el tipo de audiencia (DBA, programador, ...), etc. Por el momento son 15 vídeos que imagino irán creciendo con el paso del tiempo.

viernes, 29 de agosto de 2008

Pérdida de conexión intermitente entre Windows 2003 Server y SQL Server

Al final se corrobora que no sólo de soft vivimos sino que también tenemos que bajar a los infiernos del hard para solventar problemas extraños que te hacen calentarte la cabeza y discutir con tus compañeros y clientes.

En fin, a los que os pueda surgir este error:
[DBNETLIB]Error general de red. Consulte la documentación de red

Con esta configuración:
Windows 2003 Server con SP2 y SQL Server 2005 con SP2 y equipados con una tarjeta de red modelo NC373i. Como veréis no sólo se puede producir con esta configuración (expongo esta por ser la que me ha originado el dolor de cabeza :) )

La solución que nos aporta Microsoft la tenéis en este enlace:
http://support.microsoft.com/kb/942861

Por supuesto recordaros que si aplicando las recomendaciones que nos ofrece Microsoft no conseguimos solucionarlo, debemos pasar a la acción y comprobar que nuestras bases de datos estén libres de errores de consistencia.

viernes, 8 de agosto de 2008

REPAIR_ALLOW_DATA_LOSS y el daño que podemos causar en nuestra BD.

La gran mayoría de las veces que nos enfrentemos a un problema en nuestra base de datos la solución que nos ofrece el comando DBCC CHECKDB será que usemos la opción REPAIR_ALLOW_DATA_LOSS, pues bien, antes de lanzarnos de cabeza debemos tener en cuenta los riesgos que podemos sufrir.

REPAIR_ALLOW_DATA_LOSS es un recurso rápido para poner en funcionamiento nuestra base de datos, el propósito no es guardar los datos de los usuarios, sino recuperar la consistencia estructural de la BD, tan rápido como sea posible de una manera correcta. Pero en este proceso para conseguir la consistencia borrará tanto datos como páginas corruptas.

Imaginemos el siguiente escenario, el DBA de nuestra entidad bancaria no realiza los backups necesarios para preservar la información y recuperarse de un desastre. El servidor sufre un apagón y resulta dañado un disco duro no pudiendo guardar correctamente una página, causando un TORN PAGE. Desafortunadamente en esa página está nuestra cuenta corriente. Como el DBA no dispone de copias de seguridad realiza una reparación con REPAIR_ALLOW_DATA_LOSS. Como resultado de esta reparación la página dañada resulta borrada!!! Y con ella nuestra cuenta corriente y la muchos otros clientes!!! xDDD

domingo, 15 de junio de 2008

Cómo nos puede ayudar Excel a la hora de preparar instrucciones SQL

Aquí os pongo un ejemplo de cómo preparar un INSERT generando las instrucciones desde una hoja de excel.


Tenemos una tabla Usuarios, con dos columnas ID y Nombre, la fórmula que tenemos que emplear para preparar la instrucción INSERT es:

=" INSERT INTO Usuarios (ID, Nombre) VALUES ('" & A1 & "', '" & B1 & "'); "
Observaciones: después del paréntesis tenemos una comilla simple acompañada de dobles comillas, con esto conseguimos que excel escriba ', luego después del & tenemos dobles comillas y por último comilla simple y así conseguimos que el dato salga formateado como 'Francisco'

Después de montar la primera instrucción lo único que tendremos que hacer es arrastrar y soltar hasta dónde queramos y automáticamente se generarán las instrucciones con sus variables correspondientes.

viernes, 13 de junio de 2008

Obtener las columnas de una tabla

A veces nos encontramos con la necesidad de obtener todos los campos de una tabla para preparar una instrucción INSERT, si la tabla tiene muchos campos es un tostón tener que ir mirando sus nombres en el Management Studio y tecleándolos, con el más que probable error a la hora de escribir sus nombres correctamente. Para ello podemos utilizar la siguiente query, nos situamos en la BD que queremos consultar

USE Gestion
GO
SELECT sc.name
FROM sys.objects so INNER JOIN sys.columns sc ON
so.[object_id]=sc.[object_id]
WHERE so.name='Cliente'

En un próximo post os explicaré la manera de preparar un INSERT con todos los campos de una tabla en cuestión, para que quede la instrucción toda completita y sólo tengamos que copiar y pegar y F5. xDDD
Me piro para Murcia que quiero coger buen sitio para la charla.

miércoles, 11 de junio de 2008

GUSENET: Estamos en la nube

13 de Junio de 2008

Universidad de Murcia. Facultad de Informática, Aula 0.01 (Primera Planta)
16:00 - 16:30 Registro
16:30 - 17:45 Desarrollo avanzado de controles (Pedro Hurtado)
17:45 - 18:15 Descanso
18:15 - 19:30 SOA, OSLO, SAAS... (Miguel Llopis)

Link para inscribiros:

http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032380266&Culture=es-ES

domingo, 8 de junio de 2008

Arrastrar y soltar sobre un PictureBox

Bueno esto es algo sencillo de hacer y como no había encontrado nada buscando por internet, pues lo posteo esperando que a alguien le pueda servir.

El código he pensado que era mejor subirlo en una imagen porque no he investigado mucho otra manera de que quede bien publicado en un post (ya sabéis, no indenta bien y no es muy legible). La aplicación de ejemplo es muy sencilla, tenemos un formulario con 2 picturebox y lo que hace es arrastrar la imagen desde uno de ellos al otro y copiarla (podría haberlo hecho que se moviera, etc, pero eso os lo dejo a vosotros, de todas formas ya os digo que es muy sencillo).


Ahora veamos como queda el formulario nada más cargarlo, con una buena pinta de cerveza negra :-)



Y por fin como quedan las imágenes después de haber pinchado sobre la primera y sin soltar arrastrar y soltar sobre el segundo picturebox.


Eso es todo amigos, hasta la próxima que no se si será de VB o SQL ;-P

lunes, 26 de mayo de 2008

Thumbs

Investigando un poco como cargar miniaturas de imágenes de un directorio y gracias a un compañero de Gusenet di con esta librería ThumbDBLib (la podéis descargar de http://www.petedavis.net/MySite/DynPageView.aspx?pageid=31, en el apartado License tenéis el enlace a la descarga, atentos a los comentarios pues uno contiene una modificación de la librería para que no pixele las miniaturas), a nosotros finalmente no nos hizo falta para el trabajo pero seguramente a más de uno, aunque sea por curiosidad le gustará saber lo fácil que puede ser visualizar una miniatura de una imagen en un formulario.

sábado, 24 de mayo de 2008

Resource Database

Porqué hablar de esta base de datos que a muchos seguramente no os dirá nada, pues muy sencillo, porque ante una pregunta formulada en sqlservercentral.com me surgió la duda de si era una de las bases de datos del sistema de SQL Server 2005.

La base de datos Resource es de sólo lectura y contiene todos los objetos de sistema (sys.objects). Esta BD hace que las actualizaciones de nuestro SQL Server 2005 sean más sencillas de realizar y más rápidas.

El nombre físico es mssqlsystemresource.mdf y mssqlsystemresource.ldf, están localizadas por defecto en la ruta de instalación de SQL Server 2005 \Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\. Cada instancia tendrá asociada una base de datos resource y no pueden compartirse entre instancias (lógico, ya que cada BD Resource contiene las actualizaciones de cada instancia).

Un aspecto muy importante y a tener en cuenta es que la BD Resource depende de la localización de la BD master. Si cambiamos de lugar la bd master tendremos que hacer lo mismo con la bd Resource.

Más información en:
http://msdn.microsoft.com/en-us/library/ms190940.aspx

sábado, 12 de abril de 2008

Crisis, sí CRISIS

Joder con ZP, antes de las elecciones no había crisis, un mes después sí hay crisis. Que a qué viene esto? Pues muy fácil, el día 14 de este mes iba a celebrarse en Alicante un seminario de Solid Quality Learning impartido por Eladio Rincón y yo estaba apuntado gracias a que mi empresa me pagaba el curso. La desilusión llegaba esta semana cuando recibíamos un mail avisándonos que se suspendía el seminario porque no se llegaba al mínimo de asistentes :-(((

Y claro esto hace reflexionar, sin contar con la gente que se paga el curso de su bolsillo, los que dependen de sus empresas para asistir a este tipo de eventos de formación, si no asisten es porque las empresas no están por la labor de gastar las perras en cursos y ahorrarlo para otros menesteres. En fin que me he desahogado y espero que España remonte el vuelo y para el próximo seminario se cumpla con el mínimo de asistentes.

Vídeos evento del 7 de Marzo GUSENET

Ya tenemos los vídeos de las sesiones celebradas ese día en Clave Informática.
Los 3 primeros vídeos son de David Bernad (http://bernilost.blogspot.com/) un compi de trabajo y amigo ;-) que hizo una exposición de WPF y herramientas con las que trabaja para modelado en 3D

http://gusenet.gruposdeusuarios.net/VideoWPF3DParte1/tabid/359/Default.aspx
http://gusenet.gruposdeusuarios.net/VideoWPF3DParte2/tabid/360/Default.aspx
http://gusenet.gruposdeusuarios.net/VideoWPF3DParte3/tabid/361/Default.aspx

Los vídeos de la segunda charla que trataba de una pequeña introducción a LINQ to SQL por Jorge Martínez

http://gusenet.gruposdeusuarios.net/VideoLINQParte1/tabid/362/Default.aspx
http://gusenet.gruposdeusuarios.net/VideoLINQParte2/tabid/363/Default.aspx
http://gusenet.gruposdeusuarios.net/VideoLINQParte3/tabid/364/Default.aspx

Los vídeos cortesía de Miguel Ángel Gras (saludos ex vecino)

Instalando SQL Server 2008 CTP de Noviembre

Sí, ya se que esto está más que resuelto y que el propio microsoft da la solución, pero el caso es que no tenía internet cuando estaba haciendo la instalación y me quedé un poco con cara de gili al ver ayer que no podía instalar la CTP de Noviembre, en fin mirando el lado positivo, me pegué una viciada a la XBOX 360 xDDD.

Para todos aquellos que vayan a instalar la CTP de Noviembre en una instalación limpia sobre Virtual PC y un XP con SP2 que sepáis que antes de poneros con la instalación tenéis que instalar Windows Installer 3.1 sino os dará una petada como esta:

-Unable to find an entry point named 'MsiSetExternalUIRecord' in DLL 'msi.dll'..

El instalador lo podéis encontrar en el propio DVD en la carpeta:
Servers\redist\Windows Installer
Y también como siempre en el centro de descargas de Microsoft.

Espero que os sea de utilidad a los que aún no tengáis instalada esta CTP y os encontréis con el mismo problema. Salu2

lunes, 31 de marzo de 2008

Varios Microsoft y SQL Server

Estamos a puntito de que Microsoft de por terminado el soporte técnico a SQL Server 2000 en sus versiones 64-Bit, Developer Edition, Enterprise Edition, Standard Edition y Workgroup Edition, la fecha de su defunción es el día 4 de Abril de 2008, eso sí, si disponéis del soporte técnico ampliado podréis disfrutar de él hasta el 9 de Abril de 2013.
Si quieres estar al día puedes visitar este enlace:
http://support.microsoft.com/lifecycle/?p1=2852

Por otra parte, ante el retraso sufrido por SQL Server 2008 RTM, la comunidad está pidiendo a gritos la publicación del Service Pack 3 para SQL Server 2005. Desde el Service Pack 2 ya se han publicado 6 versiones acumulativas y actualmente se está preparando una séptima. Ya sabéis si queréis estar al día debéis visitar:
http://support.microsoft.com/default.aspx/kb/937137/en-us# (y como ellos mismos dicen, "si no se ve gravemente afectados por cualquiera de estos problemas, nosotros recomendamos que espere al Service Pack siguiente de SQL Server 2005 que contiene la revisión en este paquete de actualización acumulativa")

domingo, 24 de febrero de 2008

SMO (SQL MANAGEMENT OBJECTS)

SMO es un conjunto de objetos de programación que cuenta con toda la funcionalidad de administración de la base de datos de SQL Server. De hecho, Management Studio se creó con SQL Management Objects. SMO se implementa como un ensamblado de Microsoft .NET Framework. Podemos utilizar SMO para automatizar las tareas administrativas habituales de SQL Server, como la recuperación mediante programación de los valores de configuración, la creación de nuevas bases de datos, la aplicación de secuencias de comandos de T-SQL, la creación de trabajos de SQL Server Agent y la programación de copias de seguridad. El modelo de objetos SMO es una sustitución más segura, confiable y escalable de los Objetos de administración distribuida (DMO), que se incluyó en las versiones anteriores de SQL Server.Para implementar en nuestra aplicación la funcionalidad de SMO debemos añadir una referencia al espacio de nombres Microsoft.SqlServer.SMO, esta dll la encontraremos en C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies

Ejemplo de cómo crear un Backup con SMO desde VB:

Imports Microsoft.SqlServer.Management.Smo
Public Class frmInicio

Private Sub cmdBackup_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdBackup.Click
Try
Dim bck As New Backup
Debug.Print(DateTime.UtcNow)
bck.Database = "PRUEBA"
bck.Devices.Add(New BackupDeviceItem("C:\BACKUP\PRUEBA.bak", DeviceType.File))
bck.Action = BackupActionType.Database
bck.SqlBackup(New Server("PCFRAN"))
Debug.Print(DateTime.UtcNow)
MsgBox("Backup realizado con éxito")
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
End Class

En los BOL de SQL Server 2005 podemos encontrar numerosos ejemplos de cómo programar jobs, etc. todo con SMO. Como muestra un botón:

ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/smo9/html/a15949ef-88d9-4205-892e-0b66588b4fcc.htm

Interceptando Errores en SQL Server con .Net Framework 2.0

Una conexión SqlConnection permanecerá abierta mientras el nivel de severidad del error sea de 19 o menos, para errores iguales o por encima de un nivel 20 se cerrará automáticamente la conexión.
A continuación se muestra información del nivel de severidad y una descripción (información extraída de los BOL de SQL Server 2005)

0-9
Informational messages that return status information or report errors that are not severe. The Database Engine does not raise system errors with severities of 0 through 9.
10
Informational messages that return status information or report errors that are not severe. For compatibility reasons, the Database Engine converts severity 10 to severity 0 before returning the error information to the calling application.
11-16
Indicate errors that can be corrected by the user.
11
Indicates that the given object or entity does not exist.
12
A special severity for queries that do not use locking because of special query hints. In some cases, read operations performed by these statements could result in inconsistent data, since locks are not taken to guarantee consistency.
13
Indicates transaction deadlock errors.
14
Indicates security-related errors, such as permission denied.
15
Indicates syntax errors in the Transact-SQL command.
16
Indicates general errors that can be corrected by the user.
17-19
Indicate software errors that cannot be corrected by the user. Inform your system administrator of the problem.
17
Indicates that the statement caused SQL Server to run out of resources (such as memory, locks, or disk space for the database) or to exceed some limit set by the system administrator.
18
Indicates a problem in the Database Engine software, but the statement completes execution, and the connection to the instance of the Database Engine is maintained. The system administrator should be informed every time a message with a severity level of 18 occurs.
19
Indicates that a nonconfigurable Database Engine limit has been exceeded and the current batch process has been terminated. Error messages with a severity level of 19 or higher stop the execution of the current batch. Severity level 19 errors are rare and must be corrected by the system administrator or your primary support provider. Contact your system administrator when a message with a severity level 19 is raised. Error messages with a severity level from 19 through 25 are written to the error log.
20-25
Indicate system problems and are fatal errors, which means that the Database Engine task that is executing a statement or batch is no longer running. The task records information about what occurred and then terminates. In most cases, the application connection to the instance of the Database Engine may also terminate. If this happens, depending on the problem, the application might not be able to reconnect.
Error messages in this range can affect all of the processes accessing data in the same database and may indicate that a database or object is damaged. Error messages with a severity level from 19 through 25 are written to the error log.
20
Indicates that a statement has encountered a problem. Because the problem has affected only the current task, it is unlikely that the database itself has been damaged.
21
Indicates that a problem has been encountered that affects all tasks in the current database, but it is unlikely that the database itself has been damaged.
22
Indicates that the table or index specified in the message has been damaged by a software or hardware problem.
Severity level 22 errors occur rarely. If one occurs, run DBCC CHECKDB to determine whether other objects in the database are also damaged. The problem might be in the buffer cache only and not on the disk itself. If so, restarting the instance of the Database Engine corrects the problem. To continue working, you must reconnect to the instance of the Database Engine; otherwise, use DBCC to repair the problem. In some cases, you may have to restore the database.
If restarting the instance of the Database Engine does not correct the problem, then the problem is on the disk. Sometimes destroying the object specified in the error message can solve the problem. For example, if the message reports that the instance of the Database Engine has found a row with a length of 0 in a nonclustered index, delete the index and rebuild it.
23
Indicates that the integrity of the entire database is in question because of a hardware or software problem.
Severity level 23 errors occur rarely. If one occurs, run DBCC CHECKDB to determine the extent of the damage. The problem might be in the cache only and not on the disk itself. If so, restarting the instance of the Database Engine corrects the problem. To continue working, you must reconnect to the instance of the Database Engine; otherwise, use DBCC to repair the problem. In some cases, you may have to restore the database.
24
Indicates a media failure. The system administrator may have to restore the database. You may also have to call your hardware vendor.

Ahora veamos la manera de interceptar los errores desde nuestra aplicación, el código que muestro a continuación intercepta posibles errores a la hora de conectar con nuestra base de datos

Private Sub ConectarBD(ByVal cadenaConexion As String)
Dim conn As New SqlConnection(cadenaConexion)
Try
conn.Open()
Catch ex As SqlException
Dim errorMessage As String = ""
'Recorremos todos los errores que nos devuelva.
'Podemos inspeccionar los errores para devolver mensajes personalizados dependiendo
'del tipo de error.
For Each connectionError As SqlError In ex.Errors
errorMessage += connectionError.Message & "error: " & _
connectionError.Number.ToString & ")" & Environment.NewLine
'Aquí podríamos poner un SELECT CASE con los códigos de error más comunes, como
'login de usuario, nombre de la base de datos, etc
If connectionError.Number = 18456 Then
MsgBox("Login inválido, por favor introduzca unas credenciales válidas")
End If
Next
MessageBox.Show(errorMessage)
Finally
conn.Close()
End Try
End Sub

domingo, 17 de febrero de 2008

Reunión Gusenet 25 Enero

Sí hacía tiempo que no subía nada nuevo al blog, las fiestas y el cansancio acumulado me lo han impedido, pero bueno ahora toca ponerse las pilas y seguir remando.

El 25 de Enero se celebró en la Facultad de Ingeniería Informática de la Universidad de Murcia una nueva reunión del grupo Gusenet, los temas que se trataron iban a ser 2, una introducción al nuevo plan general contable y después un cubo OLAP de contabilidad impartido por Miguel Egea. Si he de seros sincero lo que más ilusión me hacía era esta última parte, y al final por problemas de trabajo Miguel no pudo asistir, pero en su lugar apareció Francisco González ( también de Solid) y nos adelantó dos nuevas mejoras incluidas en SQL Server 2008, el Data Change Capture y la instrucción MERGE.

La instrucción MERGE es una novedad relativa del estándar SQL, por la que podemos insertar, actualizar y eliminar simultáneamente. Esta instrucción ya estaba disponible en ORACLE y ha sido una gran idea incluirla en la nueva versión de SQL Server. Veamos un ejemplo de como sincronizar 2 tablas de empleados:

MERGE EmpleadosSync as ES
USING Empleados AS E
ON (E.EmpleadoID = ES.EmpleadoID)
WHEN MATCHED AND E.Nombre <> ES.Nombre
THEN UPDATE SET ES.Nombre = E.Nombre
WHEN NOT MATCHED THEN
INSERT (EmpleadoID, Nombre) VALUES (E.EmpleadoID, E.Nombre)
WHEN SOURCE NOT MATCHED THEN
DELETE;