Búsqueda web :
iWebSites :  El Universo del Globo |  Asecom |  Celaapsi |  Garabatoss |  Heshik |  Nafra |  Arquigrafics

  .
 Usuario :     Contraseña :    2 usuarios conectados


ASP - Active Server Pages

Microsoft ASP

Í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:

  1. FTP (Protocolo de Transferencia de Archivos - File Transfer Protocol)
  2. SMTP (Protocolo de Correo Simple - Simple Mail Transfer Protocol)
  3. 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.)
  4. 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.

  1. 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.
  2. 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.
  3. 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")

  4. 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")

  5. 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.

  1. 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.

  1. 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.

  1. 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:

  1. 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.
  2. 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.
  3. 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.
  4. 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).
  5. 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).
  6. 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.
  7. 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.
  8. 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.

  1. 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.
  2. 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.
  3. BinaryWrite(SafeArray), escribe el contenido del SafeArray de tipo Variant al flujo de salida actual HTTP sin ninguna conversión de caracter.
  4. Clear(), elimina cualquier buffer existente contenido en la página de la respuesta IIS cuando Response.Buffer es True.
  5. End(), termina el procesamiento ASP y regresa el contenido creado actualmente, entonces aborta cualquier procesamiento de esta página.
  6. 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.
  7. 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.
  8. 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

  1. 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.
  2. 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

  1. 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.
  2. 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

  1. 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.
  2. 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

  1. 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.
  2. 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

  1. 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

  • CreateObject("identifier"), crea la instancia del objeto definido por el argumento que recibe y regresa una referencia a él y puede ser usada en el código. El objeto puede ser definido por su ClassID o por su ProgID por ejemplo ADODB.Connection.

    Set oNuevo = CreateObject("ADODB.Connection")

    Set oHojaCalculo = GetObject("presupuesto.xls")

  • Execute("url"), al invocarse este método se detiene la ejecución de la página actual y transfiere el control a la página especificada en el argumento que recibe, el ambiente actual del usuario se transfiere a la nueva página y después que la página termino su ejecución regresa y pasa el control a la página original y la ejecución se reanuda en la sentencia siguiente a la invocación del método Execute.
  • GetLastError(), regresa una referencia a un objeto ASPError que contiene los detalles del último error ocurrido dentro del procesamiento ASP de la página. La información expuesta por el objeto ASPError incluye el nombre del archivo, número de línea, código de error, etc.
  • HTMLEncode("string"), regresa un string que es una copia del valor que recibe como argumento pero con todos los caracteres HTML de la forma &lt;
  • MapPath("url"), regresa el path físico completo y nombre de archivo del archivo fuente especificado en el argumento que recibe.
  • Transfer("url"), detiene la ejecución de la página actual y transfiere el control a la página que se especifica en el argumento que recibe, a diferencia de Execute, Transfer no reanuda en la página original pero termina cuando la nueva página se ejecuto por completo.
  • URLEncode("string"), regresa un string que es una copia del valor de entrada que recibe como argumento pero con todos los caracteres que no son válidos en un URL como ?, & y espacios, convirtiendolos en su equivalente dentro del URL %3F, %26, etc.

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

  1. ASPCode, entero que representa el número de error generado por ASP/IIS.
  2. ASPDescription, string que proporciona una descripción detallada del error.
  3. Category, string que representa la fuente del error.
  4. Column, entero que representa la posición del caracter que genero el error dentro del archivo.
  5. Description, string que proporciona una breve descripción del error.
  6. File, string, que representa el nombre del archivo que fué procesado cuando ocurrio el error.
  7. Line, entero que representa el número de línea que genero el error dentro del archivo .
  8. Number, entero que representa el código de error COM estándar.
  9. 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:

  1. Form, si se establece el método de envío como POST es posible obtener los valores de un formulario de dos formas:
    • Request.Form("nombreInput")
    • Request.Form(índice)

      Es posible acceder a Request.Form(índice) de manera automatizada empleando una sentencia de control

    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

  2. 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:

  1. GET (default)
  2. 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.

  1. 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">

  2. 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:

  1. 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"

  2. 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:

  1. Proveer de un ámbito global a través de un área de almacenamiento variable accesible globalmente.
  2. 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:

  1. Dictionary

    	Dim oDatos
    	Set oDatos = Server.CreateObject("Scripting.Dictionary")
    	

  2. FileSystemObject
  3. 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]

  1. 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.
  2. UserID, especifica el nombre de usuario a utilizar durante la conexión.
  3. Password, especifica la clave o contraseña del usuario.
  4. 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]

  1. 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.
  2. ActiveConnection, especifica la conexión a utilizar para el recordset, el cual puede ser un ConnectionString u objeto Connection
  3. CursorType, especifica el tipo de cursor a utilizar, por default es de tipo adOpenForwardOnly.
  4. LockType, especifica el tipo de bloqueo a utilizar, por default es adLockReadOnly.
  5. 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:

  1. Si la búsqueda se realizo hacia atrás, entonces se está posicionado después del final del recordset y se establece EOF
  2. 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.

  1. 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.
  2. 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.
  3. 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.
  4. 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:

  1. adUseServer, permite al almacén de datos manipular el cursor.
  2. 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:

  1. 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
    	
  2. 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):

  1. adAffectCurrent, indica sólo eliminar el registro actual.
  2. adAffectGroup, indica que todos los registros que concuerden con el filtro actual sean eliminados.
  3. adAffectAll, indica eliminar todos los registros que contiene el recordset.
  4. 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:

  1. 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.
  2. 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.
  3. Optimistic(adLockOptimistic), el registro es bloqueado hasta que los cambios sean ingresados al almacén de datos a través del método Upadate.
  4. 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:

  1. 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.
  2. 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:
    1. adParamInput, parámetro de entrada que se envía al Stored Procedure.
    2. adParamOutPut, parámetro de salida, que obtiene información del Stored Procedure.
    3. adParamInputOutput, parámetro de entrada y salida.
    4. 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