ASP.NET & ADO.NET

Acceder a una base de datos usando ADO y ADO.NET
(desde una página .aspx)

Publicado el 01/Ago/2006
Actualizado el 01/Ago/2006
Autor: Guillermo 'guille' Som

En este artículo te muestro cómo usar los objetos de ADO y de ADO.NET para acceder a una base de datos de Access desde una página Web. Así podrás comprobar cómo poder convertir tu código anterior de Visual Basic 6.0 al que hay que usar con los lenguajes de .NET.

 

Introducción:

En realidad esto que te voy a mostrar es un ejemplo basado en algo que ya publiqué hace un par de años, (concretamente en Enero de 2004), pero en esta ocasión te mostraré las dos formas de hacerlo poniendo el código junto, con idea de que puedas ver las diferencias de acceder a una base de datos, (que en este caso será de Access), usando los objetos de ADO: Recordset y Connection, además de usar los "equivalentes" (o casi), de ADO.NET, en esta ocasión, usaremos también un objeto Connection y un DataTable, pero del espacio de nombres System.Data.OleDb, ya que el tipo de base a la que accederemos es de Access, aunque para acceder a una base de datos de SQL Server o cualquier otro tipo, pues... en fin, que tendrás que usar otros objetos de ADO.NET más adecuados, etc., pero para mantener la cosa sencilla, no vamos a entrar en esas comparaciones.
Lo mismo ocurre con el código, solo mostraré el de Visual Basic, ya que de lo que se trata es de comparar el acceso con VBScript, (porque el acceso a datos lo haremos desde una página Web, de tipo .aspx), que como sabes es un "sucedáneo" de Visual Basic 6.0, así que... no hay nada para C#, aunque si quieres ver un ejemplo parecido, puedes verlo en los ejemplos que publiqué en Enero de 2004, en el que si que mostraba los dos, el de Visual Basic y el de C#.
Aquí tienes los links a esos dos ejemplos de hace un par de años:

 

Una vez hechas las presentaciones, veamos cómo acceder a una base de datos de Access usando esas dos tecnologías.
Como ya he comentado, el acceso lo haremos desde una página .ASPX, es decir, desde una página de ASP.NET, sí, aunque usemos ADO, se puede usar, pero de los pormenores, o detalles, de cómo hacer que se pueda usar ese sistema "obsoleto" de acceso a datos desde una página de ASP.NET, tendrás que verlo en el primero de los dos links que te he puesto antes, ya que aquí solo te mostraré qué código usar para cada una de esas dos formas de acceder a los datos... incluso no pondré un ejemplo completo, que después la gente se queja de que es muy complicado y se terminan perdiendo, así que... tendrás que echarle un poco de imaginación y "pensar" un poco para que comprendas mejor todo... si no te enteras de nada, entonces significa que antes de entrar en esto deberías ver otras secciones tanto de código ADO para Visual Basic 6.0 como de ADO.NET para Visual Basic .NET (incluido Visual Basic 2005).

 

Conectar a la base de datos y recuperar los datos

El código "script" compatible con Visual Basic 6.0, usando ADO.
Como sabes, en VBScript no se definen los tipos de datos, pero para que te hagas una idea, (por si quieres compararlo con una aplicación normal de escritorio), la variable Rst sería de tipo ADODB.Recordset, y la variable Cnn sería del tipo ADODB.Connection.

' Variables usadas para crear los objetos, etc.
Dim Rst, Cnn
Dim sConn, sTip
Dim sTitulo, sLink, sApartado, sDescripcion
Dim sel, i

' Crear los objetos
Cnn = Server.CreateObject("ADODB.Connection")

' Crear la conexión a la base de datos
sConn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & _
	Server.MapPath("datos\elguille.mdb") & ";"
Cnn.Open(sConn)
' Crear la cadena SQL
sel = "SELECT * FROM Titulos ORDER BY Apartado ASC"
Rst = Cnn.Execute(sel)

 

El código para Visual Basic .NET usando ADO.NET.
En este código no usamos ningún objeto del tipo Connection, ya que usamos un DataAdapter, y ese objeto solo necesita la cadena de conexión, pero no de una "conexión real".

Dim da As OleDbDataAdapter
Dim dt As DataTable
Dim i, n As Integer
Dim sel, sCnn As String
'
sel = "SELECT * FROM Titulos ORDER BY Apartado ASC;"
'
sCnn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & _
	Server.MapPath("datos\elguille.mdb") & ";"
' Crear el DataAdapter
da = New OleDbDataAdapter(sel, sCnn)
'
' Llenar el DataTable
dt = New DataTable
da.Fill(dt)

Como puedes comprobar, la cadena de conexión es la misma para los dos tipos de acceso a datos, la diferencia principal está en que el objeto Recordset de Visual Basic 6.0 lo creamos a partir del método Execute de la conexión; mientras que en .NET la forma de recuperar los datos (una de ellas) es por medio del objeto OleDbDataAdapter, que es el que se encarga de recuperar los datos de la base de datos, y la forma de recuperarlos lo sabe por medio de la cadena de conexión.
En ambos casos, los datos que se van a usar están indicados por los datos de la cadena de selección (la variable sel). En el caso de ADO, esos datos los manipularemos por medio del Recordset, mientras que en ADO.NET vamos a usar un objeto DataTable. El primero lo "llenamos" usando el mencionado método Execute, mientras que en el segundo, lo llenamos por medio del método Fill del adaptador.

 

Navegar por los datos (mostrar todas las filas)

Una vez que ya tenemos los datos a los que queremos acceder, podremos navegar por ellos de la siguiente forma. En estos códigos (primero el de ADO y después del de ADO.NET), recorremos cada una de las filas que haya devuelto la cadena de selección usada (sel), los asignaremos a variables y los mostraremos, bueno, en realidad lo de mostrarlos es algo que no se hace en este código, ya que es cosa tuya, porque lo que en realidad importa (al menos esa es mi intención), es ver código "compatible" entre ADO y ADO.NET.

El código de ADO que recorre todas las filas del Recordset:

' Buscar desde el principio
Rst.MoveFirst
i = 0
Do While Not (Rst.BOF Or Rst.EOF)
    i = i + 1
    With Rst
        ' Asignar a las variables el contenido del registro
        sTitulo = .Fields("Titulo").Value & ""
        sLink = .Fields("Link").Value & ""
        sApartado = .Fields("Apartado").Value & ""
        sDescripcion = .Fields("Descripcion").Value & ""

        ' Mostrar los datos de la fila actual
        ... Esto es cosa tuya ...

    End With
    '
    ' Mostrar el siguiente registro
    Rst.MoveNext
Loop

If i = 0 Then
    ' No se ha encontrado ningún registro que coincida con la selección
End If
'
Rst.Close
Cnn.Close

Rst = Nothing
Cnn = Nothing

 

El código de ADO.NET que recorre todas las filas de la tabla:

'
n = dt.Rows.Count

If n = 0 Then
    ' No se ha encontrado ningún registro que coincida con la selección

Else

    For i = 0 To n - 1
        Dim sTitulo, sLink, sApartado, sDescripcion As String
        '
        ' Asignar a las variables el contenido del registro
        sApartado = dt.Rows(i)("Apartado").ToString
        sTitulo = dt.Rows(i)("Titulo").ToString
        sLink = dt.Rows(i)("Link").ToString
        sDescripcion = dt.Rows(i)("Descripcion").ToString

        ' Mostrar los datos de la fila actual
        ... Esto es cosa tuya ...

     Next
End If

 

Nota:
En realidad, un código "más parecido" al de ADO, lo conseguiríamos usando un objeto del tipo DataReader, el cual, a diferencia de la combinación DataAdapter/DataTable, si que usa una conexión permanente a la base de datos, además de que se obtiene por medio de un método (ExecuteReader), en este caso, desde el objeto Command usado para realizar la selección indicada en la variable sel.
Además el DataReader también se utiliza para "navegar" de forma muy parecida al del Recordset... o casi... pero eso... lo mismo lo publico otro día, y por ahora, puedes practicarlo por tu cuenta, así de camino aprendes más... (je, je... eso es lo que se dice cuando el que escribe no quiere hacer el ejemplo...) ¿yo? ¡que va! estoooo... es que... ¡uf! ¡cuantas cosas tengo que hacer!, además... eso son cosas que dice del otro Guille... ;-)))
 

 

De cualquier forma, con o sin lo dicho en la nota, espero que todo esto te sea de utilidad.

Nos vemos.
Guillermo

 


Espacios de nombres usados en el código de este artículo:

System.Data
System.Data.OleDb

 



Ir al índice principal de el Guille