Acceder a una base de datos de Access usando ADO.NET, desde un formulario WebPublicado el 02/Ene/2004
|
|
Panorama |
En el zip con el ejemplo, incluyo una pequeña base de datos que es la usada en el formulario Web.
Por tanto, si lo descomprimes, procura que la base de datos se quede dentro del directorio "datos".
De forma predeterminada se creará ese directorio.
¿Dónde descomprimir el fichero?
Dentro del directorio "localhost", por defecto es: C:\Inetpub\wwwroot
Para acceder a la página de prueba, tendrás que usar http://localhost/ejemploAccessADONET.aspx
Por supuesto esto sólo será posible si tienes el Windows 2000/XP Profesional o un Windows Server que tenga instalado el IIS.
Nota: Este ejemplo realmente no utiliza ningún control ASP.NET, sólo código "puro y duro".
El link al código de ejemplo: ejemploAccess.zip (13.4KB)
El cual incluye también el ejemplo de acceso a ADO
Notas sobre el código ASP.NET (aunque poco) mostrado:
- Sobre la importación de espacios de nombres en páginas ASP.NET:
En el código aquí usado se encuentra dentro de la misma página Web, esto es diferente a cuando se compila con Visual Studio .NET. Pero como esta será la forma más habitual de hacer páginas ASPX, (al menos cuando son simples como en este caso), por aquello de que no es necesario compilar el código ni nada de eso, y por tanto podemos crearlas "al vuelo". Pues en estos casos, si necesitamos importar espacios de nombres, lo haremos usando código ASP.NET, en este caso será usando <%@Import Namespace = "..." %>
Este código es código ASP.NET y por tanto válido para cualquier lenguaje, es decir, no te confundas porque se use Import, que parece que sería el código a usar en VB .NET, y pienses que para C# se usaría using. Si eres observador, en Visual Basic realmente se usa Imports, con una "s" al final.- La declaración de los objetos a usar se hace de la misma forma que con el código "normal", (¿recuerdas lo que dije al principio? en ASP.NET se usa el mismo lenguaje que en el resto de aplicaciones de .NET), lo único que es diferente es que para hacer ciertas cosas en las páginas Web usaremos instrucciones (u objetos) propios para hacer ciertas cosas:
Por ejemplo, para averiguar el path "real" de un directorio de nuestro sitio Web, usaremos Server.MapPath(), esto devolverá una cadena con la localización real dentro del disco duro del servidor.
Por otro lado, si queremos "escribir" algo en la página Web, usaremos Response.Write(). Lo que pongamos en el parámetro, será lo que se muestre en la página como si lo hubiésemos escrito dentro de la propia página HTML, por tanto el código que escribamos debe tener formato HTML, por ejemplo, se usará <br> para indicar un cambio de línea.
Estos "objetos" se usan de la misma forma que en ASP clásico y son funciones válidas tanto para Visual Basic .NET como para C#.- Fíjate también que cuando escribimos el código dentro de Form_Load, éste se ejecuta desde arriba... es decir, es lo primero que se muestra en la página. Una vez que se ha ejecutado el código de Form_Load, se seguirá con lo que hayamos escrito dentro del "cuerpo" de la página, es decir lo que esté entre los tagas HTML <body> y </body>.
- Un detalle en cuanto al código de Visual Basic .NET.
Como sabrás, por defecto, VB no es estricto con la declaración de variables ni con la conversión de datos. En este ejemplo, como no se le ha indicado lo contrario, se supone que la opción "Option Strict" está desconectada. Por eso nos permite asignar a una variable de tipo String el contenido de un elemento de una fila, por ejemplo: dt.Rows(i).Item("Apartado"), si este mismo código lo queremos escribir en una aplicación normal de Windows usando Option Strict On, tendríamos que usar este otro código: dt.Rows(i).Item("Apartado").ToString, que es lo que al final hacemos en el código de C#.
Pongo aparte lo que hay que hacer, para que quede claro y resaltado...
Ya sabes que a mi me gusta usar siempre la opción estricta, aunque en este ejemplo lo he omitido para poder explicarlo. De todas formas, el código incluido en el zip tiene esa opción activada.
Si queremos activar Option Strict en una página ASP.NET tendremos que indicarlo en la directiva <%@ Page indicando Strict = true (o false si lo queremos desactivar), por ejemplo:
<%@ Page Language = VB Strict = true %>
¿Por qué ser tan estrictos?
Porque así haremos las cosas "bien" y si hacemos algo mal: una asignación o una declaración, la haremos porque nosotros queremos hacerla, no porque "nos hayamos equivocado al hacerla".Por favor usa siempre Option Strict On en tu código.
<% @Page Language = VB %> <%@Import Namespace="System.Data"%> <%@Import Namespace="System.Data.OleDb"%> <Script Language=VB Runat=Server> Sub Page_Load(sender As Object, e As EventArgs) Dim cnn As OleDbConnection Dim cmd As OleDbDataAdapter dim dt As DataTable dim i, n As Integer dim s As String ' Response.Write("<p><font face='Verdana' size='4'>") Response.Write("Prueba de acceso a base de datos Access con ADO.NET y ASP.NET") Response.Write("</font><hr noshade size='3'>") Response.Write("<p><font face='Verdana' size='2'> ") ' s = "SELECT * FROM Titulos ORDER BY Apartado ASC;" ' cnn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & _ Server.MapPath("datos\elguille.mdb") & ";") ' Crear el comando cmd = New OleDbDataAdapter(s, cnn) ' ' Llenar el DataTable dt = New DataTable cmd.Fill(dt) ' n = dt.Rows.Count If n = 0 then Response.Write("<p>No hay registros.</p>") Else Response.Write(n.ToString & " registros hallados.<br>") Response.Write("<p>") For i = 0 To n - 1 Dim sTitulo, sLink, sApartado, sDescripcion As String ' sApartado = dt.Rows(i).Item("Apartado") sTitulo = dt.Rows(i).Item("Titulo") sLink = dt.Rows(i).Item("Link") sDescripcion = dt.Rows(i).Item("Descripcion") Response.Write((i + 1).ToString("0000") & _ "- <a href='" & sLink & "'>" & _ sTitulo & "</a><b>(" & _ sApartado & ")</b><br>" & sDescripcion & "<br>") Next Response.Write("</p>") End If Response.Write("</font></p>") End Sub </Script> <html> <head> <title>Acceso a datos usando ADO.NET</title> </head> <BODY bgcolor="#FFFFFF" text="#000000"> <hr noshade size="3"> </body> </html>
<% @Page Language = C# %> <%@Import Namespace="System.Data"%> <%@Import Namespace="System.Data.OleDb"%> <Script Language=C# Runat=Server> void Page_Load(object sender, EventArgs e){ OleDbConnection cnn; OleDbDataAdapter cmd; DataTable dt; int i, n; string s; // Response.Write("<p><font face='Verdana' size='4'>") Response.Write("Prueba de acceso a base de datos Access con ADO.NET y ASP.NET"); Response.Write("</font><hr noshade size='3'>"); Response.Write("<p><font face='Verdana' size='2'> "); // s = "SELECT * FROM Titulos ORDER BY Apartado ASC;"; // cnn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Server.MapPath(@"datos\elguille.mdb") + ";"); // Crear el comando cmd = new OleDbDataAdapter(s, cnn); // // Llenar el DataTable dt = new DataTable(); cmd.Fill(dt); // n = dt.Rows.Count; if( n == 0 ) Response.Write("<p>No hay registros.</p>"); else{ Response.Write(n.ToString() + " registros hallados.<br>"); Response.Write("<p>"); for(i = 0; i<n; i++){ string sTitulo, sLink, sApartado, sDescripcion; // sApartado = dt.Rows[i]["Apartado"].ToString(); sTitulo = dt.Rows[i]["Titulo"].ToString(); sLink = dt.Rows[i]["Link"].ToString(); sDescripcion = dt.Rows[i]["Descripcion"].ToString(); Response.Write((i + 1).ToString("0000") + "- <a href='" + sLink + "'>" + sTitulo + "</a><b>(" + sApartado + ")</b><br>" + sDescripcion + "<br>"); } Response.Write("</p>"); } Response.Write("</font></p>"); } </Script> <html> <head> <title>Acceso a datos usando ADO.NET (código de C#)</title> </head> <BODY bgcolor="#FFFFFF" text="#000000"> <hr noshade size="3"> </body> </html>