Cómo recuperar registros de una base de datos residente en un servidor de Internet
Por Enrique Martínez Montejo
Última revisión: 10/10/2004
 

Si nuestra base de datos se encuentra alojada en un servidor de Internet, mediante una consulta a una página ASP incluida en el mismo servidor, podemos recuperar un conjunto de registros que satisfaga el criterio especificado en una consulta SQL, o bien, podemos ejecutar cualquier otra consulta SQL de acción.

Lo primero será crear una página ASP capaz de leer una petición y devolver el conjunto de registros seleccionados:

Prueba.asp

<%@Language=VBScript%>
<%Option Explicit%>
<%
Dim oCnn
Dim oRst
Dim SQL
Dim Execute
Dim lngRegAfectados

On Error Resume Next

Const adPersistXML = 1
Const adStateOpen = 1
Const adOpenStatic = 3
Const adLockBatchOptimistic = 4
Const adCmdText = 1
Const adUseClient = 3

' Crear y abrir una nueva conexión
Set oCnn = Server.CreateObject("ADODB.Connection")
With oCnn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString="Data Source=" & Server.MapPath("bd1.mdb")
    .Open
End With

' Si se ha producido algún error, lo indicamos y finaliza
' la página ASP
'
If Err.Number <> 0 Then
    Response.Write "<BR><U><B>"
    Response.Write "Error " & Err.Source & ": </U></B>"
    Response.Write "<BR><BR>"
    Response.Write Err.Description
    Response.End
End If

' Leemos los valores de los parámetros especificados
' en la petición de la página ASP
'
SQL = Request.QueryString("SQL")
Execute = Ucase(Request.QueryString("Execute"))

If Len(SQL) = 0 Then
    Response.Write "No se ha especificado ninguna consulta."
    Response.End
End If

If Execute = "YES" Then
    ' Ejecutamos la consulta SQL especificada
    lngRegAfectados = 0
    oCnn.Execute SQL, lngRegAfectados, adCmdText

    ' Si se ha visto afectado algún registro, indicamos el número de
    ' registros que se han visto afectados por la consulta SQL
    '
    If lngRegAfectados > 0 Then
        Response.Write "Número de registros afectados: " & lngRegAfectados
    End If

Else

    ' La petición devuelve por defecto un conjunto de registros

    ' Creamos y abrimos un objeto Recordset actualizable
    Set oRst = Server.CreateObject("ADODB.Recordset")

    With oRst
        ' Utilizamos cursores del lado cliente
        .CursorLocation = adUseClient
        .CursorType = adOpenStatic
        ' El tipo de cursor siempre será adLockBatchOptimistic
        .LockType = adLockBatchOptimistic
        .Open SQL, oCnn, , , adCmdText
    End With

    ' Comprobamos si se ha producido un error
    If Err.Number <> 0 Then
        Response.Write "<BR><U><B>"
        Response.Write "Error " & Err.Source & ": </U></B>"
        Response.Write "<BR><BR>"
        Response.Write Err.Description
        Response.End
    End If

    ' Devolvemos el conjunto de registros
    Response.ContentType = "text/xml"
    oRst.Save Response, adPersistXML

End If

' Comprobamos si se ha producido un error
If Err.Number <> 0 Then
    Response.Write "<BR><U><B>"
    Response.Write "Error " & Err.Source & ": </U></B>"
    Response.Write "<BR><BR>"
    Response.Write Err.Description
    Response.End
End If

' Cerramos los objetos y liberamos los recursos asociados
Set oRst = Nothing
If oCnn.State = adStateOpen Then oCnn.Close
Set oCnn = Nothing
%>

La petición que se realice a la página ASP hay que pasarle dos parámetros, SQL y Execute, los cuales indicararán respectivamente la consulta SQL que se ejecutará, y si se trata o no de una consulta SQL de acción, la cual no devolverá un conjunto de registros, por tanto, si deseamos efectuar una simple consulta de selección a una tabla, en la barra de dirección del navegador escribiríamos lo siguiente:

http://servidor/carpeta/prueba.asp?sql=select * from tabla1

Si por el contrario deseamos efectuar una consulta de acción, deberá de especificar Yes en el parámetro Execute:

http://servidor/carpeta/prueba.asp?sql=select * into copia from tabla1&execute=yes

Los distintos parámetros se separan mediante el símbolo &, y éstos se especifican tras el nombre de la página ASP, la cual finalizará con el signo ?.

Una vez que tenemos la página ASP, ya sólo nos queda escribir el procedimiento de Visual Basic que efectuará la consulta y recuperará un conjunto de registros, los cuales se mostrarán en un control DataGrid:

Option Explicit

Private
Sub Command1_Click()

    ' No es necesario especificar un objeto Connection, por lo
    ' que trabajaremos con un objeto Recordset desconectado.
    '
    ' Para hacer cualquier actualizacion hay que ejecutar una
    ' consulta SQL a través de la pagina ASP; no se puede hacer
    ' directamente sobre el objeto Recordset.


    Dim MousePointer As Integer
    Dim SQL As String

    ' Guardamos el puntero actual del ratón
    MousePointer = Screen.MousePointer

    ' Cambiamos el puntero del ratón al tipo reloj de arena,
    ' de esta forma indicamos un tiempo de espera hasta que
    ' termine la operación solicitada.
    '

    Screen.MousePointer = vbHourglass

    SQL = "SELECT Facturas.IdFactura, Clientes.* " & _
          "FROM Facturas INNER JOIN Clientes " & _
          "ON Clientes.IdCliente = Facturas.IdCliente " & _
          "WHERE Clientes.IdCliente=4301047"

    Set rst = New ADODB.Recordset
    With rst
        .Source = "http://servidor/carpeta/prueba.asp?SQL=" & SQL & "&Execute=No"
        .Open
    End With

    ' Restauramos el puntero del ratón
    Screen.MousePointer = MousePointer

    ' Mostramos el resultado en un control DataGrid
    Set DataGrid1.DataSource = rst

End Sub

En los casos que desee efectuar consultas SQL que no devuelvan un conjunto de registros, es necesario que indique expresamente el parámetro Execute=Yes en la llamada a la página ASP, dado que por defecto la petición abrirá un objeto Recordset para devolver un conjunto de registros. En este caso, es necesario que active una rutina de control de errores si desea evitar el siguiente mensaje de error:

Error 3709.
No se puede utilizar la conexión para realizar esta operación. Está cerrada o no es válida en este contexto.

Ello es debido a que se ha utilizado el método Open del objeto Recordset, para ejecutar una consulta SQL que no devuelve un conjunto de registros, motivo por el cual se obtendrá dicho error, por lo que sería aconsejable omitirlo activando una rutina de control de errores antes de llamar al método Open:

On Error Resume Next

 

Otros enlaces de interés:

Indice de Ejemplos de ADO


Enrique Martínez Montejo - 2004

NOTA: La información contenida en este artículo, así como el código fuente incluido en el mismo, se proporciona COMO ESTÁ, sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo explicado, recomendado o sugerido en el presente artículo.

NOTE: The information contained in this article and source code included therein, is provided AS IS without warranty of any kind, and confers no rights. You assume any risk to implement, use or run it explained, recommended or suggested in this article.