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