4. Acceso a BBDD

Para el acceso a BBDD desde .NET tenemos varias opciones:

  • OleDb: es una opción sencilla para acceder a objetos ole, como por ejemplos ficheros de Access. Si la BBDD es sencilla es una forma fácil de tener una web dinámica.
  • ODBC: es la opción que necesitamos cuando no hay librerías .NET para el gestor de BBDD o cuando queremos hacer que el acceso a la BBDD sea transparente. Es más lento porque al final estamos pasando por un puente intermedio.
  • Sql: es la opción para acceder a BBDD SqlServer. Cualquier web ASP.NET medianamente seria tendría que usar la BBDD "de la casa".

Las instrucciones para acceder son las mismas, lo único que cambia es el prefijo de las clases: OleDb, Odbc y Sql.

Veamos un ejemplo con una página web en la que se muestran los datos de una BBDD access y se permite insertar nuevos registros. IMPORTANTE: para poder ver el reflejo de la inserción nada más hacerlo, la parte de mostrar datos hay que hacerla en el método Page_PreRender, ya que si los ponemos en el Page_Load el insert se hará más tarde (el soporte del evento de hacer clic en un botón se hace después del Load).

 

Ejemplo de consulta parametrizada:

 

¿using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.Data.OleDb; public partial class OleDb : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } // Hay que hacer el select en el prerender, para QUE RECOJA LAS INSERCCIONES. // Esto es porque los eventos se tratan después del Load. protected void Page_PreRender(object sender, EventArgs e) { // String de conexion, al estilo de ASP // El mapPath hace la magia cuando tenemos el fichero incluido string stringConexion = "Provider=Microsoft.Jet.OLEDB.4.0;" + "User Id=;Password=;" + @"Data Source=" + Server.MapPath("discos.mdb"); // Esta es la consulta que ejecutaremos string consulta = "SELECT * FROM Discos"; // Creamos el objeto de la conexion OleDbConnection conexion = new OleDbConnection(stringConexion); // Creamos el objeto para ejecutar la sentencia OleDbCommand sentencia = new OleDbCommand(consulta, conexion); // Un resultSet o recordSet para guardar el resultado de la sentencia OleDbDataReader resultSet = null; try { // metemos control de excepciones, por si las moscas // Abrimos la conexión conexion.Open(); // Ejecutamos la sentencia y mostramos el resultado resultSet = sentencia.ExecuteReader(); // NOTA: si fuera un INSERT, UPDATE o DELETE se harí­a así: // int registros = sentencia.ExecuteNonQuery(); // registros serían los reg afectados lblResultado.Text += "Estos datos hay en la tabla<br />"; // Recorremos el resultado while (resultSet.Read()) { // Para tomar una columna de cada registro usamos funciones de este pelo // segun el tipo de dato: getString, getBoolean, getDouble,... // En caso de duda resultSet.GetValue(3).getType().toString() // nombre, estilo , precio lblResultado.Text += "Intérprete: " + resultSet.GetString(1); lblResultado.Text += "Estilo: " + resultSet.GetString(2); lblResultado.Text += "Precio: " + resultSet.GetDecimal(3) + "<br />"; } // IMPORTANTE, al final de la consulta hay que cerrar // tanto el datareader como la conexión!!! resultSet.Close(); conexion.Close(); } catch (OleDbException ode) { lblResultado.Text += "Error de OleDb: {0} " + ode; } } protected void Button1_Click(object sender, EventArgs e) { // String de conexion, al estilo de ASP // El mapPath hace la magia cuando tenemos el fichero incluido string stringConexion = "Provider=Microsoft.Jet.OLEDB.4.0;" + "User Id=;Password=;" + @"Data Source=" + Server.MapPath("discos.mdb"); // Esta es la consulta que ejecutaremos //string consulta = "insert into discos (interprete,estilo,precio) values (+txtNombre.Text+,+txtEstilo.Tex + ," +txtPrecio.Text+")"; // parametrizada mejor para evitar el SQLInject string consulta = "insert into discos (interprete,estilo,precio) values (?,?,?)"; // Creamos el objeto de la conexion OleDbConnection conexion = new OleDbConnection(stringConexion); // Creamos el objeto para ejecutar la sentencia OleDbCommand sentencia = new OleDbCommand(consulta, conexion); // Un resultSet o recordSet para guardar el resultado de la sentencia int resultado = 0; try { // metemos control de excepciones, por si las moscas // Abrimos la conexión conexion.Open(); sentencia.Parameters.Add(new OleDbParameter("interprete", OleDbType.VarChar)); sentencia.Parameters.Add(new OleDbParameter("estilo", OleDbType.VarChar)); sentencia.Parameters.Add(new OleDbParameter("precio", OleDbType.Decimal)); sentencia.Parameters["interprete"].Value = txtNombre.Text; sentencia.Parameters["estilo"].Value = txtEstilo.Text; sentencia.Parameters["precio"].Value = Decimal.Parse(txtPrecio.Text); // sentencia.Parameters.Add(new OleDbParameter("interprete // Ejecutamos la sentencia y mostramos el resultado resultado = sentencia.ExecuteNonQuery(); // NOTA: si fuera un INSERT, UPDATE o DELETE se haría así: // int registros = sentencia.ExecuteNonQuery(); // registros serían los reg afectados lblResultado.Text += "Ok insert correcto: "+resultado+"<br />"+consulta+"<br />"; // IMPORTANTE, al final de la consulta hay que cerrar // tanto el datareader como la conexión!!! conexion.Close(); } catch (OleDbException ode) { lblResultado.Text += "Error de OleDb: {0} " + ode + "<br /><b>"+sentencia.CommandText+"</b>"; } } }