Programació amb C# .NET - Índice

Página creada Lucas Garzea
 
SEGUIR LEYENDO
Programació amb C# .NET - Índice
Programació amb C# .NET

                           Tema 5 (g): ADO.NET

Jordi Linares i Pellicer

            Índice
               !   Introducción
               !   ¿Qué es ADO.NET?
               !   Clases y Objetos de ADO.NET
               !   Explorador de Servidores
               !   Orígenes de Datos
               !   Interfaz Conectada a Datos
               !   Programar con ADO.NET
Programació amb C# .NET - Índice
Introducción
!   La mayoría de las aplicaciones actuales guardan
    su información en bases de datos por lo que
    necesitan acceder a ellas ya sea de forma local o
    remota.
!   La aparición nuevas tecnologías como ADO.NET y
    los servicios de acceso a datos de .NET
    Framework han simplificado bastante la
    manipulación de bases de datos.
!   Con Visual Studio el acceso a bases de datos
    desde las aplicaciones se convierte en una tarea
    bastante sencilla.

¿Qué es ADO.NET?
!   ADO.NET es un avanzado modelo de Bases de Datos
    para acceder a SGBDR.
!   Es la evolución de ADO (ActiveX Data objects) y
    proporciona una serie de clases para acceder a datos
    actualizadas al entorno .NET
!   Incluye una serie de proveedores que actúan como
    intermediarios entre la base de datos y la aplicación:
           "   SqlClient
           "   OracleClient
           "   OleDB
           "   ODBC
Programació amb C# .NET - Índice
!   Objetivos de diseño de ADO.NET
    "    Acceso simple a datos. A través de clases fáciles de usar
         que representan tablas, filas y columnas de la BD.
    "    Extensibilidad para soporte a diferentes orígenes de datos.
         Esto permite crear nuevos proveedores de datos
         para .NET, p.ej. MySQL.
    "    Soporte para aplicaciones multicapa. Es la arquitectura
         actual de las aplicaciones de negocios y comercio
         electrónico. ADO.NET utiliza XML para la comunicación
         entre capas.
    "    Unificación de XML y Acceso a Datos Relacionales. .NET
         está basado en XML y ADO.NET es el puente entre los
         datos relacionales y la estructura jerárquica de los
         documentos XML.

Clases y Objetos de ADO.NET
!   Clases básicas:

!   Objetos ADO.NET
     "   Las clases de ADO.NET están definidas en el espacio de
         nombres System.Data.
     " Trabaja en modo desconectado: El programa no
       requiere una conexión persistente con la BD.
     " La conexión se abre y se cierra cuando se necesita.
Programació amb C# .NET - Índice
!   Objetos del proveedor
     Todos los objetos llevan el prefijo único del proveedor:
       SqlXxxxxxx, OleDbXXXXXX,….etc:
     "   Connection. Establece la conexión con el origen de datos.
         SqlConnection, OdbcConnection,…
     "   Command. Recupera datos del proveedor. (SELECT *
         FROM…). Ej: SqlCommand, OdbcCommand,
         OleDbCommand,….
     "   CommandBuilder. Permite hacer consultas SQL para
         modificar datos de objetos basados en una sola tabla.
         Ej: SqlCommandBuilder, OdbcCommandBuilder,…
     "   DataReader. Permite recuperar datos de sólo lectura y
         sólo hacia delante de un origen de datos.
         Ej: SqlDataReader, OdbcDataReader, …
     "   DataAdapter. Representa un conjunto de comandos SQL
         y una conexión al origen de datos para rellenar el objeto
         DataSet y actualizar los datos. Ej: SqlDataAdapter,…

Explorador de Servidores
!   La ventana se hace visible desde el
    menú Ver#Explorador de Servidores.

!   Permite abrir conexiones a datos y conectar con
    servidores para explorar sus bases de datos.
!   También permite crear nuevas bases de datos, definir
    tablas, acceder a su contenido, etc.
!   Las conexiones se muestran en el nodo Conexiones
    de datos.
!   Cada conexión representa un nodo que contiene:
    tablas, vistas, procedimientos almacenados, etc.
Programació amb C# .NET - Índice
!   Conexión a una base de datos existente
    "   Desde el nodo Conexiones de Datos podremos conectar
        a una base de datos existente:

!   Creación de una Base de Datos

    1

                                      3

    2
Programació amb C# .NET - Índice
!   Definición de Tablas

                           "   Al cerrar el diseñador se le da nombre
                               a la nueva tabla.
                           "   La tabla creada aparece en el
                               Explorador de servidores.

!   Edición de una tabla
    "   Desde el explorador de servidores podremos efectuar
        sobre la tabla operaciones de inserción, modificación,
        borrado, agrupación, filtrado, etc.

    " Al editar la tabla, se está trabajando directamente con
      SQL Server 2005 que se encargará de almacenar y
      recuperar los datos, cumplir las restricciones, etc.
    " Al cerrar la edición, los cambios son permanentes en la
      BD del servidor.
Programació amb C# .NET - Índice
"   Desde la barra de herramientas Diseñador de consultas
        se pueden diseñar consultas SQL.

Orígenes de Datos
!   Con el Explorador de Servidores se obtienen las
    cadenas de conexión a las bases de datos.
!   Estas cadenas de conexión nos permitirán definir uno
    o más orígenes de datos.
!   Un Origen de datos es un objeto de la aplicación
    que representa un conjunto de datos que residen en
    algún lugar (normalmente SGBDR).
!   Los orígenes de datos facilitan el acceso y edición de
    los datos que la aplicación necesita.
!   Mostrar la ventana orígenes de datos:
       Datos#Mostrar Orígenes de datos.
Programació amb C# .NET - Índice
!   Definición de un origen de datos
Programació amb C# .NET - Índice
"   Como resultado final se crea el conjunto de datos y se
     añade al proyecto:
      !   Un esquema XSD con su estructura
      !   Un módulo con la clase derivada de DataSet

"   Durante el diseño, el fichero app.config contiene la
    configuración para la cadena de conexión a la BD:

"   Al compilar el proyecto se genera un fichero:
    .exe.config que guarda la
    configuración de la cadena de conexión para la ejecución.
    Se puede modificar para actualizar la ruta a la BD.
Programació amb C# .NET - Índice
!   El diseñador de conjuntos de datos
    "   El conjunto de datos es dinámico y durante el desarrollo
        de la aplicación pueden volverse a configurar desde:
         !   Configurar DataSet con el asistente… o
         !   Editar DataSet con el diseñador.

    "   El Adaptador de datos actúa como intermediario entre
        el SGBDR y el DataSet.

!   Asociar elementos de interfaz a tablas y columnas
    "   Desde orígenes de datos se puede configurar el control a
        emplear en el formulario para cada tipo de columna.
        NOTA: El formulario debe estar abierto en el diseñador para que las
        listas desplegables aparezcan.

     Asociaciones
     para la tabla

                       Asociaciones para
                           las columnas
Interfaz Conectada a Datos
!   Los datos conectados se pueden mostrar en el formulario:
    " En una Cuadrícula mediante el uso del control
      DataGridView, o
    " Vista detalle mediante el uso de controles: Label, TextBox,
      ListaBox, etc.
!   Desde la ventana Orígenes de datos se puede arrastrar
    al formulario la tabla entera o por columnas.
!   El Diseñador se encarga de establecer la propiedad
    DataBindings de cada control de forma adecuada.
!   Si los controles se insertan directamente desde el Cuadro
    de herramientas se ha de establecer la propiedad
    DataBindings de forma manual.

                                                     Cuadrícula
                                                     (DataGrid)

                             Vista Detalle

Modo diseño
                             Ejecución
Programar con ADO.NET
     !       Leer datos con DataReader
 . . .
Using System.Data;
Using System.Data.SqlClient;

public partial class Form1 : Form
{
        private SqlConnection maConnexio;

         public Form1()
         {
             InitializeComponent();

         }

         private void Form1_Load(object sender, EventArgs e)
         {
             // Cadena de connexió
             maConnexio = new SqlConnection(@"Data Source=.\SQLEXPRESS;
                              AttachDbFilename=C:\Archivos de programa\Microsoft SQL
                              Server\MSSQL.1\MSSQL\Data\northwnd.mdf;
                              Integrated Security=True;Connect Timeout=30;
                              User Instance=True");
         }

         private void butLlistarClients_Click(object sender, EventArgs e)

         {
                   // Obrir la connexió
                   maConnexio.Open();
                   // Crear el command
                   SqlCommand maCommand = maConnexio.CreateCommand();
                   // Especificar la consulta SQL per al Command
                   maCommand.CommandText = "SELECT CustomerID, ContactName, CompanyName
                                            from Customers";
                   // Executar el DataReader per al command
                   SqlDataReader maReader = maCommand.ExecuteReader();
                   this.textBoxClients.Clear();
                   // Llegir les files
                   while (maReader.Read())
                   {
                       // mostrar les files en el textbox
                       this.textBoxClients.Text += maReader["CustomerID"].ToString() +
                                     "\t\t" + maReader["ContactName"].ToString() +
                                               "\t\t"+ maReader["CompanyName"].ToString() +
         "\r\n";
                       this.textBoxClients.Refresh();
                   }
                   // Tancar reader
                   maReader.Close();
                   // Tancar la connexió
                   maConnexio.Close();
         }
    }
!   Actualizar datos con DataSet
    "   La actualización de datos se realiza con el objeto DataSet.

    "   Cada DataSet contiene un conjunto de objetos DataTable.

    "   Cada DataTable contiene objetos DataRow y DataColumn.
        que representan las filas y columnas de la tabla de la BD.

    "   Las tablas, filas y columnas del DataSet se pueden
        acceder por su índice o por su nombre:

        Ejemplo:
           maDataSet.Tables["Customers"].Rows[n]

    "   El DataSet se llena con el método Fill() de un objeto
        DataAdapter.

    "   La estructura para acceder a tablas, filas y columnas
        en el DataSet es la siguiente:
"   Ejemplo:
public partial class Form1 : Form
   {
       private SqlConnection maConnexio;
       private SqlDataAdapter maAdapter;
       private DataSet maDataSet;
       private void Form1_Load(object sender, EventArgs e)
       {
            // Cadena de connexió
            maConnexio = new SqlConnection(@"Data Source=.\SQLEXPRESS;
                                 AttachDbFilename=C:\Archivos de programa\Microsoft SQL
                                 Server\MSSQL.1\MSSQL\Data\northwnd.mdf;
                                 Integrated Security=True;Connect Timeout=30;
                                 User Instance=True");
            //   Crear el DataAdapter per actualitzar les dades
            maAdapter = new SqlDataAdapter("SELECT CustomerID, CompanyName FROM Customers",
                                           maConnexio);
            // Crear el DataSet que contindrà taules, files i columnes
            maDataSet = new DataSet();
            // Omplir el DataSet usant la consulta prèviament definida en el DataAdapter
            maAdapter.Fill(maDataSet, "Clients");
            // Omplir la llista amb els noms del clients
            OmplirLlista();
       }

  private void OmplirLlista()
  {
         listBoxClients.Items.Clear();
         for(int i=0; i=0) {
             textBoxNom.Text = (listBoxClients.SelectedItem).ToString();
             textBoxNom.Focus();
           }
  }
  private void btActualitzarNom_Click(object sender, EventArgs e)
  {
         if (textBoxNom.Text != "") {
             listBoxClients.Items[listBoxClients.SelectedIndex] = textBoxNom.Text;
             maDataSet.Tables[0].Rows[listBoxClients.SelectedIndex]["CompanyName"] =
                                                                           textBoxNom.Text;
             // actualitzar la BD
             maAdapter.Update(maDataSet, "Clients");
             MessageBox.Show("BD Actualitzada");
             textBoxNom.Clear();
         }
  }
  private void btLlistarClients_Click(object sender, EventArgs e)
  {
        OmplirLlista();
  }
!   Relacionar tablas en el DataSet
    " Cada DataSet contiene la propiedad Relations que es
      una colección de objetos DataRelation que representan
      las relaciones entre las tablas del DataSet.
    " Ejemplo: Customers i Orders de la BD NorthWind

    "   Para crear una relación entre dos tablas usar el método
        Add(, , ).
         !   Ejemplo:
             DataRelation custOrderRel=
              thisDataSet.Relations.Add("CustOrders",
              thisDataSet.Tables["Customers"].Columns["CustomerID"],
              thisDataSet.Tables["Orders"].Columns["CustomerID"]);

    "   El método GetChildRows()
        obtiene las filas hijas a partir de una fila de la tabla padre.
         !   Ejemplo:
               customerRow.GetChildRows(custOrderRel);
public partial class ClientsOrdres : Form
{
        private SqlConnection maConnexio;
        private DataSet maDataSet;
        private SqlDataAdapter clientsAdapter;
        private SqlDataAdapter ordresAdapter;
        private DataRelation ClientOrdreRel;

    private void Form1_Load(object sender, EventArgs e)
        {
            // Cadena de connexió
            maConnexio = new SqlConnection(@"Data Source=.\SQLEXPRESS;
                        AttachDbFilename=C:\Archivos de programa\Microsoft SQL
                                  Server\MSSQL.1\MSSQL\northwnd.mdf;
                        Integrated Security=True;Connect Timeout=30; User Instance=True");
            maDataSet = new DataSet();
            // DataAdapters
            clientsAdapter = new SqlDataAdapter("SELECT * FROM Customers", maConnexio);
            clientsAdapter.Fill(maDataSet, "Clients");
            ordresAdapter = new SqlDataAdapter("SELECT * FROM Orders", maConnexio);
            ordresAdapter.Fill(maDataSet, "Ordres");
            //Relació
            ClientOrdreRel = maDataSet.Relations.Add("ClientsOrdres",
                                           maDataSet.Tables["Clients"].Columns["CustomerID"],
                                           maDataSet.Tables["Ordres"].Columns["CustomerID"]);
            //carregar els clients al combobox de clients
            OmplirComboClients();
            //mostrar les ordres del primer client
            DataRow RowClient = maDataSet.Tables["Clients"].Rows[0];
            MostrarOrdresClient(RowClient);
        }

    private void OmplirComboClients()
    {
          comboBoxClientes.Items.Clear();
          foreach (DataRow d in maDataSet.Tables["Clients"].Rows)
             comboBoxClientes.Items.Add(d["CompanyName"] + " - " + d["CustomerID"]);
          comboBoxClientes.SelectedIndex = 0;
    }

    private void MostrarOrdresClient(DataRow RowClient)
    {
        listBoxOrdenes.Items.Clear();
        foreach (DataRow d in RowClient.GetChildRows(ClientOrdreRel))
        {
            DateTime fecha = System.Convert.ToDateTime(d["OrderDate"]);
            listBoxOrdenes.Items.Add(d["OrderID"] + " - " + d["CustomerID"] + " - " +
                                    d["EmployeeID"] + " - " +
                                    fecha.ToShortDateString() + " - " +
                                    d["ShipVia"] + " - " + d["ShipCity"] + " - " +
                                    d["ShipCountry"]);
          }
    }

    private void comboBoxClientes_SelectedIndexChanged(object sender, EventArgs e)
    {
        DataRow RowClient =

        maDataSet.Tables["Clients"].Rows[comboBoxClientes.SelectedIndex];
        MostrarOrdresClient(RowClient);
    }
}
Creación de una BBDD con MySQL
!   Crear un nuevo usuario
!   Crear una nueva tabla (asociada a un esquema)
!   Crear campos e insertar información
!   Dar permisos al usuario creado sobre la tabla creada

Creación de una BBDD con MySQL
!   Crear un nuevo usuario:
Creación de una BBDD con MySQL
!   Creando la tabla ‘cliente’:

Creación de una BBDD con MySQL
!   Insertando algunas filas:
Creación de una BBDD con MySQL
!   Insertando algunas filas:

Creación de una BBDD con MySQL
!   Asignando permisos de acceso a la tabla al usuario ‘prova’:
Creación de una BBDD con MySQL
        !    Creando una aplicación e insertando el componente MySQL:

        Creación de una BBDD con MySQL
using   System;
using   System.Collections.Generic;
using   System.Linq;
using   System.Text;
using   System.Data;
using   MySql.Data.MySqlClient;
using   MySql.Data.Types;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            MySqlConnection maConexio = null;
            MySqlDataAdapter maAdapter;
            DataSet maDataSet;

              // Formem la cadena de conexió
              string cadenaconexio = "SERVER=127.0.0.1; PORT=3306; USER=prova; PASSWORD=prova; DATABASE=test;";

              // Creem la conexió
              try
              {
                  maConexio = new MySqlConnection(cadenaconexio);
              }
              catch (Exception e)
              {
                  Console.WriteLine("Hi ha algún problema en la conexió amb la base de dades:\n" + e.Message);
              }

              string select = "SELECT * FROM client";

              maAdapter = new MySqlDataAdapter(select, maConexio);
              maDataSet = new DataSet();
              maAdapter.Fill(maDataSet, "client");

              // Llistat de clients
              int numclients = maDataSet.Tables["client"].Rows.Count;

              for (int i = 0; i < numclients; i++)
                  Console.WriteLine("Nombre: " + maDataSet.Tables["client"].Rows[i]["Nombre"] + " " +
                                    "Dirección: " + maDataSet.Tables["client"].Rows[i]["Direccion"]);
         }
    }
}
Creación de una BBDD con MySQL

MySqlConnection maConexio = null;
MySqlDataAdapter maAdapter;
DataSet maDataSet;

// Formem la cadena de conexió
string cadenaconexio = "SERVER=127.0.0.1; PORT=3306; USER=prova; PASSWORD=prova; DATABASE=test;";

// Creem la conexió
try
{
    maConexio = new MySqlConnection(cadenaconexio);
}
catch (Exception e)
{
    Console.WriteLine("Hi ha algún problema en la conexió amb la base de dades:\n" + e.Message);
}

string select = "SELECT * FROM client";

maAdapter = new MySqlDataAdapter(select, maConexio);
maDataSet = new DataSet();
maAdapter.Fill(maDataSet, "client");

// Llistat de clients
int numclients = maDataSet.Tables["client"].Rows.Count;

for (int i = 0; i < numclients; i++)
    Console.WriteLine("Nombre: " + maDataSet.Tables["client"].Rows[i]["Nombre"] + " " +
                      "Dirección: " + maDataSet.Tables["client"].Rows[i]["Direccion"]);

   Creación de una BBDD con MySQL
   !   Resultado de la ejecución:
También puede leer