Acceso a base de datos

Vamos a crear una base de datos que nos sirva de ejemplo.

ADO.NET

Connection:

...
strConexionPostgreSQL = "SERVER=localhost;"+
  "Database=bd_telefonos; User name=root; Pasword=123";
strConexionSQLServer = "Data Source=.\sqlexpress,"+
  "Initial Calalog=bd_telefonos; Integrated Security=True";
strConexionOLEDB = "Provider=Microsoft.ACE.OLEDB.12.0;"+
  "Data Source=C:./../../db_telefonos.accdb;";
...
string strConexion = strConexionOLEDB;
OleDbConnection conexion = new OleDbConnection(strConexion);
//OdbcConnection, SqlConnection, OracleConnection, ...
...

OleDBCommand ordenSQL = new OleDBCommand("SELECT nombre, telefono FROM TELEFONOS", conexion);
...
// OdbcCommand, SqlCommand, OracleCommand, ... 

conexion.Open(); 
OleDBDataReader lector=ordenSQL.ExecuteReader();
//sino devolviera datos (insert, update o delete)
//ordenSQL.ExecuteNonQuery();
...
while (lector.Read())
  Console.WriteLine(lector.getString(0)+","+lector.getString(1));
lector.Close();
conexion.Close();

Crear una aplicación WPF que compruebe una conexión a una BBDD MySQL




 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using MySql.Data.MySqlClient;

namespace WPFBBDD
{

    public partial class MainWindow : Window
    {
        private MySqlConnection con = null;
        private MySqlCommand OrdenSql;
        private MySqlDataReader Lector;

        public MainWindow()
        { 
            InitializeComponent();
        }

        private void formProbarConexion_Loaded(object sender, RoutedEventArgs e)
        {
            // Creamos la conexión
            string strConexion = "server=127.0.0.1;User Id=prueba;Persist Security Info=True;database=agenda;Password=prueba; Pooling=True; ";
            con = new MySqlConnection(strConexion);

        }

        private void btMostrardatos_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                //Probar abrir conexion
                con.Open();
                tbVersion.Text = "Versión servidor: " + con.ServerVersion;
                tbEstadoConexion.Text = "La conexión está: ";
                tbEstadoConexion.Text += con.State.ToString();
                tbEstadoConexion.Text += "\nSe accede a la base de datos";

                using (con)
                {
                    string Consulta = "SELECT nombre, telefono FROM telefonos ";
                    OrdenSql = new MySqlCommand(Consulta, con);
                    Lector = OrdenSql.ExecuteReader();
                    lsTfnos.Items.Clear();
                    while (Lector.Read()) 
                    {
                        lsTfnos.Items.Add(Lector["nombre"] + "  " + Lector["telefono"]);
                    }
                    Lector.Close();
                }
            }
            catch (MySqlException ex)
            {
                tbEstadoConexion.Text = "Error: " + ex.Message;
            }
            finally
            {
                con.Close();
                tbEstadoConexion.Text += "\nAhora la conexión está: " + con.State.ToString();
           }
        }
    }
}

Servicio de conexiones.

Pool de conexiones. Este servicio mantiene abiertas permanentemente un número de conexiones y son compartidas por las peticiones que llegan a la misma.

string strConexion = "server=127.0.0.1;User Id=prueba;Persist Security Info=True;database=agenda;Password=prueba; Pooling=True; ";

Acceso conectado a Base de Datos

 
  using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using MySql.Data.MySqlClient;

namespace WPFBBDD
{
    /// 
    /// Lógica de interacción para MainWindow.xaml
    /// 
    public partial class MainWindow : Window
    {
        private MySqlConnection con = null;
        private MySqlCommand OrdenSql;
        private MySqlDataReader Lector;

        public MainWindow()
        { 
            InitializeComponent();
        }

        private void formProbarConexion_Loaded(object sender, RoutedEventArgs e)
        {
            // Creamos la conexión
            string strConexion = "server=127.0.0.1;User Id=prueba;Persist Security Info=True;database=agenda;Password=prueba; Pooling=True; ";
            con = new MySqlConnection(strConexion);

        }

        private void btMostrardatos_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                //Probar abrir conexion
                con.Open();
                tbVersion.Text = "Versión servidor: " + con.ServerVersion;
                tbEstadoConexion.Text = "La conexión está: ";
                tbEstadoConexion.Text += con.State.ToString();
                tbEstadoConexion.Text += "\nSe accede a la base de datos";

                using (con)
                {
                    string Consulta = "SELECT nombre, telefono FROM telefonos";
                    OrdenSql = new MySqlCommand(Consulta, con);
                    Lector = OrdenSql.ExecuteReader();
                    while (Lector.Read()) 
                    {
                        lsTfnos.Items.Add(Lector["nombre"] + "  " + Lector["telefono"]);
                    }
                    Lector.Close();
                }
            }
            catch (MySqlException ex)
            {
                tbEstadoConexion.Text = "Error: " + ex.Message;
            }
            finally
            {
                con.Close();
                tbEstadoConexion.Text += "\nAhora la conexión está: " + con.State.ToString();
           }
        }
    }
}

Ataques de inyección de código SQL

...
                using (con)
                {
                    string Consulta = "SELECT nombre, telefono FROM telefonos " +
                        "WHERE telefono like '"+ ctSql.Text +"'";
                    OrdenSql = new MySqlCommand(Consulta, con);
                    Lector = OrdenSql.ExecuteReader();
                    lsTfnos.Items.Clear();
                    while (Lector.Read()) 
                    {
                        lsTfnos.Items.Add(Lector["nombre"] + "  " + Lector["telefono"]);
                    }
                    Lector.Close();
                }
            }
...

Para evitar esto tenemos varias posibilidades:

  • ctSql.Text.Replace(““,”“);
  • Utilizar TextBox.MaxLength para evitar entradas excesivamente largas si no son necesarias.
  • Validar la entrada
  • Utilizar órdenes  parametrizadas.
  • Utilizar procedimientos almacenados.

 

Órdenes parametrizadas

 

string Consulta = "SELECT nombre, telefono FROM telefonos WHERE telefono LIKE @prefijo";
OrdenSql = new SqlCommand(Consulta, ConexionConBD);
OrdenSqlParameters.AddWithValue("@prefijo",ctSql.Text);
...
//Otra forma obsoleta por la ambigüedad con la sobrecarga del Add
OrdenSql.Paramenters.Add("@prefijo", SqlDbType.VarChar);
OrdenSql.Paramenters["@prefijo"].Value = ctSql.text;

 

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.