Índice Temático
Básico » Intermedio » Avanzado
Básico » Intermedio » Avanzado
Básico » Intermedio » Avanzado
ASP Vs. ASP.Net
ASP
Microsoft Active Server Pages (ASP), es un entorno de scripts del
lado del servidor (server-side scripting) que puede usarse para
crear y correr dinámicamente aplicaciones interactivas de Servidor
Web (interactive Web server applications).
Con ASP es posible combinar páginas HTML, comandos de
script y componentes COm para crear páginas web interactivas
(interactive Web pages) o poderosas aplicaciones basadas en Web
(Web-based applications), las cuales son fáciles de desarrollar y
modificar.
ASP.net
ASP.net es un atecnología para crear aplicaciones web dinámicas
(dynamic Web applications), forma parte del marco o estructura
conceptual .net (.net Framework), es posible desarrollar cualquier
aplicación ASP.NET en cualquier lenguaje compatible .net, incluyendo
Visual Basic .net, C# y JScript .net.
Las páginas ASP.net (Web Forms) son compiladas, proporcionando un
mejor desempeño que los lenguajes de scripting. Las Web Forms
permiten construir poderosas páginas web basadas en formas, cuando
se contruyen estas páginas puede ser posible utilizar controles
ASP.net server para crean elementos comunes de interface de usuario
y programas para tareas comunes. Estos controles permiten contruir
rápidamente un Web Form fuera de reutilizar built-on o componentes
personalizados, simplificando el código de una página.
ASP.net provee un modelo de programación e infraestructura para
hacer rapidamente una aplicación escalable, segura y estable más
facilmente que las tecnologías web anteriores.
Internet Information Server
Microsoft introdujo su Servidor de Web Internet Information
Server 1.0 (IIS) con Windows NT 3.51, donde agrego otra
interface llamada Internet Server Application Programming
Interface (ISAPI) para permitir el uso de archivos
ejecutables escritos en lenguajes de compilación como C y C++ para
operar más eficientemente y proveer un amplio acceso al Servidor Web
a diferencia de otras tecnologías dependientes. Los desarrolladores
pueden producir aplicaciones que se conectan al IIS a través de
ISAPI, un ejemplo de aplicación ISAPI es el ASP.
Parsing
Analizar sintácticamente una estructura que constituye una
sentencia a: analizar, descomponer, separar, estudiar en partes,
clasificar, etc.
Esto es posible si el mensaje entrante tiene una estructura
identificable que pueda ser analizada y convertida a un protocolo de
mensaje parecido.
Analyze syntactically by assigning a constituent structure to (a
sentence) hypernym) analyze, analyse, break down, dissect, take
apart (classification) grammar
Ex: This is only possible if the incoming message has an
identifiable structure that can be parsed and converted to resemble
a protocol message.
¿Cómo se conectan las ASP's con
el IIS?
La manera en que se conectan las ASP's con el IIS, consiste
puramente de una simple DLL llamada asp.dll la cual se
encuentra instalada por default en su directorio correspondiente
(..\system32\inetsrv ), esta DLL es la responsable de
tomar un ASP y parsear el contenido de cualquier script del lado
del servidor, este script se combina con el boilerplate
text y HTML en la página ASP. Cuanto la página está completa se
envía al Servidor Web (IIS) el cual a su vez la envía al cliente que
la solicito originalmente.
IIS no es instalado por default cuando se instala el Servidor
Windows 2000, para que un Servidor sea un Servidor Web, lo único que
se necesita es instalar el administrador IIS.
Cuando se instala el IIS el Web Site por Default es creado en el
directorio C:\inetpub\wwwroot a menos que se cambie
este path durante el proceso de instalación. Este Default
Web Site se establece como una aplicación virtual. IIS
utiliza aplicaciones virtuales para separar conjuntos de páginas de
instancias de componentes para prevenir una falla al dar de baja el
Servidor Web.
Una vez instalado el IIS, si se da el siguiente url en el
browser:
http://nombre_servidor
La respuesta será que se ejecutará el IIS y cargará la página por
default almacenada en \wwwroot , normalmente esta página
se llama "default.html ", pero puede ser cualquiera que
se elija.
Cualquier página que tenga una extensión .asp son
enviadas a la asp.dll para su procesamiento, las que no
estén mapeadas simplemente se cargan desde disco y enviadas
directamente al cliente.
El IIS es más que un simple Servidor Web que provee el servicio
WWW sobre HTTP, también provee los servicios:
- FTP (Protocolo de Transferencia de Archivos - File Transfer
Protocol)
- SMTP (Protocolo de Correo Simple - Simple Mail Transfer
Protocol)
- RADIUS (Servidor que permite la autentificación remota de
usuarios, además de un host de características
build-in para administración de seguridad, etc.)
- WWW (World Wide Web)
Siendo el más importante el WWW, para configurar el IIS
seleccione:
- Español : Inicio » Programas » Herramientas Administrativas »
Administración de Servicios de Internet
- Inglés: Start » Programs » Administrative Tools » Internet
Services Manager
Para configurar un servicio seleccione: Internet Information
Services » Nombre_Servidor » Servicios, el servicio a configurar y
clic al botón derecho del mouse para que muestre el menú popup donde
podrá seleccionarse "propiedades" y de esta manera configurar lo
necesario.
Procesamiento de un archivo
ASP
- Decidir si existe algún código ASP server-side que
necesite ser ejecutado, si no lo hay simplemente se informa al IIS
para que permita enviar la página al cliente, es decir el archivo
puede tener extensión
.asp y contener o no código del
lado del servidor sin sacrificar con esto el desempeño del
entorno.
- Cuando ASP recibe una página del IIS que contiene código del
lado del servidor lo parsea línea por línea, cualquier cosa que no
sea código del lado del servidor o que no requiere la intervención
de ASP se envía de regreso al IIS y este la anvía al cliente. Cada
sección del script es pasada al apropiado scripting
engine (VBScript o JScript), los resultados de los
scripting engine son insertados en los puntos apropiados
dentro de la página y enviada al IIS.
En versiones previas del IIS todas las páginas con extensión
.asp eran parseadas línea por línea tanto las que
contenian código del lado del cliente como las que no lo contenian
y no permitian ser enviadas directamente del disco al cliente.
Para hacer la operación más eficiente, ASP también mantiene en
cache (almacenamiento) el código que los scrinpting
engine crean, listo para ser usado cuando la página es
invocada de nuevo.
Server Side Scripting - Scripts del
lado del servidor
Existen distintas maneras de indicar a ASP que un Script
debe procesarse en el servidor:
- Dentro de la etiqueta HTML
<script></script> asignar el valor
server en su propiedad especial runat
con lo cual se indica al filtro ASP que todo el bloque de
Script se procese en el servidor. <script language="VBScript" runat="server">
server-side script code interpreted and executed by ASP
</script>
- Escribir el código entre los delimitadores
<%
y %> al ser VBScript el
lenguaje de Script por defecto de ASP no es
necesario indicar que tipo de lenguaje se utilizará, salvo que se
quiera utilizar otro. <% server-side script code interpreted and executed by ASP %>
- Para indicar un lenguaje diferente a VBScript
utilizando los símbolos <% y %> asigne como valor el nombre
del lenguaje a utilizar en la propiedad
language :
<%@ language="JScript" server-side script code interpreted and executed by ASP %>
La recomendación a seguir es utilizar los delimitadores
<% y %> porque otorgan mayor
flexibilidad.
Una característica de ASP es que su código no es
mostrado al cliente, si el cliente inspecciona el código de la
página ASP en su navegador únicamente vera código HTML,
es decir, lo que genero el servidor y envio al cliente ya que el
código ASP se interpreto en el servidor y lo regreso
como código HTML.
Incluir Archivos de
Script
Es posible incluir archivos externos que contienen script
code , lo que permite escribir funciones genericas que estarán
disponibles para otra páginas.
Para incluir un archivo externo se utiliza la propiedad
src del elemento HTML script en el cual se
especifica la ubicación relativa, física o virtual y el nombre del
archivo:
<script runat="server"
src="ubicación/nombreArchivo.ext"></script>
El archivo externo debe contener únicamente script
code válido y no puede contener contenido ordinario como
texto o HTML
Definir el lenguaje de
Script
ASP viene con dos scripting engines , los cuales son
instalados por default y son VBScript y JScript.
Es necesario indicar a ASP que scripting engine
utilizar, comunmente se define contextualmente a través de la
propiedad language y asignandole el nombre del
scripting engine , todo esto debe ser especificado como
primer línea del archivo y puede ocurrir sólo una vez.
<%@ language="ScriptingEngineName" %>
Default Scripting
Engine
Si se omite la declaración del lenguaje a utilizar, ASP utiliza
el Scripting Engine por default, el cual es VBScript cuando
se instala el IIS, pero es posible cambiar este valor para el sitio
web completo o para aplicaciones virtuales individuales dentro del
sitio web.
Para ello consulte: Application Configuration/Default ASP
language
Ya que todo el código ASP es ejecutado en el servidor, no debe
existir preocupación alguna por la compatibilidad con navegadores.
Puerto 80
El puerto por default para el acceso WWW es el puerto
80 , al utilizar este puerto se indica que los usuarios
no tienen que especificar el número de puerto en su petición. Es
posible cambiar el número de puerto
También es posible establecer que se utilice HTTP
Keep-Alives, que provee un mejor desempeño para los navegadores
que lo soportan.
Seleccione: Default Web Site Properties » Documents
Default Document
Es posible especificar cuales son las páginas por default que son
desplegadas al usuario cuando este accede al directorio
¿Qué es un Directorio
Virtual?
Sirven para ocultar información como la estructura de directorios
del servidor, por ejemplo un usuario puede ver el código fuente de
cualquier página web, pero si incluye rutas códificadas en su página
web estará manteniendo a salvo la estructura de directorios del
servidor. Sirven para mover páginas web de una máquina a otra sin
necesidad de alterar el código, para ello solo bastará incluir los
mismos directorios virtuales y cada una podrá contar con diferentes
rutas codificadas.
Modelo de Objetos ASP
ASP trabaja en base a un Modelo de Objetos mediante el cual ASP
expone las páginas para ser ejecutadas individualmente por el Object
Context (Contexto de Objetos).
Contexto de Objetos : Object
Model
El contexto de objetos incluye todos los objetos intrínsecos de
ASP a través de los cuales es posible obtener información acerca de
la petición del usuario y crear la respuesta adecuada.
Ya que este contexto engloba por completo el modelo de objetos
ASP, permite que los programadores apliquen mucho más controles
sobre el proceso complejo que ASP y los componentes utilizan para
llevarlo a cabo. Este modelo comienza con Request ,
Response (los cuales acceden y administran el
intercambio que tiene lugar entre el navegador y el Servidor Web, su
utilización puede afectar la eficiencia y robustez de las páginas) y
otros objetos intrínsecos, pero la realidad es que el
root es actualmente un objeto conocido como el objeto
ObjectContext .
La única forma de instanciar el contexto es a través del evento
OnStartPage que ASP invoca cada vez que comienza a
ejecutarse una página ASP. Este evento recibe como argumento el
objeto ObjectContext para la página ASP. En un
componente es posible capturar una referencia a este objeto en una
variable global y utilizarla en el código. El tipo de objeto
ObjectContext esta definido en asp.dll .
Dim oContexto
Public Sub OnStartPage(context as scriptingContext)
Set oContext = context
End Sub
oContexto.response.write "contexto de objetos"
Para obtener la referencia del contexto actual de la página se
utiliza el método getObjectContext() : Set oContextoLocal = GetObjectcontext
oContextoLocal.response.write "Contexto Local"
Objetos Intrínsecos ASP
Los dos principales objetos intrísicos Request y
Response de ASP se mapean (relacionan) directamente a
sus acciones correspondientes que los clientes realizan cuando
acceden a un Servidor Web, los cuatro objetos restantes son
utilizados para proveer funcionalidad adicional, cada uno provee una
variedad de colecciones, propiedades y métodos. El evento
OnStartPage es obsoleto en la IIS 3.0
Interacción entre el
Cliente y el Servidor
Cuando un usuario o agente (user agent) acceden al
Sitio Web para solicitar una página, una conversación toma lugar
entre la Aplicación Cliente y el Servidor Web.
No solamente un usuario común puede acceder al Web site existen
programas denominados agentes (user agent), un ejemplo
son los robots utilizados por los motores de búsqueda
(search engines) que acceden a los sitios web y obviamente
también están las aplicaciones dañinas.
La Página Solicita
Conversarción
Cuando un navegador hace una petición o solicita una página al
Web Site, lo hace utilizando el nombre de dominio del servidor para
hacer una conexión y proporcionando la ruta completa de la página
que solicita, es necesario que proporcione una ruta completa ya que
la Web es un ambiente stateless (cada pedido de una
página nueva del Web se procesa sin ningún conocimiento de las
páginas anteriores solicitadas) a menos que se tome una acción para
crear una sesión que identifique cada cliente.
Lo anterior significa que cada vez que el Servidor termina de
enviar una página al Cliente, el Servidor se olvida inmediatamente
del Cliente, de esta manera cuando se solicita la siguiente página
se considera como si un nuevo Cliente hubiera accedido, el Servidor
no tiene idea de quien es el Cliente, entonces no puede hacer
juicios razonables respecto a que página descargo el Cliente la
última vez y entonces no puede proporcionar una página utilizando
una ruta relativa.
En algunos casos el Servidor podría enviar una
página-no-disponible al Cliente como respuesta a la solicitud, esto
puede deberse a que la página solicitada no exista en el servidor o
el cliente no tiene los permisos suficientes para acceder a ella.
Collections
Las colecciones son estructuras de datos similares a los arreglos
que pueden almacenar strings, numeros, objetos y otros valores, a
diferencia de los arreglos las colecciones expanden y contraen
automaticamente los objetos (item) que pueden ser obtenidos o
almacenados. Most of the ASP built-in objects provide collections.
La posición de un objeto (item) podría cambiar al
modificarse la colección. Es posible acceder a un objeto
(item) de la colección por su llave única que puede
ser un string o un índice en la colección, también es
posible iterar a través de todos los objetos (items) de la
coleccción.
Acceder a Colecciones
Para acceder a un objeto especifico en una colección se puede
hacer referenciando a su llave única o nombre, por ejemplo:
Objeto.Coleccion("llaveUnica")
También es posible acceder por el índice que ocupa un objeto o
item en la colección:
Objeto.Coleccion(indice)
Donde índice es de tipo numérico. Las colecciones comienzan con
el índice número 1 .
Otra forma de acceder de manera más automatizada a una colección
iterando a través de la misma. Es posible iterar a través de todos
los objetos en una colección para obtener o modificar los valores
que almacenan, por ejemplo:
For Each object In ObjectName.CollectionName
Response.Write ObjectName.CollectionName(object) & "<BR>"
Next
Donde object es una variable que toma el lugar de la llave
única (key).
Para más información respecto a Collections y otras formas de
acceder a una colección Pulse aquí.
Objeto Request
Los detalles de la solicitud de un cliente y la respuesta del
servidor están disponibles en ASP a través del los objetos
Request y Response.
El objeto Request , hace disponible al script
toda la información que el usuario proporciona cuando hace una
petición de una página o cuando envía un formulario. Este objeto
incluye variables HTTP que identifican al navegador y al usuario.
También es posible acceder a las cookies y certificados
cuando se utiliza Secure Sockets Layer (SSL).
Colecciones Request
El objeto Request proporciona 5 colecciones que
pueden ser utilizadas para acceder a todo tipo de información
respeto a la solicitud que el cliente realiza a un servidor web.
ClientCertificate , una colección de los valores
de todos los campos o entradas en el certificado-cliente que el
usuario presenta al servidor cuando accede a los recursos o a una
página. Los valores son de sólo lectura.
Cookies , una colección de los valores de todas
las cookies enviadas desde el sistema usuario junto con su
solicitud. Únicamente las cookies válidas para el dominio
contienen los recursos que son enviados al servidor. Los valores
son de sólo lectura.
Form , una colección de los valores de todos los
elementos de control HTML de la sección <form>
que fué enviada con la solicitud donde el valor de la propiedad
method es post . Los valores son de sólo
lectura.
Request.Form("nombreInput")
QueryString , una colección de todos los pares de
nombre/valor agregados al URL en la solicitud del usuario o los
valores de todos los elementos de control HTML en la sección
<form> que fué enviada como la solicitud donde
el valor de la propiedad method es get o
el valor de la propiedad es omitido. Los valores son de sólo
lectura.
Request.QueryString("nombreVariable")
ServerVariables , una colección de todos los
valores en los encabezados HTTP enviados desde el cliente con su
solicitud, además de varios valores del entorno que sirven de
variables para el servidor web. Los valores son de sólo lectura.
Propiedades Request
La única propiedad del objeto Request proporciona
información respecto al número de bytes en la solicitud del
usuario.
TotalBytes , propiedad de sólo lectura y regresa
el número total de bytes en el cuerpo de la solicitud
enviada por el cliente.
Métodos Request
El único método del objeto Request permite acceder
al contenido completo de la parte de la solicitud del usuario que
envia en un formulario utilizando el método post .
BinaryRead(count) , obtiene el contador de
bytes de datos de la solicitud del cliente cuando el dato
es enviado al servidor como parte de una solicitud
post . Regresa un arreglo de tipo Variant. Este método
no puede ser utilizado si el código ASP tiene una referencia a la
colección Request.Form y está colección no puede ser
accedida si utiliza el método BinaryRead .
Objeto Response
El objeto Response , es utilizado para acceder a las
peticiones que son creadas y enviadas de regreso al cliente.
Proporciona al script las variables HTTP que identifican al
servidor así como las capacidades de este, de la información
respecto al contenido que se envía al navegador y cualquier nueva
cookie que podría almacenarse. También provee una serie de
métodos que pueden utilizarse para crear salidas tales como las del
método Response.Write .
Colecciones Response
El objeto Response proporciona una única colección
que puede ser utilizada para establecer los valores de cualquier
cookie que se de en el sistema cliente. Esta colección es una
directiva equivalente a la colección Request.Cookies .
Cookies , una colección que contiene los valores
de todas las cookies que podrían ser enviadas de regreso al
cliente en la respuesta actual. Esta colección es de escritura
solamente.
Propiedades Response
Las propiedades del objeto Response son establecidas
por el servidor:
CacheControl "setting" , propiedad de
lectura/escritura, el valor que contiene es un string. Si
se establece la propiedad con el valor "Public "
permite a los servidores proxy para almacenar en cache la
página o con el valor "Private " para prevenir que los
servidores proxy almacenen la página en cache.
Charset = "value" , propiedad de
lectura/escritura, el valor que contiene es un string. Si
se establece la propiedad con el valor "ISO-LATIN-7" agrega el
nombre del conjunto de caracteres al encabezado HTTP
Content-Type creado por el servidor para cada respuesta.
ContentType = ""MIME-type , propiedad de
lectura/escritura el valor que contiene es un string. Si se
establece el HTTP content type para la respuesta como un estándar
MIME-type como "text/xml" o "image/gif". Si se omite el MIME-type
"text/html" es utilizado. El content type indica al navegador que
tipo de contenido espera.
Expires minutes , propiedad de
lectura/escritura, especifica la cantidad de tiempo en minutos que
una página es válida. Si el usuario regresa la misma página antes
de que expire la versión del contenida en cache es presentada.
Después que el período expira no puede ser contenida en cache
privado (usuario) o público (proxy).
ExpiresAbsolute #date[time]# , propiedad de
lectura/escritura, especifica la fecha y tiempo absoluto, cuando
una página expira. Si el usuario regresa la misma página antes de
que expire, la versión del cache es presentada, después del tiempo
expirado no deberia ser contenida en cache privado (usuario) o
publico (proxy).
IsClientConnected , propiedad de sólo lectura,
regresa una indicación de cuando el cliente está todavía conectado
y descargando la página del servidor. Puede ser utilizado para
terminar el procesamiento (con el método
Response.End ) si un cliente se cambia a otra página
antes que la actual termine su ejecución.
PICS("PICS-label-string") , propiedad de
sólo escritura, crea un encabezado PICS y lo agrega a los
encabezados HTTP en la respuesta. Los encabezados PICS definen el
contenido de la página en terminos de violencia, sexo, lenguaje
obseno, etc.
Status = "code message" , propiedad de
lectura/escritura, especifica los valores de estado y mensaje que
podrían ser enviados al cliente en los encabezados HTTP de la
respuesta para indicar un error o procesamiento exitoso de la
página. Por ejemplo "200 OK" y "404 Not Found"
Métodos Response
El objeto Response proporciona un conjunto de
métodos que permiten manipular directamente el contenido de la
página que son creados en el servidor para regresarse al cliente.
AddHeader("name","content") , crea
un encabezado HTTP personalizado utilizando los valores de los
argumentos name y content agregandose a la
respuesta. Una vez que el encabezado es agregado no puede ser
eliminado y deber utilizarse entes del contenido de cualquier
página.
AppendToLog("string") , agrega un
string al final de las entradas del historial del servidor
para las solicitudes cuando se utiliza W3C Extended Log File
Format.
BinaryWrite(SafeArray) , escribe el
contenido del SafeArray de tipo Variant al flujo de salida actual
HTTP sin ninguna conversión de caracter.
Clear() , elimina cualquier buffer
existente contenido en la página de la respuesta IIS cuando
Response.Buffer es True .
End() , termina el procesamiento ASP y regresa el
contenido creado actualmente, entonces aborta cualquier
procesamiento de esta página.
Flush() , envía todo el contenido actual de la
página contenido en buffer del IIS al cliente cuando el
Response.Buffer es True . Puede ser
utilizado para enviar partes de una página extensa al cliente
individualmente.
Redirect("url") , indica al navegador
cargar la página especificada en el argumento url
enviando un "302 object Moved" en el encabezado HTTP de la
respuesta.
Write("string") , escribe el contenido
especificado en el argumento string al flujo de
respuesta actual HTTP.
Objeto Application
El objeto Application es creado cuando se carga la
asp.dll en respuesta de la primer petición para una
página ASP, provee un repositorio para almacenar variables y
referencias de objetos que están disponibles en todas las páginas
que un usuario puede abrir, así como información común a los
usuarios de un entorno ASP . Este objeto proporciona
eventos mediante los cuales es posible notificar cuando empieza
(OnStart ) y cuando termina (OnEnd ) la
aplicación. Los manejadores para estos eventos se escriben en el
archivo global.asa .
La sintaxis para almacenar información en este objeto es:
Application("numeroUsuariosEnLinea") = valor
Ejemplo: Sub Application_OnStart
Application("numeroUsuariosEnLinea") = 0
End Sub
Es posible bloquear las variables de la aplicación a través del
método lock con lo cual se impide que otros usuarios
que accedan a la aplicación cambien el valor de la misma, por
ejemplo si queremos saber cuantos usuarios están utilizando la
aplicación escribiriamos: Sub Session_OnStart
Application.Lock
Application("numeroUsuariosEnLinea") = Application("numeroUsuariosEnLinea") + 1
Application.UnLock
End Sub
De esta manera cada que acceda un usuario a la aplicación se
bloquea la variable numeroUsuariosEnLinea el tiempo
suficiente para incrementar su valor y al termino de esta
inmediatamente se recurre al método UnLock para
permitir que otro usuario pueda hacer lo mismo.
El objeto Application no tiene propiedades
Colecciones del Objeto
Application
Contents , colección de todas las variables (y
sus valores) que son almacenadas en el objeto
Application , pueden ser Variant arrays e instancias
de objetos tipo Variant.
StaticObjects , colección de todas las variables
que son almacenadas en el objeto Application contiene
solamente aquellas contenidas en un elemento
<object> .
Métodos del Objeto
Application
Contents.Remove("nombreVariable") , elimina
la variable que recibe como argumento de la colección
Application.Contents .
Contents.RemoveAll() , elimina todas las variables
de la colección Application.Contents .
Lock() , bloquea el objeto
Application de tal manera que sólo la página actual
puede acceder al contenido. Se utiliza para asegurar que los
asuntos acordados no corrompan el contenido permitiendo a dos
usuarios leer y actualizar simultaneamente valores.
UnLock() , libera la páginas ASP que bloqueo el
objeto Application .
Eventos del Objeto
Application
onStart , ocurre cuando la aplicación ASP
comienza, antes que la página que el usuario solicito se ejecute y
después de cualquier objeto Session creado. Este
evento se utiliza para inicializar variables, crear objetos o
ejecutar otro código.
onEnd , ocurre cuando la aplicación ASP termina,
esto es después de que la última sesión de usuario termine y
después de cualquier código contenido en el evento
onEnd . Todas las variables existentes en la
aplicación son destruidas cuando termina la aplicación.
Objeto Session
El objeto Session , es creado por cada usuario cuando
hace una primer petición de un página ASP del Sitio Web o de la
Aplicación Web, permaneciendo disponible hasta que el lapso por
default del timeout expire.
Provee un respositorio para almacenar variables y referencias de
objetos que están disponibles sólo a las páginas que el usuario abre
durante el tiempo de vida de una sesión. Este objeto se destruye
cuando el usuario abandona la sesión.
A través de la propiedades SessionID es posible
identificar de manera única a cada usuario de la aplicación, la
propiedad TimeOut establece en minutos el tiempo que
puede durar una sesión, una vez que transcurre este tiempo la sesión
se termina y el usuario tendrá que acceder de nuevo a la aplicación
generando un nuevo valor para la propiedad SessionID .
El valor por default son 20 minutos, si requiere cambiar el valor
escriba:
Session.Timeout = 10
Si requiere que termine la sesión antes del tiempo establecido,
escriba:
Session.Abandon
Colecciones del Objeto
Session
Contents , colección de todas las variables (y
sus valores) que son almacenadas en el objeto
Session , pueden ser Variant arrays e instancias de
objetos tipo Variant.
StaticObjects , colección de todas las variables
que son almacenadas en el objeto Session contiene
solamente aquellas contenidas en un elemento
<object> .
Propiedades del Objeto
Session
CodePage , propiedad de lectura/escritura. Define
el código de página que podrá ser utilizado para desplegar el
contenido de la página en el navegador. El código de página es un
valor numérico del conjunto de caracteres y lenguajes diferentes
LCID , propiedad de lectura/escritura. Define el
identificador local (LCID) de la página que es enviada al
navegador.
SessionID , propiedad de sólo lectura. Regresa el
identificador de sesión, el cual es generado por el servidor
cuando la sesión es creada y vigente mientras exista el objeto
Application padre.
Timeout , propiedad de lectura/escritura. Define
el tiempo en minutos que durará el objeto Session ,
por default el tiempo es de 10 minutos.
Métodos del Objeto
Session
Contents.Remove("nombreVariable") , elimina
la variable que recibe como argumento de la colección
Session.Contents .
Contents.RemoveAll() , elimina todas las variables
de la colección Session.Contents .
Abandon() , termina con la sesión actual del
usuario y destruye el objeto Session actual una vez
que la ejecución de la página se completa. Es posible acceder a
las variables de sesión actuales de la página después de invocar
al método Abandon() . La próxima página ASP que sea
solicitada por el usuario podría comenzar una nueva sesión y crear
un nuevo objeto Session .
Ejemplo If(condición) Then
Response.Clear
Session.Abandon
Response.End
End If
Eventos del Objeto
Session
onStart , ocurre cuando un usuario ASP comienza la
sesión, antes de que la página que el usuario solicita sea
ejecutada. Utilice este evento para inicializar variables, crear
objetos y ejecutar otro código.
onEnd , ocurre cuando un usuario ASP termina la
sesión, esto sucede cuando expira el tiempo de
Timeout de la sesión. Todas las variables existentes
en la sesión son destruidas cuando termina, es posible terminar la
sesión explicitamente a través de código utilizando el método
Abandon .
Objeto Server
El objeto Server , provee una serie de métodos y
propiedades que son utilizadas en un script con ASP. El más
común de los métodos es Server.CreateObject , el cual
permite instanciar otros objetos COM en el servidor con el contexto
de la página o sesión actual.
Propiedades del Objeto
Server
ScriptTimeout , esta propiedad establece el número
de segundos (por default tiene 90 ) que un
script en la página puede ser ejecutado antes de que el
servidor aborte la ejecución de la página y reporta un error.
Métodos del Objeto
Server
Redirect Vs. Execute y
Transfer
Los métodos Execute y Transfer son más
recientes que Redirect , por lo cual se recomienda el
uso de Execute cuyo proposito es más parecido a una
función o el uso de Transfer que a diferencia de
Execute no regresa el control a la página original y la
ejecución se detiene al finalizar la página.
Objeto ASPError
El objeto ASPError es un objeto nuevo en ASP 3.0 y
está disponible a través del método GetLastError del
objeto Server . Provee un conjunto de información
detallada acerca del último error ocurrido en ASP.
En VBScript existe la sentencia:
On Error Resume Next
Esta sentencia causa que el interprete ignore los errores en
tiempo de ejecución (run-time errors) y continue la ejecución del
código.
A partir de la versión ASP 3.0 es posible utilizar la sentencia:
On Error Goto 0
Esta sentencia causa que se regrese (turn back on) el control de
manejo de errores al manejador de errores por default
(ASPError ). Por ejemplo si utilizamos una sentencia
On Error Resume Next e invocamos al método
GetLastError no será posible acceder a los detalles de
error ya que este método es del objeto ASPError quien
maneja los errores por default pero al emplear la sentencia On
Error Resume Next se desactiva y por ello que el método
GetLastError no este disponible hasta que se regrese el
control de errores al objeto ASPError a través de la
sentencia On Error Goto 0 .
Ejemplo
ASPError
Propiedades del Objeto
ASPError
ASPCode , entero que representa el número de error
generado por ASP/IIS.
ASPDescription , string que proporciona una
descripción detallada del error.
Category , string que representa la fuente del
error.
Column , entero que representa la posición del
caracter que genero el error dentro del archivo.
Description , string que proporciona una breve
descripción del error.
File , string, que representa el nombre del
archivo que fué procesado cuando ocurrio el error.
Line , entero que representa el número de línea
que genero el error dentro del archivo .
Number , entero que representa el código de error
COM estándar.
Source , string que representa el código actual
cuando dispone de la línea que causo el error.
Envio de Formularios y
Obtención de Datos
Todos los valores que el usuario proporciona cuando llena un
formulario en una página o cuando se envian variables y los valores
que son agregados al final del URL contenido en el campo dirección
(address bar) del navegador, están disponibles a través de las 2
colecciones las cuales proveen una forma fácil de acceder a
cualquier valor desde el código ASP:
Form , si se establece el método de envío como
POST es posible obtener los valores de un formulario
de dos formas:
Es posible acceder a Request.Form() de manera
automatizada empleando una sentencia de control For
Each
La recomendación a seguir es emplear
Request.Form("nombreInput") , porque al insertar o
eliminar elementos input cambiaria su orden y si
utiliza índices fijos tendría que estarlos actualizando.
También el orden de los elementos no es el mismo en todos los
navegadores.
Esta forma de envío de datos es segura porque viajan en un
encabezado distinto y no son visibles para el navegador.
Ejemplo
Request.Form
¿Cómo accederia al valor de varios elementos input
con el mismo nombre?
Respuesta
¿Cómo accederia al valor de elementos radio ?
Ejemplo
Radio
¿Cómo accederia al valor de elementos checkBox ?
Ejemplo
CheckBox
¿Cómo accederia al valor de elementos
select/option ?
Ejemplo
Select/Option
¿Cómo accederia al valor de elementos select/option -
multiple ?
Ejemplo
Select/Option - Multiple
QueryString , cuando requerimos enviar datos pero
no a través de un formulario, lo podemos hacer de la siguiente
manera:
- Escribir el URL completo
- Seguido del URL escribir el signo
? , que sirve
como separador para identificar el inicio del envio de datos
- Los datos que se envian en forma de pares
nombre=valor
- Después de cada par nombre=valor si se requiere
enviar más variables se utiliza el signo de concatenación
&
Ejemplo:
<a
href="http://www.informatique.com.mx/asp/qs.asp?nombre=Gerardo
Angeles Nava&edad=33&web
Site=informatique.com.mx">Enviar Datos</a>
Para acceder a los datos enviados se utiliza:
Request.QueryString("nombreVariable")
Enviar
Datos
Nota, el par nombre=valor no puede contener
espacios o caracteres ilegales (/ , : ,
? , & ) a menos que utilice el código
correspondiente
Cuidado esta forma de envío visualiza en el navegador el
URL completo junto con los nombres de las variables y sus valores
correspondientes.
Form Vs. QueryString
Existen dos métodos para enviar datos:
GET (default)
POST
El método GET que es el método utilizado por default
es utilizado cuando se da clic a un hyperlink , al
escribir un URL en el address bar de un navegador, etc.
Al emplear el método GET la manera de recuperar los
datos que se envían en un URL es utilizando la colección
Request.QueryString
Cuando se utiliza el método POST el navegador
envuelve los valores dentro de los encabezados HTTP para enviarlos
al Servidor y la manera de recuperar los datos cuando estos se
envían en un formulario es utilizando la colección
Request.Form .
En general la recomendación es utilizar el método
POST en todos los formularios.
Existe una limitante en cuando a la longitud del URL al enviar
datos, un URL demasiado largo puede ocasionar un desbordamiento y
algunos datos pueden ser truncados.
Cuando un usuario vuelve a descargar la página y esta contiene un
formulario los valores de los datos están en blanco por lo que se
tendrá que volver a requisitar el formulario.
Cookies
Es posible crear Cookies y asignarles valores
utilizando la forma:
Response.Cookies("variable") = "valor"
Así como Cookies que contienen multiples
valores:
Response.Cookies("variable")("subVariable") =
"subValor"
Para acceder al contenido de las Cookies utilice la
forma:
Response.write Request.Cookies("variable")
Ejemplo
Cookies
Colección ServerVariables
El objeto Request tiene la colección
ServerVariables a su vez esta colección contiene una
combinación de valores que representan los encabezados HTTP enviados
desde el sistema cliente al servidor con la página solicitada,
también contiene valores proporcionados por el servidor web cuando
la solicitud es recibida.
Para ver la colección completa y los valores que regresa pulse aquí
Precaución, el primer acceso a un miembro de la colección
ServerVariables provoca que el IIS obtenga la colección
completa de sus miembros, por lo que la recomendación es utilizar la
colección cuando sea necesario.
¿Cómo hacer un
Redireccionamiento?
El redireccionamiento no es más que indicar que se cargue una
página especifica.
- Una forma de redireccionar hacia otra página es indicarlo en
la etiqueta
<META> , donde la propiedad
HTTP-EQUIV indica hacer el redireccionamiento cuando
su valor es REFRESH y la propiedad
CONTENT indica a través de sus valores después de
cuantos segundos debera hacer el redireccionamiento y hacia que
página, ejemplo:
<meta http-equiv="refresh"
content="0;URL=/technet/security/bulletin/MS03-011.mspx">
- Otra forma y la recomendada al utilizar ASP es emplear el
método
Redirect del objeto Response ,
ejemplo:
Response.Redirect "urlDeLaPagina"
Antes de hacer el redireccionamiento es recomendable escribir
Response.Clear para la liberación de recursos y
después de hacer el redireccionamiento escribir
Response.End por seguridad.
Encabezados HTTP
Es posible manipular los encabezados HTTP a través de ASP, la
propiedad CacheControl del objeto Response
por default tiene el valor private , lo cual indica que
no se almacene en cache la página, cuando el valor de la propiedad
es public se permite almacenar en cache la página.
Estos valores actuan sobre servidores proxy por lo que puede
funcionar de manera diferente de un servidor proxy a otro ignorando
y sobre-escribiendo los valores.
Por medio de código ASP establecer los valores de
CacheControl se utiliaria:
Response.CacheControl = "public"
Para controlar cuanto tiempo debe permanecer en cache una página
se tienen dos propiedades del objeto Response :
Expires , define cuanto tiempo (en minutos) la
página podrá permanecer como válida antes que deba ser descartada
del cache, iniciando su tiempo una vez que es creada.
Response.Expires = "minutes"
ExpiresAbsolute , establace la fecha y tiempo
absoluto en el cual la página expira.
Response.ExpiresAbsolute =
"dateTime"
Para crear y agregar encabezados HTTP utilice:
Response.AddHeader "http-equiv", valor
Stateless & State
La www es un sistema stateless, es decir, no se
establece una conexión permanente entre el usuario y la aplicación,
por lo que no es posible identificar a cada usuario cuando envian
instrucciones o realizan peticiones al servidor.
Sin embargo existen formas que permiten identificar a un usuario
(sistema state), por ejemplo a través del uso de
Cookies, pero ¿Qué pasa si el usuario utiliza una máquina
diferente o borra las Cookies o simplemente el navegador no
acepta Cookies?, no será posible identificar al usuario.
ASP en conjunto con IIS proveen el concepto session, a
través del cual es posible interactuar con el objeto
Session .
El objeto session es creado por cada visitante
individualmente cuando este accede por vez primera a una página ASP
del servidor. Un número de identificación es asignado a la sesión y
una cookie que contiene una versión especial encriptada del
identificador de sesión que se envía al cliente. El path de
la cookie probablemente sea el root del sitio web por
default (/ ). Se provee del valor Expires a
la cookie para que expire cuando el navegador se cierre.
Cada vez que el usuario accede a una página ASP, ASP busca la
cookie llamada ASPSESSIONDIxxxxxxxxx , donde cada
x es una carácter alfabético, la cual se encuentra en
los encabezados HTTP HTTP_COOKIE , de manera oculta por
lo que no aparece en las colecciones request.cookies o
response.cookies . El valor de la cookie contiene
identificadores de la sesión para el usuario, por lo tanto una
referencia al apropiado objeto Session puede ser pasado
al script en la página ASP.
Todo lo anterior no es posible o el proceso falla si el navegador
no soporta cookies.
Aplicación Web
Una Aplicación Web es un conjunto de páginas y otros recursos que
son diseñados para realizar algún tipo de tarea y lograr un
resultado.
Aplicación ASP
Una aplicación ASP está asociada con dos principales tópicos:
- Proveer de un ámbito global a través de un área de
almacenamiento variable accesible globalmente.
- Integrar el IIS a través de COM+, el cual permite administrar
mejor los componentes.
Ámbito Global de una
Aplicación Web
ASP provee un objeto Application el cual tiene
similitud con el objeto Session , la diferencia está en
que Application es a nivel aplicación y
Session a nivel usuario, por lo que
Application no es global para un usuario individual,
sino para todos los usuarios de la aplicación.
El objeto Application puede ser utilizado para
almacenar variables e información en un contexto global y estos
valores pueden ser accedidos por un script ASP dentro de la
aplicación, independientemente de que visitante los solicite.
Cuando un usuario solicita una página ASP, IIS crea un
contexto para él, inicializando la asp.dll que
implementa ASP. La página es parseada para
el script del lado del servidor y crea la instancia apropiada
para el scripting engine (VBScript o JScript) que es
instanceada para ejecutar el script.
El evento inicial de instanceamiento de la asp.dll
causa que una aplicación ASP inicie y un objeto
Application es creado, inmediatamente después de que
ocurre esto una sesión de usuario inicia y sus objetos individuales
Session son creados.
El objeto Application permanece en el ámbito
mientras que más sesiones son iniciadas, inmediatamente después que
la última sesión activa termina la aplicación termina y el objeto
Application es destruido.
Global.asa
El archivo global.asa es utilizado para indicar el
comportamiento justo que debe tener la aplicación, ubicado en el
directorio root de la aplicación y aplica a todos los
subdirectorios contenidos en root , de esta manera al
encontrarse en el directorio root del sitio web, define
por completo al sitio como parte de la aplicación ASP por default.
Es posible escribir handlers (manejadores) para los
eventos onStart y onEnd , los cuales pueden
ser definidos en el archivo global.asa o a través de un script.
Aplicaciones ASP
virtuales
De la misma manera en que la aplicación default es creada durante
la instalación, es posible crear aplicaciones virtuales ASP en
cualquier sub-directorio del sitio web. Una aplicación virtual ASP
puede contener todos los sub-directorios del directorio definido
como el directorio de la aplicación, como quiera este
directorio y los sub-directorios también son parte de la aplicación
default y comparten el espacio global creado por el objeto
Application default.
Todas las variables son almacenadas en la aplicación default,
también están disponibles en la aplicación en un sub-directorio.
Si una página ASP en el sub-directorio de la aplicación escribe
un valor en su objeto Application que tiene el mismo
nombre a uno existente en la aplicación default (root ),
el valor original no estará disponible en el sub-directorio de la
aplicación, pero si en otras aplicaciones o páginas ASP, el valor
original se mantiene porque la aplicación root no puede
ver las variables en los sub-directorios de la aplicación.
Para crear una aplicación virtual, utilice la aplicación Internet
Services Manager o las páginas web administradoras equivalentes.
Variant
Un Variant es el único tipo de variable proporcionada en
el scripting engine VBScript para ASP. Su comportamiento es
el mismo que el tipo de dato Variant que puede ser
especialmente definido en Visual Basic y Visual Basic for
Applications.
Internamente el tipo de dato Variant almacena valores como
sub-tipos individuales, automáticamente controlan la conversión del
tipo implicito.
Recuerde utilizar la función VarType() para obtener
el tipo de dato de una variable.
Ejemplo
Variant
¿Qué es una Sesión?
El objeto ASP Application puede ser utilizado para
almacenar estados globales que pueden ser accedidos por todos los
usuarios que están corriendo la aplicación.
¿Es posible almacenar valores especificos para cada usuario?, si,
es posible almacenar valores que son globales para un usuario
especifico, pero privados para los demás usuarios.
Existen algunos inconvenientes o cosas que es importante tomar en
cuenta para las sesiones una de ellas es que dependen de las
cookies por lo que un navegador que no ` permita
cookies no podrá acceder al objeto
Session .
Es posible desabilitar todas las sesiones para el sitio web
completo:
Default Web Site Properties » Home Directory » [Configuration] »
Application Configuration » App Options
El objeto Application es creado cuando la
asp.dll es cargada en respuesta de la primer solicitud
de página ASP, provee un repositorio para almacenar variables y
referencias de objetos que están disponibles para todas las páginas
que todos los usuarios pueden abrir.
El objeto Session es creado por cada usuario cuando
hace su primer solicitud de página ASP al sitio web y permanece
disponible hasta que expira el timeout por default,
provee un repositorio para almacenar variables y referencias a
objetos que están disponibles solo para las páginas que el usuario
abre durante el tiempo de vida de la sesión.
¿Qué es una Página Dinámica?
Una página dinámica desde el punto de vista ASP, es una página
que es especialmente creada por el Servidor en respuesta de una
solicitud del Cliente, la cual puede ser diferente cada vez,
dependiendo de una variedad de circunstancias.
Directiva #include
Es posible insertar el contenido de otro archivo dentro de una
página ASP mediante la utilización de la directiva
#include , la cual toma por completo el contenido de un
archivo y lo inserta dentro de la página.
Sintaxis
<-- #include file= "nombreArchivo.asp" -->
Las extensiones válidas del archivo a insertar son
inc y asp , por razones de seguridad, se
recomienda el uso de extensiones asp ya que nunca su
código podrá ser visto por el cliente.
ASP reconoce la directiva #include para parsear el
archivo. La biblioteca ssinc.dll es utilizada
directamente para llevar a cabo la directiva SSI
#include .
El siguiente ejemplo NO es válido:
<-- #include file="<%=nombreVariable%>"
-->
Existen otras directivas como:
#config
#echo
#exec
#flastmod
#fsize
Scripting Runtime Library
El ambiente de scripting de ASP es frecuentemente referenciado
como los objetos Scripting Runtime Library que son expuestos
en el código a través del scripting engine utilizado (JScript o
VBScript). Otra categoria de componentes es generalmente
referenciado como Active Server Components, los cuales son
implementados usualmente por separados ActiveX dll's.
Un modelo de objetos es basicamente una forma de entender como
varias partes del sistema se relacionan, el Modelo de Objetos ASP
provee una estructura que puede ser usada para manipular diferentes
elementos HTML en las solicitudes y respuestas además del ambiente
ASP por completo.
Los lenguajes de scripting se utilizan también para tener un
modelo de objetos para los objetos que los lenguajes de scripting
proveen como antagónicos de los objetos como Request y
Response que son provistos directamente por la
asp.dll .
Los objetos scripting son provistos por Microsot Scripting
Runtime Library (scrrun.dll ) el cual es
inicializado con el default script engine Active Scripting
Microsoft provee 3 principales objetos como parte del Scripting
Runtime Library:
Dictionary
Dim oDatos
Set oDatos = Server.CreateObject("Scripting.Dictionary")
FileSystemObject
TextStream
Se pueden crear instancias de estos 3 objetos utilizando el
método CreateObject() o utilizando el elemento HTML
Object .
El ámbito de todas las instancias de objetos y componentes
creados en una página ASP tiene un ámbito de página, es decir, sólo
existen en la página que los creo y son destruidos automáticamente
depués que la página actual se completa y el resultado se envía al
cliente. Es posible crear objetos con ámbito de aplicación o de
sesión.
El método Server.CreateObject crea una instancia del
objeto inmediatamente, en cambio si se utiliza el elemento HTML
Object sólo crea una instancia del objeto especifico
cuando ocurre la primer referencia al objeto.
Cuando se utiliza CreateObject en el cliente, se
está creando una instancia del objeto dentro del contexto del
navegador y corre en el mismo espacio de memoria que el navegador, a
menos que el objeto sea implementado como un archivo ejecutable con
extensión .exe .
Componentes ASP
La instalación estándar del ASP/ISP incluye varios componentes
del lado del servidor, los cuales se conocen también por ASP
installable components:
MSWC.AdRotator , controla la apariencia de
imagenes, por ejemplo crear un banner.
MSWC.BrowserType , expone un conjunto de
propiedades que reflejan las capacidades del navegador.
MSWC.NextLink , provee de navegación sencilla.
MSWC.ContentRotator , toma una configuración de un
archivo que especifica la sección HTML que puede ser insertado en
otra página.
MSWC.Counters , puede crear, incrementar y
almacenar contadores para un script.
MSWC.IISLog , provee acceso a archivos log del
servidor web.
MSWC.MyInfo , provee un repositorio de pares
nombre/valor que pueden ser accedidos globalmente.
MSWC.PageCounter , registra el número de veces que
una página ha sido accedida.
MSWC.PermissionChecker , previene de errores de
script causados cuando un usuario intenta acceder a un recurso
para el cual no tiene establecidos los permisos correctos.
MSWC.tools , provee métodos que pueden ser
utilizados para checar la existencia de un archivo.
OLE DB
OLE DB es la tecnología subyacente que actua como interfaz
entre los programas y la fuente de datos. Provee el acceso a datos y
no fué diseñado para ser utilizado en todos los lenguajes.
ADO
ADO como su nombre lo índica son objetos ActiveX que
provee fácil acceso a la funcionalidad OLE DB. Provee una interfaz
para lenguajes como Visual Basic y lenguajes de scripting que no
pueden acceder directamente a OLE DB. ADO también provee una
interfaz de programación más fácil que OLE DB. Los lenguajes como
C++ o Java que pueden usar OLE DB directamente pueden utilizar ADO
para simplificar el acceso a datos.
OLE DB y ADO están diseñados para dar acceso a datos almacenados.
Provider &
Consumer
Un Provider (Proveedor) es algo que provee datos y un
Consumer (Consumidor) es algo que utiliza esos datos.
Una aplicación es un consumidor de datos y el almacén de datos es
el proveedor, ya que OLE DB está diseñado para hablar con una
variedad de almacenes de datos, por lo que se tiene un OLE DB
Provider por cada tipo de almacén de datos. Los programas hablan
con ADO u OLE DB y OLE DB habla con el Proveedor.
Providers & Drivers
OLE DB Provider para ODBC permite a OLE DB acceder a una fuente
de datos ODBC existente. Los proveedores se encuentran en la capa
OLE DB y los drivers están en la capa ODBC. Si se quiere utilizar
una fuente de datos ODBC se utiliza el proveedor OLE DB para ODBC,
el cual utiliza el driver ODBC apropiado. Si no se necesita utilizar
una fuente de datos ODBC entonces se puede utilizar el proveedor OLE
DB apropiado (native providers).
El uso de un Proveedor para ODBC significa una capa extra.
Objeto Connection
El objeto Connection habilita la conexión a
almacenes de datos.
No es necesario crear explicitamente un objeto
Connection para conectarse a un almacén de datos. Es
posible crear objetos Command, Recordset y
Record sin un objeto Connection . ADO
implicitamente crea un objeto Connection , si se
requieren varias acciones que impliquen un Proveedor, es preferible
para mayor eficiencia crear un objeto Connection que
dejar a ADO crearlos cada vez que se necesiten.
Sintaxis:
connection.Open [ConnectionString], [UserID], [Password],
[Options]
ConnectionString ,
string que contiene los detalles de conexión, por ejemplo el
nombre de un DSN
OBDC, el nombre de un Data Link
File o los detalles actuales de conexión.
UserID , especifica el nombre de usuario a
utilizar durante la conexión.
Password , especifica la clave o contraseña del
usuario.
Options , especifica el tipo de conexión a
establecer, si se omite el argumento la conexión que se establece
por default es de tipo synchronous. Es posible que se
establezca de tipo adAsyncConnect , pero en el
ambiente ASP no se utiliza la conexión asynchronously
porque los lenguajes de scripting no pueden recibir eventos de
ADO.
Ejemplo utilizando el método Open que recibe como
argumento el ConnectionString : Dim sConnStr
sConnStr = "DSN=nombreBaseDatos; UID=nombreUsuario; PWD=claveUsuario;"
Set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open sConnStr
'instrucciones
oConn.Close
Set Conn = Nothing
Ejemplo utilizando la propiedad ConnectionString
propiamente: Dim sConnStr
sConnStr = "DSN=nombreBaseDatos; UID=nombreUsuario; PWD=claveUsuario;"
Set oConn = Server.CreateObject("ADODB.Connection")
oConn.ConnectionString = sConnStr
oConn.Open sConn
'instrucciones
oConn.Close
Set Conn = Nothing
Ejemplo utilizando el método Open que recibe como
argumento el ConnectionString contenido en una variable
de sesión: Set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open Session("sConnStr")
'instrucciones
oConn.Close
Set Conn = Nothing
Método Execute
Para obtener un recordset de un objeto Connection se
utiliza el método Execute :
Connection.Execute CommandText, [RecordsAffected],
[Options]
Argumentos:
CommandText , especifica el comando a ejecutar.
RecordsAffected , variable que especifica el
número de registros afectados por el comando.
Options , puede ser uno o más de los valores de
las constantes CommandTypeEnum o
ExecuteOptionEnum
A diferencia del método Open , Execute
no tiene disponible las opciones de de tipo y bloqueo de cursor.
Si la sentencia SQL a ejecutar no regresa registros, es
conveniente indicarlo a través de la instrucción
adExecuteNoRecords , de esta manera se indica a ADO que
el comando a ejecutar no regresa registros, si se omite esta
indicación ADO construye un recordset vacío.
oConn.Execute sqlSentence, lngRegistros, adCmdText +
adExecuteNoRecords
Objeto Command
El objeto Command está diseñado especificamente para
tratar con comandos, especificamente aquellos que requieren de
parámetros, esto también lo puede hacer el objeto
Connection pero con restricciones, por lo que
Command fué creado especificamente para proveer todos
los aspectos de los comandos, permitiendo especificar exactamente
los detalles de los parámetros como tipo de datos y longitud, así
como utilizar su salida y regreso de valores.
El objeto Command es también utilizado para correr
comandos que no regresan registros, como un query que inserta nuevos
datos o actualiza los existentes.
Método Execute
Para indicar a un objeto Command ejecutar un comando
que regrese un recordset sólo de lectura utilice
Execute : Set oCmd = Server.CreateObject("ADODB.Command)
oCmd.CommandText = "nombreTabla"
Set oRS = oCmd.Execute
Argumentos que recibe el método Execute :
RecordsAffected , variable que especifica el
número de registros afectados por el comando.
Parameters , un arreglo que contiene los valores
de los parámetros.
Options , puede ser uno o más de los valores de
las constantes CommandTypeEnum o
ExecuteOptionEnum
Es posible no establacer los valores de los argumentos:
Set oRS = oCmd.Execute( , , adCmdTable)
Objeto Recordset
El objeto Recordset sirve para contener un conjunto
de datos extraidos del almacén, permitiendo agregar, actualizar o
borrar datos, navegar entre los datos, también puede contener
colecciones de campos donde existe un objeto Field por
cada campo (columna) en el Recordset .
Los recordsets son los únicos que contienen los datos y existen
varios tipos de recordsets:
Sintaxis:
Recordset.Open [Source],
[ActiveConnection], [CursorType],
[LockType],
[Options]
Source , especifica la fuente de datos, por
ejemplo el nombre de la tabla de una base de datos, un stored
procedure, un string SQL, un objeto Command o
cualquier comando aplicable a el proveedor.
ActiveConnection , especifica la conexión a
utilizar para el recordset, el cual puede ser un ConnectionString
u objeto Connection
CursorType , especifica el tipo de
cursor a utilizar, por default es de tipo adOpenForwardOnly.
LockType , especifica el tipo de bloqueo a
utilizar, por default es adLockReadOnly.
Options , indica al proveedor que tipo de
argumento se utiliza para la fuente de datos, los valores posibles
son las siguientes constantes CommandTypeEnum :
adCmdText , indica el comando de texto tal como
un string SQL.
adCmdTable , indica el nombre de una tabla.
adCmdStoredProc ,
indica el nombre de un Stored procedure.
adCmdFile , indica el nombre del archivo para
almacenar el recordset.
adCmdTableDirect , indica el nombre de una tabla
y todas sus columnas.
adCmdURLBind , indica un URL.
adCmdUnspecified , indica que no hay un tipo
especificado.
adCmdUnknown , india que el tipo de comando es
desconocido.
Opciones Adicionales:
adAsynExecute , indica que el comando deberia
ser ejecutado de forma asincrona.
adAsynFetch ,
adAsynFetchNonBlocking ,
adExecuteNoRecords , indica
que el comando no regresa registros
Para utilizar las opciones adicionales utilice el operador
Or :
adCmdStoreProc Or adExecuteNoRecords
Si no se especifica el tipo de comando ADO tiene que concluir
que tipo de comando se ha de ejecutar.
Procesamiento
Asíncrono
El Procesamiento Asíncrono significa que las acciones ocurren
en segundo plano (background), en vez de ejecutar el comando y
esperar a que termine (procesamiento síncrono) logrando hacer algo
más mientras el comando se está ejecutando en background. Se
recomienda su uso cuando las operaciones no regresan un recordset
y el resultado no es tan importante.
Ejemplo: Dim oConn
Set oConn = Server.CreateObject("ADODB.Recordset")
With oConn
.Source = "nombreTabla"
.ActiveConnection = Session("sConnStr")
.CursorType = adOpenForwardOnly
.LockType = adLockReadOnly
.Open
End With
'instrucciones
oConn.Close
Set oConn = Nothing
El ejemplo abre un recordset cuyo cursor apunta al primer
registro, si no hay registros las propiedades BOF y
EOF tienen el valor True , lo cual es ideal
para hacer una validación: If oConn.BOF and oConn.EOF Then
Response.Write "La consulta no encontro registros" 'El recordset está vacío
End If
Moverse dentro del
Recordset
Una vez que se abre un recordset lo común es hacer operaciones
que involucran sentencias de control para moverse entre los
registros del recordset, la limitante en estos casos es cuando la
propiedad EOF se vuelve True , lo cual
significa que se ha alcanzado el final del recordset: oRS.Open Session("sConnStr")
While Not oRS.EOF
'instrucciones
oRS.MoveNext
Wend
El método MoveNext es utilizado para moverse al
siguiente registro.
Si el tipo de cursor permite moverse hacia atrás se utiliza el
método MovePrevious , por lo que la sentencia de control
deberia checar el estado de la propiedad BOF . También
es posible utilizar los métodos MoveFirst para poner el
cursor en el primer registro o MoveLast para situar el
cursor en el último registro. Recuerde que al abrir el recordset se
está situado en el primer registro.
Si requiere moverse entre los campos (columnas) vea Fields
Collection
Bookmarks
Cuando se explora un recordset quizá necesitemos almacenar la
posición de un registro para consultarla más tarde, esto es posible
empleando un recordset bookmark el cual mantiene un apuntador
a un registro individual, para utilizar un bookmark simplemente
asigne la propiedad bookmark a una variable:
nBookmark = oRS.Bookmark
Después cuando requiera moverse al registro deseado:
oRS.Bookmark = nBookmark
Supports
No todos los recordsets soportan la propiead Bookmark ,
además de otras opciones no soportadas por todos los proveedores o
tipos de recordsets, para identificar si se soporta una propiedad
utilice el método Supports : If oRS.Supports(adBookmark) Then
'instrucciones por ejemplo:
nBookmark = oRS.Bookmark
End If
Es posible combinar más de una constante utilizando el operador
Or : If oRS.Supports(adBookmark Or adFind) Then
'instrucciones por ejemplo:
nBookmark = oRS.Bookmark
End If
Filter : Filtrado de
Recordsets
Es posible restringir la vista de registros en un recordset, esto
se utiliza cuando solamente se desea mostrar ciertos registros en un
recordset, pero no se desea re-consultar el almacén de datos cada
vez, para ello se utiliza la propiedad Filter que toma
como argumentos un criterio muy parecido a la cláusula SQL
WHERE :
oRS.Filter = "state = 'ca'"
Es posible utilizar los operadores And y
Or :
oRS.Filter = "name = 'Gerardo' Or name =
'Angel'"
Es posible utilizar wildcards:
oRS.Filter = "lastName LIKE 'Ag%'"
Para re-establecer el valor del filtro se utiliza la cadena
vacía:
oRS.Filter = ""
También es posible utilizar constantes en el filtro:
adFilterNone , elimina el filtro actual. Tiene el
mismo efecto que oRS.Filter = "" .
adFilterPendingRecords , para ver sólo los
registros que tienen cambios pero que no han sido enviados al
servidor. Sólo es aplicable a un modo batch update.
adFilterAffectRecords , para ver sólo los
registros afectados por la última invocación de los métodos:
Delete , Resync , UpdateBatch
o CancelBatch
adFilterFetchedRecords , para ver los registros en
el cache, es decir, los resultados de la última invocación de un
método que obtiene registros.
adFilterConlictingRecords , para ver los registros
que no fueron actualizados por alguna razón durante el batch
update.
Es posible utilizar un filtro con un arreglo de
Bookmark's : oRS.Filter = Array(nBookmark(0),nBookmark(1),nBookmark(2))
While Not oRS.EOF
Response.Write oRS(1) & <br>
oRS.MoveNext
Wend
El resultado serán sólo 3 registros, porque sólo 3 bookmarks
fueron aplicados al filtro.
Find : Búsqueda de
Registros
Es posible realizar una búsqueda por registros individuales, para
ello se utiliza el método Filter , el cual es similar a
Filter :
oRS.Find "name = 'informatique'"
La principal diferencia es que sólo puede tener un criterio,
utilizar And y Or no es permitido.
Es posible utilizar argumentos opcionales:
oRS.Find Criterio, [SkipRows], [SearchDirection],
[Start]
SkipRows , es un número que indica el número de
registros a saltar antes de comenzar la búsqueda, por default su
valor es 0 y la búsqueda comienza en el registro
actual.
SearchDirection , un valor posible es
adSearchForward para buscar hacia adelante en el
recordset o adSearchBackward para buscar hacia atrás
en el recordset.
Start , es un bookmark
que identifica la posición a partir de la cual debe comenzar la
búsqueda.
Si el registro es encontrado se está posicionado en ese registro,
si el registro no es encontrado se está posicionado en:
- Si la búsqueda se realizo hacia atrás, entonces se está
posicionado después del final del recordset y se establece
EOF
- Si la búsqueda se realizo hacia adelante, entonces se está
posicionado antes del comienzo del recordset y se establece
BOF
Utilice un bookmark
para posicionarse en el registro en que se estaba posicionado antes
de la búsqueda. nBookmark = oRS.Bookmark
oRS.Find "URLname = 'www.informatique.com.mx'"
If Not oRS.EOF Then
'registro encontrado
Else
'registro no encontrado
oRS.Bookmark = nBookmark
End If
Cursors
Un Cursor es aquel que administra el conjunto de
recordsets y su ubicación actual dentro del recordset, el último es
manejado por el current record pointer (puntero de registro
actual).
Un recordset es un cursor, cuando se abre un recordset el
registro actual apunta al primero y ¿Qué es lo que identifica al
registro actual?, lo que identica al registro actual es el
current record pointer y ¿Qué es lo que el puntero maneja?,
lo que el puntero maneja es el cursor.
Cuando se avanza al registro siguiente o cualquier otro registro,
es el cursor quien realiza el movimiento o avance y cuando se
accede al campo del renglón actual el cursor sabe en que
registro nos encontramos, regresando los valores correctos.
Las tareas a realizar con el cursor son determinadas por
el tipo de cursor que identifica que funcionalidad
proporciona..
Tipos de Cursores
El tipo de cursor por defualt es Forward Only.
- Static(
adOpenStatic ), contiene una copia
estática de los registros, por lo que cualquier registro
modificado, agregado o eliminado por otros usuarios no es visible.
Es posible moverse entre el recordser hacia atrás y hacia
adelante.
- Forward Only(
adOpenForwardOnly ), contiene una
copia estática de los registros, por lo que cualquier registro
modificado, agregado o eliminado por otros usuarios no es visible.
Sólo es posible moverse entre el recordser hacia adelante.
- Dynamic(
adOpenDynamic ), no tiene un
conjunto de registros fijos, cualquier registro agregado,
modificado o eliminado por otros usuarios es visible. Es posible
moverse entre el recordser hacia atrás y hacia adelante.
- Keyset(
adOpenKeyset ), contiene un conjunto
de registros fijos, cualquier registro modificado por otros
usuarios es visible, excepto por nuevos registros insertados que
no son visibles y si otros usuarios eliminan registros estos serán
inaccesibles en el recordset. Esta funcionalidad es llevada a cabo
por el conjunto de registros que son identificados por sus llaves.
CursorLocation
¿Dondé se localiza el cursor?, la localización del cursor depende
del almacén de datos, por ejemplo, Microsoft SQL Server tiene un
cursor service, Microsoft Access no tiene un cursor
service, OLE DB tiene un cursor service.
Cuando se abre un recordset se tiene que decir, si se quiere que
el almacén de datos administre el cursor o si se quiere que OLE DB y
ADO administren el cursor localmente, para especificar esto se
utiliza la propiedad CursorLocation del objeto
Connection o del objeto Recordset
estableciendo los siguientes valores posibles:
adUseServer , permite al almacén de datos
manipular el cursor.
adUseClient , permite a ADO manipular el cursor.
Estos valores se establecen antes de abrir una conexión:
oConn.CursorLocation = adUseServer
oConn.Open Session("sConnStr")
Por default el cursor se basa del lado del Servidor
(adUseServer ). En el cursor del lado del Servidor es
responsabilidad al almacén de datos administrar los registros,
cuando se crea un recordset el almacén de datos controla las
operaciones que se llevan a cabo con los registros. En el cursor del
lado del Cliente el contenido entero del recordset es copiado en el
Cliente y administrado por el servicio local de cursor del cliente.
En SQL Server existe el firehouse cursor que no es un tipo
especial de cursor porque no es especificamente un tipo de cursor.
Agregar Registros
Para agregar registros a un recordset utilice el método
AddNew . Existen dos formas de utilizar este método:
- Sin argumentos, simplemente invoque el método
AddNew para que un registro nuevo y vacío se inserte
al final del recordset y poder cambiar los datos de los campos
antes de invocar el método Update para almacenar los
cambios. With oRS
.Open "empleados", Session("sConnStr"), adOpenDynamic,adLockOptimistic,adCmdTableDirect
.AddNew 'agrega nuevo registro
.Fields("sURL") = "www.informatique.com.mx"
.Fields("nVisitas") = 1234
.Fields("sPais") = "Mexico, City"
.Update 'almacena cambios
End With
- Con argumentos opcionales, recibe 2 arreglos, el
primero especifica el nombre de los campos o columnas, el segundo
especifica los valores a almacenar en estos campos o columnas.
With oRS
.Open "empleados", Session("sConnStr"), adOpenDynamic,adLockOptimistic,adCmdTableDirect
.AddNew Array("sURL","nVisitas","sPais"),_
Array("www.informatique.com.mx", 1234, "Mexico, City")
End With
Note, que utilizar el método con argumentos opcionales,
no requiere invocar al método Update .
Editar Registros
Para editar registros de un recordset es similar a insertar un
registro, la diferencia está en que no es necesario invocar el
método AddNew . With oRS
.Open "empleados", Session("sConnStr"), adOpenDynamic,adLockOptimistic,adCmdTableDirect
.Fields("sURL") = "http://www.informatique.com.mx" 'editar campo o columna
.Update 'almacena cambios
End With
En este ejemplo se modifica el campo sURL del primer
registro de la tabla.
Eliminar Registros
Para eliminar registros se invoca el método Delete ,
los registros a eliminar dependen de los argumentos opcionales, los
cuales pueden ser alguna de las siguientes constantes
AffectEnum , (por default es adAffectCurrent):
adAffectCurrent , indica sólo eliminar el registro
actual.
adAffectGroup , indica que todos los registros que
concuerden con el filtro actual sean eliminados.
adAffectAll , indica eliminar todos los registros
que contiene el recordset.
adAffectChapters , indica que los registros en
todos los chapters sean eliminados.
Ejemplo de eliminación simple:
oRS.Delete
Si se emplea un Filtro y se
desea eliminar todos los registros que concuerden con él, entonces
se pude utilizar la constante apropiada:
oRS.Delete adAffectGroup
Objeto Record
El objeto Record contiene las propiedades únicas de
un archivo o directorio.
Objeto Stream
El objeto Stream es utilizado para acceder al
contenido de un nodo, por ejemplo un correo electrónico o una página
web. Al utilizar Stream se puede acceder al contenido
actual de una archivo o recurso, también puede utilizarse para
acceder a un conjunto de datos como un flujo de XML.
El objeto Stream está diseñado para manejar datos
binarios como imagenes o largos segmentos de texto de bases de
datos.
Colecciones
La biblioteca de ADO tiene varias colecciones, es posible acceder
a ellas de la siguiente manera: For Each o In rs.Fields
response.write o.name & <br>
Next
Colección Fields
La colección Fields contiene objetos
Field asociados con un recordset o record. Para cada
recordset basado en datos estructurados tales como datos SQL, los
campos corresponden a las columnas que contienen detalles respecto a
la columna como su nombre, tipo de dato, longitud, etc.
La colección Fields contiene un objeto
Field por cada columna en el recordset. Para acceder a
los campos de un registro puede utilizar esta colección. Las
siguientes sentencias son equivalentes: oRS.Fields("nombreColumna").Value
oRS("nombreColumna").Value
oRS(1).Value
oRS.Fields(1).Value
oRS("nombreColumna") 'Value es la propiedad por default
Es posible utilizar el nombre de la columna o su posición dentro
de la colección, utiliar el nombre de la columna es lo recomendado,
ya que hace el código más fácil de mantener.
Ya que la propiedad Value es la propiedad por
default es posible omitirla.
Si es necesario iterar a través de la colección utilice:
For Each o In oRS.Fields
Response.Write o.Name & " : " & o.Value & <br>
Next
Colección Parameters
La colección Parameters es utilizada solamente por
el objeto Command e identifica los parametros
almacenados en los comandos. Esta colección es frecuentemente
empleada con stored procedures para permitir pasar datos en
sentencias SQL, también se emplea la colección cuando sólo se
requiere regresar un valor de un stored procedure.
Colección Errors
La colección Errors contiene detalles del último
error del Provider ADO u OLE DB que fué generado por un comando y
puede ser accedido solamente a través de un objeto
Connection , esto parece una restricción porque no es
requerido un objeto Connection explicitamente pero se
puede acceder implicitamente al objeto Connection a
través de la propiedad ActiveConnection de los objetos
Command , Record o Recordset ,
por ejemplo: For Each o In rs.ActiveConnection.Errors
Response.Write o.Name & <br>
Next
Colección Properties
Ya que ADO está diseñado para trabajar con diferentes almacenes
de datos y estos quizá tengan diferentes características, la
colección Properties es dinámica y puede por lo tanto
cambiar de acuerdo al proveedor de datos.
Conexión a Almacenes de
Datos
Para acceder a un almacén de datos lo primero que se debe crear
es una conexión, esta conexión puede ser explicita a través del
objeto Connection o implicita a través de los objetos
Command , Record o Recordset .
Existen diferentes formas para conectarse a una fuente de datos:
- Connection String, a
través de un string se especifican los detalles de conexión o a
través de un comando se abre directamente el almacén de datos.
El Connection String varia dependiendo del Provider, ya
que cada Proveedor de datos quizá requiere diferentes detalles.
El Provider OLE DB para ODBC es el proveedor por default, por
lo tanto si se deja la sección de Provider= con el
valor off automáticamente se utilizará ODBC.
Para Microsoft Access si se utiliza una conexión ODBC sin DSN
emplee:
Driver={Microsoft Access Driver (*.mdb)};
DBQ=path\nombreBaseDatos.mdb
Para Microsoft SQL Server utilizando el Provider para ODBC
emplee:
Driver={SQL Server}; Server=nombreServidor;
Database=nombreBaseDatos; UID=nombreUsuario;
PWD=claveUsuario
Para un proveedor nativo OLE DB:
Provider=SQLOLEDB; Data Source=nombreServidor; Initial
Catalog=nombreBaseDatos; UserId=nombreUsuario;
Password=claveUsuario
Para un Servicio Indexado:
Provider=MSIDXS; Data Source=nombreCatalogo
- Data Link File, a través de un
archivo que contiene los detalles de conexión
- ODBC Data Sources, similar a Data Link File, pero sólo
aplica a fuentes de datos de un sistema ODBC.
Fuentes de Datos ODBC
Las fuentes de datos ODBC también llamadas Data Source
Names o DSNs se configuran a
través de la opción Data Sources del menú de Herramientas
Administrativas. Para acceder a un DSN desde una página ASP es
necesario asegurarse que el DSN esta configurado como un Sistema DSN
o seleccionar el folder System DSN del Data Source
administrator y seleccionar el botón [Add].
Es posible utilizar la directiva #include para
insertar un arhivo que contiene el string de conexión o almacenarlo
como una variable de aplicación (global.asa): Sub Application_OnStart()
strConn = "Provider=SQLOLEDB; Data Source=nombreServidor;
Initial Catalog=nombreBaseDatos; UserId=nombreUsuario; Password=claveUsuario"
Set Application("ConnectionString") = strConn
End Sub
Es posible que la recomendación a seguir sea utilizar un archivo
de inclusión, si se utilizan conexiones a diferentes servidores y
bases de datos, ya que utilizar una variable de aplicación se limita
a solo unservidor y una sola base de datos lo cual implica que la
recomendación para 1 servidor 1 base de datos sea emplear una
variable de aplicación. En terminos de velocidad no existe
diferencia entre ambos métodos.
Connection Pooling
Connection pooling, cuando damos la instrucción de cerrar
una conexión, suponemos que la conexión es cerrada, pero OLE DB no
cierra la conexión, simplemente pone la conexión en un pool
(lugar común) de conexiones inactivas.
Cuando alguien vuelve a abrir la conexión, OLE DB primero checa
en el pool si existe una conexión que concuerde exactamente
con los mismos detalles, si existe se proporciona la conexión
encontrada (se establece una re-conexión), si la conexión no se
encontro en el pool entonces se crea una nueva conexión.
Una conexión sólo podría ser re-utilizada una vez que la conexión
ha sido cerrada por el Cliente.
Las conexiones que se encuentran en el pool se eliminan
después del tiempo por default para optimizar recursos.
El pooling controla desde la fuente de datos ODBC las
conexiones ODBC, para las conexiones OLE DB el Connection
pooling no puede ser cambiado y no son conexiones compartidas.
Existe una regla a seguir y es que se debería abrir la
conexión en el último momento posible y cerrarla tan pronto como sea
posible, así la conexión se abre por un período tan corto como sea
posible.
Locking
Locking es la forma en que se establece la integridad de
los datos, asegurandose de que no se sobreescriban los cambios
realizados. Para asegurarse de que dos o más usuarios accedan a los
datos al mismo tiempo y realicen alguna operación los registros son
bloqueados y para ello existen diferentes métodos para asegurarse
que los registros estén protegidos, a este conjunto de métodos se
les conoce como tipos de bloqueo:
Tipos de Bloqueo
El tipo de bloqueo determina como los registros son bloqueados al
actualizarse los datos, existen 4 tipos de bloqueo (lock
type), por default el tipo de bloqueo es Read Only:
- Read Only(
adLockReadOnly ), significa que el
recordset es solamente de lectura y no es posible modificar los
registros. Utilizelo cuando no se necesite modificar ningún
registro, el proveedor no tiene que hacer ningún chequeo sobre los
registros.
- Pessimistic(
adLockPessimistic ), cuando se
modifica un registro, el proveedor bloquea el registro
garantizando una edición exitosa del registro, es decir, se
bloquea el registro en cuanto la edición toma lugar.
- Optimistic(
adLockOptimistic ), el registro
es bloqueado hasta que los cambios sean ingresados al almacén de
datos a través del método Upadate .
- Batch Optimistic(
adLockBatchOptimistic ),
permite que multiples registros sean modificados y son bloqueados
cuando el método UpdateBatch es invocado.
Si no se realizan modificaciones a los registros la recomendación
es utilizar el tipo de bloqueo Optimistic , ya que el
almacén de datos sólo bloquea el registro por un período corto. El
tipo de bloqueo Pessimistic incrementa la integridad de
datos a costo de la coincidencia simultanea (concurrency), ya que al
bloquear el registro no está disponible a la vista de otros usuarios
por lo que la coincidencia simultanea se reduce, en cambio el
bloqueo Optimistic bloquea el registro por un período
de tiempo pequeño incrementando la coincidencia simultanea dando una
gran oportunidad para que los datos sean modificados por otros
usuarios.
Manejo de Errores para Almacenes de
Datos
La colección Errors
contiene un objeto Error por cada error que ocurre
durante un comando ADO. La razón de tener una colección es que
múltiples errores pueden ocurrir durante un comando y el Proveedor
OLE DB necesita una forma de informamar al cliente que más de un
error ha ocurrido.
Puntos importantes de la colección Errors:
- Cada vez que un comando ADO se ejecuta, si un error ocurre la
colección Errors se
limpia (los datos contenidos se eliminan) y se llena con los
nuevos detalles. Si no ocurren errores entonces la colección Errors se
deja intacta, por lo tanto la colección quizá contenga errores
aunque el comando ADO se lleva a cabo exitosamente.
- El Proveedor OLE DB quizá llene la colección Errors con
mensajes informales o warnings los cuales podrían tener un
error número
0 , por consiguiente no se puede checar
el número de errores en la colección y asumir que un error
ocurrio.
La colección Errors es sólo
accesible desde el objeto Connection , ¿Es posible
acceder al objeto Connection , si no se ha creado
explicitamente este objeto?, el objeto Recordset tiene
una propiedad ActiveConnection la cual contiene el
objeto Connection del objeto recordset
actual, lo cual significa que es posible obtener la colección Errors de esta
manera:
oRS.ActiveConnection.errors
Si se requiere ver todos los errores ocurridos, es necesario
utilizar una sentencia de control para exlplorar la colección:
For Each o In oRS.ActiveConnection.Errors
'instrucciones
Next
Para desplegar información de los errores, es necesario saber
exactamente que está almacenado en la colección, el objeto
Error contiene las siguientes propiedades:
Number , especifica el número de error ADO
NativeError , especifica el número de error desde
el Proveedor de los datos.
SQLState , especifica en 5 dígitos el código de
estado SQL para el error, cuando se está conectado a bases de
datos SQL.
Source , especifica el objeto que genero el error.
Description , describe el error.
Lo anterior representado con una sentencia de control:
For Each o In oRS.ActiveConnection.Errors
Response.write "Number: " & oRS.Number & <br>
Response.write "NativeError: " & oRS.NativeError & <br>
Response.write "SQLState: " & oRS.SQLState & <br>
Response.write "Source: " & oRS.Source & <br>
Response.write "Description: " & oRS.Description & <br>
Next
Errores ADO en Páginas ASP
El mejor camino para para checar errores es utilizar la sentencia
On Error Resume Next : Dim sqlSentence, oRSvisitas, oRS
sqlSentence = "select * from tableName where nombreCampo = 'algunaCondicion'"
Set oRS = Server.CreateObject("ADODB.recordset")
oRS.Open sqlSentence, Session("sConnStr")
If ocurrieronErrores(oRS.ActiveConnection) = False Then
While Not oRS.EOF
'instrucciones
oRS.MoveNext
Wend
End If
oRS.Close
Set oRS = Nothing
Function ocurrieronErrores(oConn)
Dim oError
If oConn.Errors.Count > 0 Then
For Each oError in oConn.Errors
If oError.Number <> 0 Then
Response.Write "Number" & oError.Number & " br>"
Response.Write "NativeError" & oError.NativeError & " br>"
Response.Write "SQLState" & oError.SQLState & " br>"
Response.Write "Source" & oError.Source & " /br>"
Response.Write "Description" & oError.Description & " br>"
ocurrieronErrores = True
End If
Next
Else
ocurrieronErrores = False
End If
End Function
Ejemplo de
Errores ADO
Stored Procedure : Consulta
Almacenada
Un Stored Procedure, también llamado Consulta
Almacenada, es una consulta predefinida SQL almacenada en la
base de datos.
¿Por qué crear un Stored Procedure en vez de crear una consulta
SQL al vuelo?
- Un Stored Procedure es compilado por la base de datos, lo cual
hace la ejecución del procedimiento más rápida.
- Los Stored Procedures frecuentemente son almacenados en Cache
por la base de datos, haciendo más rápida su ejecución ya que no
tienen que ser leidos de disco. No todas las bases de datos
soportan el mecanismo de almacenamiento en Cache, por ejemplo
Microsoft Access no lo soporta pero SQL Server sí.
- Los datos se hacen un poco más seguros cuando se especifica
que sólo los Stored Procedures pueden modificar la base de datos.
- Se elimina el código desordenado ASP que generan las
sentencias SQL, haciendo más fácil su mantenimiento.
- Es posible mantener todo el código SQL en el Servidor.
- Es posible utilizar parámetros de salida en un Stored
Procedure, lo cual permite obtener de regreso un recordset y otros
valores.
Como regla general los Stored Procedures casi siempre son más
rápidos que sus sentencias SQL equivalentes.
Ejemplo de Stored Procedure: CREATE PROCEDURE nombre_ConsultaAlmacenada
AS
UPDATE nombre_Tabla
SET nombre_Campo = valor_Nuevo
WHERE nombre_Campo = 'valor_Condición'
Para utilizar un Stored Procedure simplemente se pone el nombre
de la consulta almacenada como command text y se establece el
tipo correspondiente: Set cmdActualizar = Server.CreateObject("ADODB.Command")
cmdActualizar.ActiveConnection = sConn
cmdActualizar.CommandText = "nombre_ConsultaAlmacenada"
cmdActualizar.CommandType = adCmdStoreProc
cmdActualizar.Execute , , adExecuteNoRecords
Cuando se actualizan datos no se regresa un recordset,
simplemente se ejecuta el Stored Procedure.
Parámetros en Stored
Procedure
Los parámetros en Stored Procedures son como los parámetros
utilizados en procedimientos o funciones.
Ejemplo de Stored Procedure que recibe
Parámetros: CREATE PROCEDURE nombre_ConsultaAlmacenada
@nombre_Variable1 Char(10)
@nombre_Variable2 Money
AS
UPDATE nombre_Tabla
SET nombre_Campo1 = @nombre_Variable1
WHERE nombre_Campo2 = @nombre_Variable2
Todas las variables SQL tienen tipos especificos y deben seguirse
las convenciones del lenguaje las cuales estipulan que el nombre de
una variable siempre comienza con el símbolo @ .
Parameters Collection :
Colección Parámetros
La Colección Parámetros contiene un objeto
Parameter por cada parámetro en el Stored Procedure.
Ya que ADO no sabe que parámetros existen, es necesario
crearlos a través del método CreateParameter :
Set Parameter = Command.CreateParameter(Name, [Type],
[Direction], [Size], [Value])
Name , especifica el nombre del parámetro, que
no es el nombre del parámetro en el Stored Procedure, pero
se recomienda emplear el mismo nombre.
Type , especifica el tipo de dato del parámetro,
el cual puede ser algunas de las constantes
adDataType .
Direction , indica si el parámetro proporciona
información al Stored Procedure o si el Stored Procedure
proporciona información de regreso al ADO, los valores permitidos
son:
adParamInput , parámetro de entrada que se envía
al Stored Procedure.
adParamOutPut , parámetro de salida, que obtiene
información del Stored Procedure.
adParamInputOutput , parámetro de entrada y
salida.
adParamReturnValue , parámetro que contiene el
valor de regreso del Stored Procedure.
Size , indica el tamaño del parámetro, para
tamaños fijos como numeros. Puede omitirse.
Value , especifica el valor del parámetro.
Una vez creados los parámetros es posibles agregarlos a la
colección Parameters a través del método
Append : Set oParametro = cmdUpdate.CreateParameter("@nombre_Parametro", adCurrency, adParamInput, , 10)
cmdUpdate.Parameters.Append oParametro
No es necesario tener contenido en un objeto el parámetro, es
posible obtener el mismo resultado de la siguiente manera:
cmdUpdate.Parameters.Append _
cmdUpdate.CreateParameter("@nombre_Parametro", adCurrency, adParamInput, , 10)
No es necesario establecer el valor del parámetro al mismo tiempo
en que este es creado, ya que una vez que el parámetro es agregado a
la colección Parameters permanece en ella y después es
posible establecer su valor en cualquier momento antes de que se
ejecute el comando:
cmdUpdate.Parameters.Append _
cmdUpdate.CreateParameter("@nombre_Parametro", adCurrency, adParamInput)
cmdUpdate.Parameters("@nombre_Parametro") = 10
Al ser una colección es posible realizar lo anterior a través del
índice que ocupa el parámetro especifico en la colección:
cmdUpdate.Parameters(índice) = 10
Los parámetros en la colección Parameters deben
coincidir en orden de los parámetros en el Stored Procedure.
Paso de Parámetros como un
Arreglo
Es posible crear parámetros y agregarlos a la colección pasando
los parámetros al Stored Procedure vía el método
Execute : Set cmdActualizar = Server.CreateObject("ADODB.Command")
cmdActualizar.ActiveConnection = sConn
cmdActualizar.CommandText = "nombre_ConsultaAlmacenada"
cmdActualizar.CommandType = adCmdStoreProc
cmdActualizar.Execute size, Array(sTipo,curPercent), adExecuteNoRecords
Como puede observer se utiliza la función Array la
cual pone variables individuales dentro del arreglo las cuales se
pasan de manera correspondiente, existen ciertas desventajas al
utilizar esta forma:
- Sólo es posible utilizar parámetros
input .
- Puede ser muy lento si se intenta invocar el Stored Procedure
varias veces, ya que ADO pregunta al almacén de datos que
parámetros son y que tipos de datos utilizan.
Parámetros de Salida
Es posible definir un parámetro como un parámetro de
salida, donde los valores son suministrados por el stored
Procedure, para aquellos casos en los que se necesiten más de dos
valores de regreso sin la utilización de un recordset.
El Store Procedure: CREATE PROCEDURE nombre_ConsultaAlmacenada
@Type Char(12),
@Percent Money,
@Max Money OUTPUT
AS
BEGIN
UPDATE nombreTabla
SET nombreCampo1 = valor
WHERE ncombreCampo2 = @Type
SELECT @Max = MAX(combreCampo1)
FROM nombreTabla
END
Obtener el valor de @Max : Set cmdActualizar = Server.CreateObject("ADODB.Command")
cmdActualizar.ActiveConnection = sConn
cmdActualizar.CommandText = "nombre_ConsultaAlmacenada"
cmdActualizar.CommandType = adCmdStoreProc
Agregar un parámetro de salida a la colección:
cmdActualizar.Append
cmdActualizar.CreateParameter("@Max",adCurrency,adParamOutput)
Una vez que el procedimiento almacenado es ejecutado, es posible
obtener el valor de la colección: cmdActualizar.Execute size, , adExecuteNoRecords
algunaVariable = cmdActualizar.Parameters("@Max")
otraVariable1 = cmdActualizar.Parameters("otroParametroSalida1")
otraVariable2 = cmdActualizar.Parameters("otroParametroSalida2")
Response.Write FormatCurrency(algunaVariable)
Set cmdActualizar = Nothing
Valores de Regreso
El regreso de valores en Stored Procedures no es lo mismo
que el regreso de valores en funciones, ya que los Store Procedures
son ejecutados utilizando el método Execute lo cual
regresa un recordset.
Set oRS = cmd_Nombre.Execute
México, D. F.
informatique 2003-2004
| |