El real valor de las certificaciones del mundo informático (de sus realidades, mitos y proyección)
opinión
nº3 abril 2004 • Precio: 6,00 € (España)
Visual Studio 2005 y SQL Server 2005
Whidbey y Yukon ya tienen nombre
El poder de la reflexión en .NET
Generación de tipos en tiempo de ejecución
Visual Studio 2005 y SQL Server 2005
Whidbey y Yukon ya tienen nombre
El poder de la reflexión en .NET
Generación de tipos en tiempo de ejecución
Laboratorio
Crystal Enterprise v10
Open Source
datNet
Comunidades
Concurso de creación de páginas Web
con ASP.NET
Laboratorio
Crystal Enterprise v10
Open Source
datNet
Comunidades
Concurso de creación de páginas Web
con ASP.NET
Equivalencia de instrucciones
de C# y VB .NET (y III) •
Configuración de
aplicaciones Web de ASP.NET
• Gestión de concurrencia en
ADO.NET • Introducción a
las versiones nuevas. Otros opinan que lo mejor es
que el software salga al mercado cuando realmente
esté listo y que esto es mejor aunque haya que espe-
rar algo más. Pero es que todo esto afecta a tantas
cosas que sería mejor que estos chicos de Microsoft
afinasen más, si bien es cierto, que yo me encuentro
entre los que opinan que los lanzamientos precipi-
tados para cumplir fechas son a la larga peores para
los usuarios.
Acabamos de recibir la noticia de la multa de
casi 500 millones de euros (la más alta impuesta
hasta ahora por este organismo) que la Comisión
Europea ha impuesto a Microsoft por supuesto
abuso de posición dominante en el mercado euro-
peo. Ahora se iniciará una nueva, larga y aburrida
batalla legal, por supuesto. Esto viene después de
que Steve Ballmer hiciera un viaje inesperado a
Bruselas, cancelando su keynote en el Summit el
miércoles 17, en la que se especulaba que habría
una demo de Indy, para intentar llegar a una sali-
da negociada que finalmente no fue posible.
¿Tendremos un Windows europeo distinto del res-
to? ¿Esta Comisión no debería ser más dura con
otros monopolios de hecho que sufrimos los usua-
rios de manera sangrante? ¿Lo han hecho en bene-
ficio de los usuarios o de los competidores de
Microsoft? Me consta que los fabricantes de Real
Player, Real Networks están muy satisfechos.
Personalmente a mí me importa poco si Windows
lleva o no Windows Media Player, de todas formas
dnm.editorial
<<
dnm.editorial
Editor
Paco Marín
()
Administración
Pilar Pérez
()
Asesor Técnico/Coordinación
Marino Posadas
()
Publicidad
Juan Manuel Urraca
()
Redactores y Colaboradores
Alejandro Mezcua, Angel Esteban,
Antonio Quirós, Antonio Rojo, David
Carmona, Eladio Rincón, Francisco
Charte, Fernando Guerrero, Fernando
Nogueras, Guillermo ‘guille’ Som, Iván
González, Jesús López, Jordi Rambla,
Jorge Serrano, José Manuel Alarcón, Juan
Torres, Liborio López, Luis Miguel Blan-
co, Marino Posadas, Miguel Egea, Miguel
Katrib, Pablo Abbate, Pedro Gómez,
Pedro Pozo, Pepe Hevia, Salvador Ramos
Diseño y Maquetación
Éride Diseño Gráfico
Tel.: (34) 91 477 48 85
se realizaba de forma muy distinta. En este artículo damos un breve repaso a las
opciones principales de configuración de ASP.NET
Gestión de concurrencia en ADO.NET 20-26
La concurrencia, en un entorno multiusuario, es siempre una cuestión
problemática, pero si además se trata de un entorno desconectado como el que se
usa en ADO.NET con sus DataSets y DataAdapters, la problemática es aún
mayor debido a la propia naturaleza desconectada del entorno.
El poder de la reflexión en .Net 27-34
Este trabajo muestra cómo usando reflection se define un conversor de tipos que
permite a partir de un objeto, el cual comparte una misma funcionalidad con un
interface, obtener un objeto proxy equivalente en funcionalidad al original pero
que garantiza ser subtipo de dicha interface.
Introducción a GDI+ 37-42
La llegada de la tecnología .NET ha venido acompañada de GDI+ (Graphics
Device Interface), que como su nombre deja entrever, se trata de la nueva
generación del API gráfico de Windows, adaptado a la plataforma .NET
Framework.
SQL-Server. Diseñar la estrategia de copias de seguridad y restauraciones 43-49
Todos los sistemas necesitan una salvaguarda, pero aquellos que contienen datos
importantes mucho más aún. En una base de datos suele guardarse información
muy viva y casi siempre trascendental para el negocio que sustentan.
El Señor Arquitecto 50-51
Parece que la arquitectura está de moda. ¿A qué se debe toda esa artillería?
¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo
sirve para allanar el camino hacia el combate con nuestro enemigo virtual?
Crystal Enterprise v10 52-53
Business Objects, líder en el área de Business Intelligence, acaba de lanzar las primeras
versiones bajo su égida de los productos Crystal, adquiridos a Crystal Decisions. En este
artículo presentamos Crystal Enterprise 10 [CE10], el hermano mayor de una familia
que también incluye a Crystal Analysis y al ampliamente conocido Crystal Reports.
d
r
á
s
5
0
7
d
e
d
e
s
c
u
e
n
to
a
l
in
s
c
ri
b
ir
te
a
n
u
momento para asignarles su nombre comercial:
Visual Studio 2005 y SQL Server 2005.
Según fuentes de Microsoft, “Microsoft ha
tomado la decisión de retrasar la entrega de estos
productos para poder llegar a ofrecer los altísi-
mos requerimientos que nos han pedido nuestros
clientes”.
Según Tom Rizzo, Director of Product
Management for SQL Server, hemos decidido sacar
una beta 2 de Yukon y una beta 1 de Whidbey hacia
mediados de 2004 y finalmente una beta 3 de
Yukon para finales de 2004 que no estaba previs-
ta. Ambos productos van a estar estrechamente
integrados, se lanzaron a la vez.
El soporte completo de SQL Server 7 y SQL
Server 2000 termina en el año 2005, por lo que el
retraso en la salida de la nueva versión de SQL
Server, significa que habrá menos tiempo para la
migración. ¿Supone este retraso en la salida de
Yukon, un retraso igual en la fecha tope de sopor-
te de las versiones anteriores? Según el citado Tom
Rizzo, Microsoft está considerando una amplia-
ción de este soporte.
Además, esto puede tener, a nuestro juicio, un
claro efecto dominó. Longhorn, la siguiente ver-
sión de Windows, sufrirá posiblemente un retra-
so en su salida, al igual que puede ocurrir con el
Office 12, la versión de Office para este sistema
operativo. Hay que tener en cuenta que este sis-
tema operativo usará a Yukon para gestionar los
les de Windows 2003.
El SP1 de Windows 2003 quizá esté disponible para finales de este año.
Una de las posibles mejoras que la nueva versión tenga sea soporte para Indigo así como otras carac-
terísticas del lado del servidor de Longhorn, aún por determinar, e incluirá la nueva versión del .NET
Framework que saldrá el año que viene.
Esto es completamente lógico pues la nueva versión del sistema operativo del servidor aparecerá des-
pués de Longhorn y el actual Windows 2003 tendrá que soportar a los PCs que se conecten con Longhorn
instalado.
Puede obtener más información en la Web de Paul Thurrott’s en http://www
.winsupersite.com.
Windows XP SP2 para 2004
Windows XP SP2 es una actualiza-
ción de Windows XP que incluye mejo-
ras de seguridad como el nuevo
Windows Security Center que centrali-
zará la configuración de seguridad y que
incluye incluso protección antivirus; un
nuevo firewall que reemplaza al actual
ICF (Internet Connection Firewall) con
políticas de grupo integradas en el
Active Directory; una nueva versión de
RPC para protección contra ataques en
la red;un bloqueador de popups y un
gestor de descargas en el también nuevo Internet Explorer junto con mejoras de seguridad en el
Outlook Express y en el Windows Messenger; un nuevo Windows Update; una remodelada protec-
ción de memoria para evitar los comunes “overruns”; mejoras de seguridad en el Windows Media
Player; y otros cambios.
La RC1(Release Candidate 1) de Windows XP SP2 ya está disponible y los betatesters registrados
pueden descargarla desde Puede obtener más información
en el MSDN en />rityinxpsp2.asp
cuestión, " Willy, verás en estas URL's los exáme-
nes están a la venta…", la verdad no podía creerlo, no
podía creer que después de invertir cerca de 500 dóla-
res en una semana de educación técnica (demasiado
dinero para las economías "latam" en esos días e inclu-
so hoy) y pagar 80 dólares aproximadamente por el
examen, alguien vendiera la prueba por 200 dólares
aproximadamente (mucho más que para esos días el
salario promedio para un desarrollador no sumaba más
de 220 dólares mensuales en el mejor de los casos a
este lado del charco), quedé realmente desilusionado,
y entendí que nunca las certificaciones equivaldrían o
superarían las ingenierías por dos razones: una de ellas,
la que acabo de relatar; y la siguiente, porque las tec-
nologías tienen una duración muy corta, en cambio,
cuando eres ingeniero, tus bases "ingeniériles" duran
para siempre (aunque la verdad es que hoy me lleva-
ría un rato recordar la metódica de solución a las trans-
formadas de fourier =P).
Con ello y otros bemoles, seguí igual tomando mis
cursos técnicos y rindiendo mis exámenes (incluso per-
dí el 70-300, un examen de arquitectura de .NET en
el primer intento, hace sólo algunos meses). A estas
alturas usted se puede preguntar ¿porqué seguir rin-
diendo estas pruebas, que pareciere que día a día, estu-
vieren más y más a la venta por unos pocos dólares?
(La verdad es que me asombra el nivel de fidelidad de
esos documentos; es tal el descaro, que salen hasta las
capturas de pantalla). ¿Porqué rendir una prueba que
tiene un coste tan alto, si las respuestas están a la ven-
do el tema con toda la fuerza que amerita).
Una perspectiva mundial
y los certificados
Recientemente una de las publicaciones más
importantes en el tema, MCPMag.com, publicó el
resultado de su estudio de salarios con respecto a los
profesionales certificados (no sólo de Microsoft, sino
de diferentes compañías), disponibles en http://mcp-
mag.com/salary2003/ (les recomiendo mucho la lec-
tura de este documento). Muestra dos tendencias cla-
ras: el nivel de profesionales ha aumentado conside-
rablemente, a medida que las certificaciones técnicas
han pasado a ser necesidad por solicitud de los emple-
adores y una tendencia al aumento de sus salarios…
entonces ¿qué es lo inclusive de esta encuesta? Bueno,
dicha labor de recolección de información, sólo se lle-
vó acabo en Estados Unidos, ¿y el resto de nosotros
donde quedamos? ¿Será que nuestras economías pue-
den equipararse en proporción a salarios…? La res-
puesta evidentemente es no. Lo que implicaría que el
coste de dicho tipo de educación fuere proporcional-
mente ajustada. No son lo mismo 100 dólares en
Estados Unidos que en Latam
dotNetManía
<<
9
dnm.opinion
<<
Figura 1. Reporte de Certificados a Febrero
de 2004
sustentar la credencial en caso de rendir
positivamente la prueba. A día de hoy,
algunas compañías, mantienen esta mecá-
nica. Esto permite mantener la credibi-
lidad en la credencial y en consecuencia
del profesional que decide tomarlas y me
lleva al siguiente punto de este escrito
¿Contrataría usted a un
profesional sin experiencia
de campo y con certificaciones
a su haber?
Esta es la misma pregunta que debe-
rían hacerse las personas que se logran
certificar de una manera, cómo decir-
lo… "poco ortodoxa".
Si me hicieran esta pregunta, mi res-
puesta sería un contundente JAMÁS (¿de
qué me sirve un experto de diploma, si
en realidad tengo un fiasco como emple-
ado?). Desde mi perspectiva, es sencilla-
mente inconcebible que un profesional
diga tener credenciales que lo habilitan
como experto en un frente tecnológico
y que no posea experiencia. Si usted es
empleador, es muy buena idea enterarse
del Skill de cada certificación, y con ello
determinar si es equiparable lo uno con
lo otro. Es notorio que la certificación es
un diferenciador, pero no lo será por
mucho tiempo, pasará a ser un requisito
aplicaciones, socios comerciales y emplea-
dos con el núcleo de organización de proce-
sos altamente escalable de BizTalk Server.
BizTalk Server 2004 ayuda a incrementar la
productividad de los trabajadores con infor-
mación, los profesionales en TI y los desa-
rrolladores a través de herramientas especí-
ficas para desarrollar, administrar y acceder
a los procesos empresariales en entornos
familiares tales como Microsoft Office
System y Visual Studio® .NET 2003.
“En la actualidad, las empresas se enfren-
tan a retos importantes para administrar y
automatizar los procesos empresariales cada
vez más desconectados. BizTalk Server 2004
permite a los clientes administrar y automa-
tizar sus procesos empresariales, al tiempo
que brinda a los usuarios herramientas para
diseñar, implementar y supervisar estos pro-
cesos en tiempo real”, dijo Ted Kummert,
vicepresidente corporativo del Grupo de
Servidores E-Business de Microsoft. “Los
primeros usuarios han obtenido gran valor
de sus soluciones BizTalk Server 2004, y el
día de hoy nos emociona poder ofrecer los
mismos resultados a más clientes”.
Nuevas características que organi-
zan y administran los procesos empre-
sariales de principio a fin Además de las
capacidades de integración de aplicaciones
usuarios Windows y no Windows que acce-
den a las aplicaciones de giro empresarial.
• Máquina de normas empresariales muy
escalable. Permite a los analistas empre-
sariales crear normas y políticas flexibles
y de mejor respuesta en torno a los pro-
cesos empresariales.
• Supervisión de actividad empresarial
(BAM). Ofrece a los trabajadores con
información supervisión en tiempo real de
los procesos empresariales a través de
herramientas conocidas como Microsoft
Office Excel o Microsoft Office SharePoint
Portal Server 2003.
• Integración en Microsoft Office
System. Permite el análisis de procesos y
datos.
Microsoft lanza BizTalk Server 2004
dotNetManía
<<
11
Instrucciones de decisión y operadores
de comparación
En algunas de estas instrucciones se utilizan
expresiones que devolverán un valor verdadero
(true) o falso (false).
En esas expresiones podemos utilizar cualquiera
de los operadores condicionales mostrados en la
tabla 8. También podemos formar expresiones múl-
tiples usando los operadores condicionales mos-
Distinto != <>
Menor, menor o igual, mayor o mayor o igual son los
mismos operadores en ambos lenguajes: <, <=, >, >=
Y & And
Or |Or
Xor ^ Xor
Negación (not) ! Not
Y cortocircuitado && AndAlso
Or cortocircuitado || OrElse
Tabla 8. Instrucciones (operadores) de comparación
Tercera y última entrega de esta serie de artículos en la que hemos pretendido
explicarle cómo hacer las mismas cosas (o casi) tanto en C# como en Visual
Basic .NET
dotNetManía
<<
12
dnm.lenguajes.net
<<
habrá una parte inicial y otra instruc-
ción que marcará el final de dicho bucle.
En la tabla 10 podemos ver cómo
crear bucles
for
,
do
,
while
así como algu-
nos aspectos a tener en cuenta, ya que
Constructores, destructores
liza cada vez que destruimos un obje-
to, en .NET Framework se llama
finalizador, de hecho, en Visual Basic
.NET se utiliza como destructor una
sobrecarga del método
Finalize
decla-
rado en la clase
Object
. En C# el des-
tructor se define usando el nombre
de la clase precedida con
~
. Un des-
tructor se llamará cuando un objeto
deje de estar en “ámbito” o se asigne
un valor nulo a la variable. Hay que
tener en cuenta que en .NET los
objetos no se destruyen inmediata-
mente, sino que cuando dejan de ser
Tarea a realizar C# VB .NET
Toma de decisiones con if if(a != b) <código>; If a <> b Then <código>
Toma de decisiones con if if(a > b){ If a > b Then
con varias instrucciones <código> <código>
} End If
Instrucción if que si se if(a > b) If a > b Then
cumple haga una cosa y si no <código> <código>
se cumple, haga otra, else Else
usando varias líneas <código> <código>
End If
break; <código>
default: Case Is <expresión>
<código> <código>
break; Case Else
} <código>
End Select
En C# sólo se pueden usar valores constantes con cada cláusula case. Podemos anidar una tras otra indicando
varios case seguidos. Después de cada bloque case hay que usar la instrucción break o bien se debe salir del blo-
que de código, ya que no se permite pasar de un case a otro, salvo que usemos goto case <constante>.
En VB .NET en cada cláusula Case se pueden indicar varios valores separados por comas, incluso un rango de
valores usando To o un valor condicional usando Is. Esos valores no tienen porqué ser constantes, pueden ser
también expresiones.
Tabla 9. Instrucciones de decisión
<<
dotNetManía
<<
13
dnm.lenguajes.net
<<
“útiles”, el recolector de basura (reco-
lector de objetos no usados) se encar-
ga de ellos y será el propio GC
(
Garbage Collector
) se encargará de
destruirlo, aunque esa destrucción no
se hará inmediatamente, este punto es
importante ya que si nuestro objeto
mantiene recursos externos éstos no
se liberarán inmediatamente, en esos
Bucle for for(<inicio>; <final>; For <contador> =
<incremento>) <inicio> To <final>
<código> <código>
Next
Bucle for infinito for(;;) ; For i = 0 To 0 Step 0:
Nota: Espero que a nadie en su Next
sano juicio se le ocurra hacer esto
Bucle for con incremento for(int i = 0; i<10; i For i = 0 To 9 Step 2
distinto de uno. += 2)
<código> <código>
Next
Bucle for para recorrer de mayor for(int i = 10; i>0; i—) For i = 10 To 1 Step -2
a menor. <código> <código>
Next
Salir de un bucle for break; Exit For
En C# podemos indicar varias instrucciones después de if o else incluyéndolas dentro de un bloque entre
un par de llaves {} o bien una sola instrucción acabada con punto y coma.
En VB .NET podemos crear un bloque If acabándola con End If, tanto en la parte If como en la parte Else
podemos indicar una o más líneas con instrucciones. Si no se indica End If se tomará como una instrucción
en una sola línea.
Bucle sin condición de término do{ Do
<código> <código>
}while(true) Loop
Bucle con una condición después do{ Do
de cada iteración, se repetirá <código> <código>
mientras se cumpla la condición }while(<expresión>) Loop While <expresión>
Bucle con una condición al principio while(<expresión>) Do While <expresión>
<código>; <código>
Loop
While <expresión>
y ocultar métodos
Las clases abstractas son clases que
sólo se pueden utilizar para derivar
nuevas clases, no se podrán usar para
crear nuevos objetos. Una clase abs-
tracta puede contener métodos y pro-
piedades normales así como abstrac-
tos, los métodos abstractos sólo se
definen como en las interfaces: sin
código que los hagan operativos.
Por otro lado los métodos virtua-
les son los que podremos redefinir en
la clase derivada, para dar la funcio-
nalidad adecuada que creamos conve-
niente. Las referencias a las instancias
creadas en memoria siempre usarán
las versiones redefinidas de los méto-
dos (o miembros) virtuales. Por defec-
to, los métodos y propiedades de una
clase no son virtuales, es decir, no se
pueden redefinir en las clases deriva-
das, sin embargo podemos ocultarlos.
Esos miembros ocultados sólo perte-
necerán a la instancia de la clase que
los define, no a las referencias obte-
nidas a través de tipos de la clase base.
Los miembros abstractos siempre
son virtuales.
También podemos definir clases
selladas, lo contrario de las clases abs-
End Sub
Definir un destructor o finalizador ~Cliente() Public Overrides Sub
{} Finalize()
End Sub
En C# el constructor siempre se llama como la clase.
En VB .NET el constructor siempre es un método Sub llamado New.
Los destructores sólo se pueden usar en las clases no en las estructuras.
Definir un constructor que llama a otro public Cliente(int id, Public Sub New(id As
constructor de la propia clase. string nombre) : Integer, nombre As
this(id) String)
{} Me.New(id)
End Sub
Definir un constructor que llama public Cliente(int id, Public Sub New(id As
a otro constructor de la clase base. string nombre) : Integer, nombre As
base(id) String)
{} MyBase.New(id)
End Sub
Tabla 11. Constructores y destructores.
Tarea a realizar C# VB .NET
Definir una clase abstracta abstract class Prueba MustInherit Class
{} Prueba
End Class
Definir una clase sellada sealed class Prueba2 NotInheritable Class
{} Prueba2
End Class
Definir un miembro abstracto abstract void Prueba(); MustOverride Sub
Prueba()
Definir un miembro virtual virtual void Prueba2() Overridable Sub
{} Prueba2()
End Sub
las aplicaciones ASP.NET existentes
en el servidor y se localiza en el direc-
torio Windows \Microsoft.NET
\Framework\[versión]\config.
2. Configuración de la aplicación: Se almace-
na en el fichero web.config. Un servidor
Web puede contener varios ficheros
web.config, cada uno de ellos dentro del
directorio raíz de cada una de las apli-
caciones ASP.NET del servidor. La con-
figuración indicada dentro de un fiche-
ro web.config sobrescribe los valores espe-
cificados en el fichero machine.config.
Ventajas
Este nuevo mecanismo de configu-
ración que encontramos en la platafor-
ma .NET para configurar las aplicacio-
nes Web de ASP.NET, aporta las
siguientes ventajas:
• Valores de configuración en formato
legible: Es muy sencillo abrir un
fichero XML y leer o modificar la
configuración.
• Actualizaciones inmediatas: Las
modificaciones realizadas en la
configuración de las aplicaciones
se aplican de forma inmediata sin
necesidad de reiniciar el servidor
Web o parar los servicios.
• Configuraciones fácilmente repetibles:
siendo el fichero machine.config la con-
figuración raíz de la que heredan el
resto.
Por lo tanto, en primer lugar tene-
mos el fichero machine.config que afec-
tará a todas las aplicaciones ASP.NET
existentes en el servidor Web. A los valo-
res de configuración indicados en este
fichero se le añadirían o sobrescribirí-
an los presentes en el fichero web.config
que posee un sitio Web, que actúa como
una aplicación ASP.NET.
Configuración de aplicaciones
Web de ASP.NET
Por Ángel Esteban
Software Arquitect
Alhambra-Eidos
En versiones anteriores de la tecnología ASP,la configuración de aplicaciones Web se rea-
lizaba a través del administrador de servicios de Internet (Internet Information Server,
IIS), ya que la información relativa a la configuración de aplicaciones ASP se almacenaba
en un repositorio binario denominado metabase de Internet Information Server. Se tenía
que acceder a las distintas hojas de propiedades que nos ofrecía IIS para poder configu-
rar nuestra aplicación.
Pero en la tecnología
<<
Si dentro de este sitio Web tenemos
definida una aplicación ASP.NET, que
ofrece su propio fichero web.config, éste
se combinaría con el fichero XML pre-
sente en el sitio Web predeterminado.
el manejador, cuya clase especificamos
en el atributo type, dentro de este atri-
buto además se indica el assembly en el
que se encuentra la clase junto con su
versión correspondiente.
Si se desea definir manejadores para
una sección de valores de configuración
que a su vez va a tener varias secciones,
las distintas etiquetas <section> irán inclui-
das entre las etiquetas <sectionGroup>.
En el fuente 1 se muestra un frag-
mento del fichero machine.config que se
corresponde con la definición de dos
manejadores para las secciones
sessionState y trace, que a su vez perte-
necen al grupo <system.web>, también se
define el manejador para la sección
appSettings. El grupo <system.web> va a
ser de gran interés, ya que nos va a per-
mitir configurar los distintos aspectos
de nuestras aplicaciones ASP.NET.
Una vez que se ha declarado la sec-
ción de los manejadores no es necesa-
rio volver a declararla en los ficheros
web.config, ya que si se encuentran en el
fichero machine.config, o en un fichero
web.config de nivel superior, la hereda-
rán de manera automática.
Sección de los valores
de configuración
Todas estas opciones de configura-
ción se encontrarán dentro de la sección
de los valores de configuración del fiche-
ro de configuración correspondiente,
que por lo general será el fichero
web.config.
Configuración general
En esta sección se va a indicar una serie
de parámetros de configuración genéri-
cos para la aplicación ASP.NET. Para ello
se hace uso de la etiqueta <httpRuntime>.
Esta etiqueta tiene como más significati-
vos los siguientes atributos:
• executionTimeout: En este atributo
indicaremos en segundos el tiempo
de espera que se aplicará a la ejecu-
ción de un recurso solicitado. Una
dotNetManía
<<
17
dnm.asp.net
<<
<?xml version=”1.0” encoding=”UTF-8” ?>
<configuration>
<configSections>
<section name=”appSettings”
type=”System.Configuration.NameValueFileSectionHandler,System,
Version=1.0.2411.0, Culture=neutral,PublicKeyToken=b77a5c561934e089” />
<sectionGroup name=”system.web”>
<section name=”sessionState”
tes atributos:
• autoEventWireup: Indica si los even-
tos de la página se van a lanzar de for-
ma automática. Por defecto es true.
• buffer: Se utilizará para activar o
desactivar el búfer de las páginas
ASP.NET de la aplicación actual.
Puede tomar valores true/false.
• enableSessionState: Este atributo per-
mite activar o desactivar el estado de
sesión, es decir, permite o no la uti-
lización del objeto Session para alma-
cenar información común a la sesión
actual del usuario con la aplicación
Web. Puede tomar valores true/false.
• enableViewState: Permite activar o
desactivar el mantenimiento auto-
mático de los valores de los contro-
les Web dentro de los formularios
Web. Por defecto es true.
Estos atributos se corresponden con
los atributos del mismo nombre de la
directiva @Page, por lo que utilizando
esta directiva podemos sobrescribir estos
valores de configuración para una pági-
na ASP.NET en concreto.
Configuración de la aplicación
En esta sección vamos a poder alma-
cenar valores de detalles de configuración
de la aplicación. Para almacenar estos
ello presenta los siguientes atributos:
• mode: Indica el modo de almacena-
miento utilizado para el proceso que
se corresponde con el estado de la
sesión. Los valores que podemos
asignar a este atributo son: InProc,
el estado de sesión se encuentra en
el proceso actual de ASP.NET; Off,
el estado de sesión se encuentra
desactivado; SQLServer, se utiliza
un proceso de SQL Server para
almacenar el estado; StateServer, se
utiliza un proceso en forma de ser-
vicio de Windows para almacenar
el estado. Por defecto es InProc.
• stateConnectionString: En este atri-
buto se indica la dirección IP y el
número de puerto utilizados para
comunicarse con el servicio de
Windows que ofrece las facilidades
de almacenamiento. Este atributo
únicamente tiene sentido utilizarlo
cuando el atributo mode tiene el
valor de StateServer.
• sqlConnectionString: Identifica la
cadena de conexión de la base de
datos utilizada para almacenar el
estado cuando el atributo mode
posee el valor SQLServer. Esta cade-
na debe incluir la dirección IP y el
<configuration>
<appSettings>
<add key=”conexion” value=”server=aesteban;database=datos;uid=sa;pwd=”/>
<add key=”sentencia” value=”select nombre, apellidos,email from
Usuarios”/>
</appSettings>
</configuration>
Fuente 3. Ejemplo de uso de la etiqueta <appSettings>
dotNetManía
<<
19
dnm.asp.net
<<
Globalización
Los valores indicados en la sección
<globalization> nos va a permitir confi-
gurar las opciones de codificación y cul-
tura. La etiqueta <globalization> nos
ofrece cinco atributos para indicar diver-
sos aspectos de la codificación utilizada
en nuestra aplicación:
• requestEncoding: Mediante este atri-
buto podemos indicar la codifica-
ción utilizada en cada solicitud. Por
defecto tiene la codificación utf-8.
• responseEncoding: Este atributo tie-
ne el mismo significado que el ante-
rior pero aplicado a una respuesta
enviada al cliente. Por defecto tie-
ne la codificación utf-8.
indiquemos. Por defecto es false.
• name: Este atributo estará disponi-
ble cuando el atributo impersonate
tenga el valor true, y lo vamos a uti-
lizar cuando deseemos indicar una
cuenta de usuario de Windows espe-
cífica para representar al proceso de
ejecución de ASP.NET.
• password: En él indicaremos la con-
traseña del usuario que se va a uti-
lizar en el proceso.
En el fuente 6 se puede observar el
uso de esta etiqueta. En este caso se indi-
ca que utilice como identidad del proce-
so de ASP.NET un usuario de Windows.
Si quisiéramos utilizar el usuario de IIS,
le asignaríamos el valor de cadena vacía
a los atributos name y password:
Configuración de trazas
La configuración del mecanismo de
trazas que de ASP.NET se hace a tra-
vés del uso de la etiqueta <trace> que tie-
ne los siguientes atributos:
enabled: Este atributo indica si el
mecanismo de trazas se encuentra acti-
vado a o no. Tiene por lo tanto la mis-
ma funcionalidad que el atributo de mis-
mo nombre de la directiva @Page. Su
valor por defecto es false.
requestLimit: En este atributo indi-
de configuración.
<configuration>
<system.web>
<globalization requestEncoding=”utf-8” responseEncoding=”utf-8”
culture=”es-ES” uiCulture=”es-ES”/>
</system.web>
</configuration>
Fuente 4. Ejemplo de la sección <Globalization>.
<configuration>
<system.web>
<identity impersonate=”true” user=”aesteban” password=”xxx”/>
</system.web>
</configuration>
Fuente 5. Ejemplo de la sección <Identity>.
<configuration>
<system.web>
<trace enabled=”false” localOnly=”true” pageOutput=”false” requestLimit=”10”
traceMode=”SortByTime” />
</system.web>
</configuration>
Fuente 6. Ejemplo de la sección <trace>.
dotNetManía
<<
20
cual es esa problemática y
posteriormente qué alternativas tenemos para
tratarla. El problema fundamental que se nos
plantea son los conflictos de concurrencia. Un
conflicto de concurrencia se produce cuando un
usuario modifica un registro de una tabla de una
• Ha sido modificado desde la última vez que
se leyó.
• Ha sido eliminado desde la última vez que
se leyó.
Otro aspecto básico acerca de los conflictos
de concurrencia es la forma de detectarlos. La
técnica de detección se basa fundamentalmente
en incluir en la cláusula WHERE de la instruc-
ción UPDATE o DELETE el valor original de
los campos, es decir, el valor que tenían los cam-
pos del registro cuando se leyeron de la base de
datos. Pongamos un ejemplo para aclarar ideas.
Gestión de concurrencia en ADO.NET
Por Jesús López Méndez
(SqlRanger)
La concurrencia, en un entorno multiusuario, es siempre una cuestión proble-
mática, pero si además se trata de un entorno desconectado como el que se
usa en ADO.NET con sus DataSets y DataAdapters,la problemática es aún mayor
debido a la propia naturaleza desconectada del entorno.
Veamos, en primer lugar,
<<
Supongamos que estamos trabajando
con la siguiente tabla en una base de
datos de SQL Server:
El comando UPDATE que detec-
ta conflictos de concurrencia sería el
siguiente:
Como veis, están todos los valores
originales en la cláusula WHERE de
esta instrucción parametrizada. De
clave primaria en la cláusula WHERE.
La instrucción UPDATE sería la
siguiente:
Aún así, podríamos obtener un
conflicto de concurrencia, pero sólo
en el caso de que haya sido eliminado
el registro. Un inconveniente de esta
opción es que es posible perder modi-
ficaciones. Si por ejemplo, los usua-
rios A y B leen el empleado 10, el
usuario A modifica su nombre y lo
guarda, y luego B modifica el apelli-
do y lo guarda, las dos actualizaciones
tienen éxito, pero la modificación que
hizo A se pierde, ya que el nombre es
sobrescrito con el valor que leyó B.
En ciertos sistemas, esta posible pér-
dida de modificaciones es inaceptable
y por tanto habría que elegir otra
opción.
Otra alternativa sería incluir en la
cláusula SET sólo los campos que se
han modificado. De esta manera, aun-
que sólo incluyéramos la clave pri-
maria en la cláusula WHERE, no se
perderían las modificaciones. También
es una opción interesante incluir en
la cláusula SET sólo los campos modi-
ficados, y en la cláusula WHERE la
clave primaria más el valor original de
SET DNI=@DNI, Nombre=@Nombre, Apellidos=@Apellidos
WHERE IdEmpleado=@Original_IdEmpleado AND DNI=@Original_DNI AND
Nombre=@Original_Nombre AND Apellidos=@Original_Apellidos
UPDATE Empleados
SET DNI=@DNI, Nombre=@Nombre, Apellidos=@Apellidos
WHERE IdEmpleado=@Original_IdEmpleado
Los conflictos de concurrencia no se producen
solamente al actualizar un registro porque otro usuario
lo haya modificado, también ocurren si el registro
ha sido eliminado por otro usuario
dotNetManía
<<
21
dnm.ado.net
<<
dotNetManía
<<
22
dnm.ado.net
<<
los campos, pero resulta más eficiente ya que la ins-
trucción es más corta, reduciéndose el tráfico de
red y reduciendo el trabajo del procesador de con-
sultas del servidor de base de datos. Un campo de
tipo TimeStamp en SQL Server es una especie de
autonumérico de 64 bits único en toda la base de
datos. No puede haber dos registros en una base de
datos con el mismo valor de TimeStamp, incluso
aunque pertenezcan a distintas tablas. Cada vez que
se modifica un registro que tiene un campo
Empecemos primero por los conflictos que se
producen al actualizar. Si la causa es que otro usua-
rio lo ha modificado podríamos tener las siguien-
tes alternativas:
• Descartar las modificaciones y refrescar el registro
volviéndolo a leer de la base de datos. Al usuario
le avisaríamos del conflicto de concurrencia y
le daríamos la oportunidad de volver a hacer
las modificaciones.
• Refrescar sólo los valores originales sin descartar las
modificaciones. Al usuario le avisaríamos del con-
flicto. Entonces él tendría la oportunidad de
ver las modificaciones deshaciendo cambios o
de volver a guardar con lo que forzaría la actua-
lización.
• Directamente forzar la actualización. Esto se
conoce como la técnica “el último que llega
gana”. En realidad esta acción no es una res-
puesta a un conflicto de concurrencia, ya que
para llevarla a cabo incluiríamos únicamente
la clave primaria en la cláusula WHERE, no
detectándose conflictos de concurrencia por
modificación.
Si la causa es que otro usuario lo ha eliminado,
las alternativas serían las siguientes:
• Volver a insertar el registro en la base de datos. En
el caso de que tengamos un autonumérico en
la tabla no sería posible volver a insertar el
registro exactamente igual a como era ante-
riormente.
en la cláusula WHERE con lo que
no se detectan conflictos de con-
currencia por modificación.
Por último, el conflicto de concu-
rrencia que se produce al eliminar un
registro que ha sido eliminado, gene-
ralmente puede tratarse sencillamen-
te ignorando el conflicto y eliminan-
do definitivamente el registro del
DataSet.
Como hemos visto, existen varias
alternativas para detectar y tratar los
conflictos de concurrencia. Veamos
ahora qué nos ofrece ADO.NET en
este sentido.
En ADO.NET tenemos una serie
de clases, los DataAdapters, que son
los encargados de revertir las modi-
ficaciones realizadas en un DataSet
sobre la base de datos mediante su
método Update. Los DataAdapters tie-
nen tres propiedades: DeleteCommand,
UpdateCommand e InsertCommand que
son los comandos de actualización.
Estos comandos son parametrizados,
de manera que sirvan para todas las filas
de un DataTable. Cuando invocamos al
método Update de un DataAdapter, éste
recorre todas las filas del DataTable, y
si la fila es una fila eliminada, ejecuta
ración del DataAdapter
• Usar un CommandBuilder
• Configurarlo manualmente
escribiendo nosotros mismos el
código
Para usar el asistente, sólo tene-
mos que arrastrar un DataAdapter
de la ficha datos del cuadro de
herramientas a nuestro formulario
o componente y seguir sus instruc-
ciones. En el paso “Generar las ins-
trucciones SQL” tenemos un botón
“Opciones avanzadas” que nos pre-
senta el cuadro de diálogo de la
figura 1.
Como vemos, el asistente puede
generar por nosotros los comandos de
actualización INSERT, UPDATE y
DELETE. Si elegimos “Usar concu-
rrencia optimista”, el asistente inclui-
rá en la cláusula WHERE de las ins-
trucciones UPDATE y DELETE el
valor original de todos los campos del
registro. Mientras que si no activamos
esa casilla de verificación, la cláusula
WHERE sólo incluirá la clave prima-
ria. Si elegimos “Actualizar el con-
junto de datos” el asistente añade una
instrucción SELECT a los comandos
de actualización para refrescar el regis-
do concurrencia optimista y sin actualizar el con-
junto de datos.
La alternativa de configurar manualmente el
DataAdapter no es muy recomendable, ya que
requiere escribir bastante código y la funcionalidad
obtenida es exactamente igual a la conseguida usan-
do el asistente. Además es posible que cometamos
algún error al escribir el código, mientras que el
asistente no los comete.
Como vemos, el DataAdapter sólo nos deja la posi-
bilidad de incluir en la cláusula WHERE de las ins-
trucciones UPDATE y DELETE o bien la clave pri-
maria, o bien todos los campos. No tenemos las otras
alternativas que se mencionan en este artículo. Además
en la cláusula SET de la instrucción UPDATE, sólo
podemos incluir todos los campos, no tenemos la
opción de incluir sólo los modificados.
Por otra parte, ADO.NET sólo da soporte para
la detección del conflicto de concurrencia, no hay
nada que nos ayude a gestionarlo, por lo que ten-
dremos que escribir nosotros mismos el código
necesario.
El código de ejemplo del fuente 1 muestra como
gestionar conflictos de concurrencia, refrescando
el registro si ha sido modificado y eliminándolo si
ha sido eliminado.
Como vemos, gestionar los conflictos de concu-
rrencia no es trivial y repetir el mismo código una y
otra vez para cada caso es muy laborioso y pesado.
Una buena alternativa a los DataAdapters que vie-
• DeleteCriteria: Determina los campos a incluir
en la cláusula WHERE de la instrucción DELE-
TE. Puede tomar los siguientes valores:
• All: Se incluirán los valores originales de
todos los campos.
• Key: Se incluirá sólo la clave primaria.
• TimeStamp: Se incluirá la clave primaria más
el valor original del campo TimeStamp si es
que existe.
UPDATE Empleados
SET DNI=@DNI, Nombre=@Nombre, Apellidos=@Apellidos
WHERE IdEmpleado=@Original_IdEmpleado
SqlDataAdapter Adapter = new SqlDataAdapter(“SELECT * FROM Empleados”, Connection);
SqlCommandBuilder CommandBuilder = new SqlCommandBuilder(Adapter);
Adapter.UpdateCommand = CommandBuilder.GetUpdateCommand();
Adapter.InsertCommand = CommandBuilder.GetInsertCommand();
Adapter.DeleteCommand = CommandBuilder.GetDeleteCommand();
public void Guardar(DataTable Empleados)
{
// creamos un adapter para realizar la actualización
SqlDataAdapter Adapter = new SqlDataAdapter(“SELECT * FROM Empleados”, this.cn);
// usamos un command builder para configurar los comandos de actualización
SqlCommandBuilder CommandBuilder = new SqlCommandBuilder(Adapter);
Adapter.UpdateCommand = CommandBuilder.GetUpdateCommand();
Adapter.InsertCommand = CommandBuilder.GetInsertCommand();
Adapter.DeleteCommand = CommandBuilder.GetDeleteCommand();
// este comando nos sirve para refrescar un registro
SqlCommand Resync = new SqlCommand(“SELECT * From Empleados WHERE IdEmpleado=@IdEmpleado”, this.cn);
Resync.Parameters.Add(“@IdEmpleado”, SqlDbType.Int);
try
throw ex;
}
}
else
{
// la causa del conflicto es que ha sido modificado
// Si el conflicto ha sido al eliminar el registro
// Fill ya lo habrá “recuperado” y refrescado.
// Aparecerá el registro con el error
// Si el conflicto ha sido al modificar el registro
// Fill lo habrá “refrescado”. Y aparecerá el registro
// con el error
// sólo hay que volver a lanzar la excepción
throw ex;
}
}
}
Fuente 1. Ejemplo de gestión de conflictos de concurrencia
dotNetManía
<<
25
dnm.ado.net
<<