Tema ADO

  • Upload
    carmelo

  • View
    220

  • Download
    0

Embed Size (px)

Citation preview

  • 8/8/2019 Tema ADO

    1/10

    Tema ADO.NET

    Hay aplicaciones en donde usamos controles DataSource.

    En estos controles no es preciso un conocimiento exhaustivo de bases de

    datos, pero no podremos realizar acciones ms complejas.

    Necesitamos entonces, para aplicaciones comerciales, un modelo de objetos

    ADO.NET que nos permiten comprender mejor el funcionamiento de datos y

    realizar tareas ms avanzadas.

    Objetos ADO.NET

    Objetivo ADO.net = puente entre objetos .net y base de datos

    Los objetos ADO.NET encapsulan y ocultan detalles del acceso a la base de

    datos (cmo se transportan los datos)

    Clase DataSetLa clase clave es DataSet (en el espacio de nombres System.Data)

    El conjunto de datos representa un subconjunto de toda la base de datos,

    guardado en el estado de sesin o en memoria cach, sin una conexin

    continua con la base de datos.

    Se conecta temporalmente con la base de datos para actualizar.

  • 8/8/2019 Tema ADO

    2/10

    Este conjunto de datos est formado por objetos DataTable y DataRelation

    (no solo tablas, tb relaciones, vistas).

    Podemos acceder a ellos con propiedades Tables y Relations del objeto

    DataSet. (tb tiene otros mtodos y propiedades).

    La clase DataTable devuelve una coleccin DataTableCollection que

    contiene todos los objetos DataTable del conjunto de datos.

    DataTable tabla1= miDataSet.Tables[0];

    Este objeto DataTable tambin tiene propiedades para devolver las

    columnas, vistas y mtodos.

    La clase DataRow nos devuelve un conjunto de filas de una determinada

    tabla. Con esta coleccin examinamos el resultado de consultas a la base de

    datos.

    DbCommand y DbConnectionEl objeto DbConeection representa una conexin a un origen de datos.

    Esta conexin puede compartirse entre varios objetos comando.

    El objeto DbCommand nos permite enviar un comando (instruccin SQL) a la

    base de datos.

    Objeto DataAdapterSe utiliza para mediar entre DataSet y la base de datos. Disocia conjunto de

    datos de base de datos.

    Esto permite que un solo conjunto de datos represente a ms de una base

    de datos.

    .NET ofrece diferentes versiones del objeto DataAdapter para usarlo con

    diferentes proveedores de datos (uno para Sql Server, otro para Ole DB

    como access)

    Si nos conectamos a una base de datos Sql Server o SqlExpress

    incrementamos el rendimiento de nuestra aplicacin usando

    SqlDataAdapter (de System.Data.SqlClient) junto con SqlCommand y

    SqlConnection.

    La clase DataAdapter nos da mtodos y propiedades para controlar el

    comportamiento del objeto de control de datos. (mtodos como Fill,

    Update)

    Objeto DataReaderEs una alternativa al conjunto de datos.

  • 8/8/2019 Tema ADO

    3/10

    Ofrece acceso slo conectado a la base de datos.

    Este objeto es ligero, ideal para rellenar una pgina con datos de lectura.

    Tiene propiedades como FieldCount y HasRows para obtener informacin de

    los datos.

    Tb nos ofrece mtodos para extraer datos a medida que se van recorriendo

    como GetBytes, GetData, GetName

    Ejemplo ADO.NET

    En una pgina arrastramos un GridView y NO lo conectamos a un origen de

    datos con el asistente.

    En el fichero de cdigo oculto:

    Creamos el DataSet

    Asignamos una de sus tablas a la propiedad DataSource del GridView

    Los pasos sera:

    1. No olvidemos aadir using System.Data.SqlClient

    2. Implementamos el mtodo Page_Load para obtener la tabla Cleintes

    de la base de datos NorthWindw y vincularla a nuestro GridView.

    3. Creamos una cadena de conexin y una cadena de comando

    4. Pasamos las cadenas al constructor del SqlDataAdapter

    5. Creamos una instancia del DataSet

    6. Pedimos al DataAdapter que rellene el DataSet

    7. Extraemos la tabla del DataSet

    8. Vinculamos el GridView a esa tabla

    Solucinprotectedvoid Page_Load(object sender, EventArgs e)

    {

    //Creamos una cadena de conexin y una cadena de comando

    string connectionString = "Data Source=SONY290;Initial

    Catalog=Northwind;Persist Security Info=True;UserID=sa;Password=stersol";

    string commandString ="Select * from Customers";

  • 8/8/2019 Tema ADO

    4/10

    //Pasamos las cadenas al constructor del SqlDataAdapter

    SqlDataAdapter dataAdapter = newSqlDataAdapter(commandString,

    connectionString);

    // Crea la instancia del DataSetDataSet dataSet = newDataSet();

    // Rellena el objeto DataSetdataAdapter.Fill(dataSet, "Customers");

    // Extrae la tabla del DataSetDataTable dataTable = dataSet.Tables["Customers"];

    // Vincula el GridView a la tablaGridView1.DataSource = dataTable;GridView1.DataBind();

    }

    Usando DataReaderPara recuperar un conjunto de registros y mostrarlos podemos ganar

    eficienca con un objeto SqlDataReader

    Los DataReaders son limitados comparados con los conjuntos de datos

    (dataAdapter) pq solo ofrecen un conjunto de resultados predeterminados.

    Hacemos el caso anterior con DataReader.

    Solucinprotectedvoid Page_Load(object sender, EventArgs e)

    {// crea la cadena de comando y de conexinstring connectionString =

    "Data Source=SONY290;InitialCatalog=Northwind;Persist Security Info=True;UserID=sa;Password=stersol";

    string commandString = "Select * from Customers";

    // crea el objeto conexionSqlConnection conn = newSqlConnection(connectionString);

    // crea el ojbeto comandoSqlCommand command = newSqlCommand(commandString);

    // abre la conexintry{

    // open the connectionconn.Open();

    // enlaza la conexin al objeto commando

    command.Connection = conn;

  • 8/8/2019 Tema ADO

    5/10

    // obtiene el lector de datosSqlDataReader reader =

    command.ExecuteReader(CommandBehavior.CloseConnection);

    // vincula al lector de datos

    GridView1.DataSource = reader;GridView1.DataBind();

    }finally{

    conn.Close(); // se asegura de cerrar la conexin}

    }

    Las transacciones de base de datos son recursos limitados y es importante

    asegurar que cerramos la conexin.

    Los data Reader tienen limitaciones como que no se desconectan.

    Relaciones de datos en DataSetsDataSet funciona como un modelo desconectado de la base de datos y debe

    poder representar tablas y relaciones entre las tablas.

    DataSet captura las relaciones en DataRelationCollection y representan las

    relaciones entre las tablas con la propiedad Relations.

    Cada DataRelation relaciona un par de objetos DataTable entre s conobjetos DataColumn. En la relacin coinciden las columnas de ambas tablas

    por su clave principal.

    Podemos ver un ejemplo en donde capturamos relaciones de nuestra base

    de datos.

    Creamos un primer objeto DataRelation que define la relacin entre la tabla

    Orders y Orders Details con el campo OrderID.

    La segunda relacin ser entre la tabla Order Details y Products mediante

    ProductID.

    Necesitaremos tres GridView.

    La primera representar los pedidos y mostrar cinco pedidos cada vez con

    un botn para seleccionar un pedido determinado.

    (autogenerateColumns en false, allowPaging true en pagesize 5, y en

    columns

    buttonField de type button y command select y orderid, order date,

    companyname, contacttitle y phone.

    Creamos las columnas con editar columnas.

  • 8/8/2019 Tema ADO

    6/10

    Segunda rejilla.

    Estar en un Panel para poder ocultar y mostrar a nuestro gusto.

    Tampoco se autogeneran las columnas y ponemos orderdate, productname,

    unitprice y quantity de la tabla.

    Tercera rejilla

    Muestra las relaciones del conjunto de datos

    Por ahora sin nada.

    El archivo de cdigo oculto ser:

    NecesitamosUsing System.Text para construir cadenas de texto

    Using System.Data.SqlClient para usar dataAdapter

    Fichero cdigo oculto

    using System;using System.Data;using System.Configuration;

    using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Text; // necesrio para StringBuilderusing System.Data.SqlClient; // necesario DataAdater

    publicpartialclassDefault_aspx : System.Web.UI.Page{ protectedvoid Page_Load(object sender, EventArgs e)

    {

    DataSet ds = CreateDataSet();

    la clave es el mtodo CreateDataSet. Crea un conjunto de datos contres tablas y dos conjuntos de relaciones. Se crea y se abre unaconexin a la base de datos Northwind

    GridView1.DataSource = ds.Tables[0];GridView1.DataBind();

    // crea la vista de daots y vincula con la rejilla details

    DataView detailsView = newDataView(ds.Tables[1]);DetailsGridView.DataSource = detailsView;

    Session["DetailsView"] = detailsView;DetailsGridView.DataBind();

  • 8/8/2019 Tema ADO

    7/10

    //vincula la rejilla relations con la conleccin relationsOrderRelationsGridView.DataSource = ds.Relations;OrderRelationsGridView.DataBind();

    }

    privateDataSet CreateDataSet(){// connection string to connect to the Orders Databasestring connectionString ="Data Source=SONY290;Initial Catalog=Northwind;Persist

    Security Info=True;User ID=sa;Password=stersol";

    // Create connection object, initialize with// connection string and open the connectionSystem.Data.SqlClient.SqlConnection connection =

    newSystem.Data.SqlClient.SqlConnection(connectionString);

    connection.Open();

    // Create a SqlCommand object and assign the connectionSystem.Data.SqlClient.SqlCommand command =

    new System.Data.SqlClient.SqlCommand();command.Connection = connection;

    StringBuilder s = newStringBuilder("select OrderID, c.CompanyName,

    c.ContactName, ");s.Append(" c.ContactTitle, c.Phone, orderDate");s.Append(" from orders o ");s.Append("join customers c on c.CustomerID =

    o.CustomerID");

    // set the command text to the select statementcommand.CommandText = s.ToString();

    // create a data adapter and assign the command object// and add the table mapping for bugsSqlDataAdapter dataAdapter = newSqlDataAdapter();dataAdapter.SelectCommand = command;dataAdapter.TableMappings.Add( "Table", "Orders");

    // Create the dataset and use the data adapter to fill itDataSet dataSet = newDataSet();dataAdapter.Fill(dataSet);

    // create a second command object for the order detailsSystem.Data.SqlClient.SqlCommand command2 =

    new System.Data.SqlClient.SqlCommand();command2.Connection = connection;

    // This time be sure to add a column for Severity so thatyou can

    // create a relation to ProductsStringBuilder s2 =

    newStringBuilder("Select od.OrderID, OrderDate, p.ProductID, ");

    s2.Append(" ProductName, od.UnitPrice, Quantity ");s2.Append("from Orders o ");

    s2.Append("join [Order Details] od on o.orderid =od.orderid ");

  • 8/8/2019 Tema ADO

    8/10

    s2.Append("join products p on p.productID = od.productid");

    command2.CommandText = s2.ToString();

    // create a second data adapter and

    // add the command and map the table// then fill the dataset from this second adapterSqlDataAdapter dataAdapter2 = newSqlDataAdapter();dataAdapter2.SelectCommand = command2;dataAdapter2.TableMappings.Add("Table", "Order Details");dataAdapter2.Fill(dataSet);

    // create a third command object for the Products tableSystem.Data.SqlClient.SqlCommand command3 =

    new System.Data.SqlClient.SqlCommand();command3.Connection = connection;

    string strCommand3 = "Select ProductID, ProductName from

    Products"; command3.CommandText = strCommand3;

    // create a third data adapter// and add the command and map the table// then fill the dataset from this second adapterSqlDataAdapter dataAdapter3 = newSqlDataAdapter();dataAdapter3.SelectCommand = command3;dataAdapter3.TableMappings.Add("Table", "Products");dataAdapter3.Fill(dataSet);

    // declare the DataRelation and DataColumn objectsSystem.Data.DataRelation dataRelation;System.Data.DataColumn dataColumn1;System.Data.DataColumn dataColumn2;

    // set the dataColumns to create the relationship// between Orders and Order Details on the OrderID keydataColumn1 =

    dataSet.Tables["Orders"].Columns["OrderID"];dataColumn2 =

    dataSet.Tables["Order Details"].Columns["OrderID"];

    dataRelation =new System.Data.DataRelation("OrdersToDetails",dataColumn1,dataColumn2);

    // add the new DataRelation to the datasetdataSet.Relations.Add(dataRelation);

    // reuse the DataColumns and DataRelation objects// to create the relation between Order Details and

    ProductsdataColumn1 =

    dataSet.Tables["Products"].Columns["ProductID"];dataColumn2 = dataSet.Tables["Order

    Details"].Columns["ProductID"];

    dataRelation =new System.Data.DataRelation(

  • 8/8/2019 Tema ADO

    9/10

    "ProductIDToName",dataColumn1,dataColumn2);

    // add the HistoryToSeverity relationship to the datasetdataSet.Relations.Add(dataRelation);

    return dataSet;} // end createDataSet

    publicvoid OnSelectedIndexChangedHandler(Object sender, EventArgs e){

    UpdateDetailsGrid();}

    privatevoid UpdateDetailsGrid(){

    int index = GridView1.SelectedIndex;if (index != -1){

    // get the order id from the data gridDataKey key = GridView1.DataKeys[index];int orderID = (int)key.Value;DataView detailsView =

    (DataView)Session["detailsView"];detailsView.RowFilter = "OrderID = " + orderID;DetailsGridView.DataSource = detailsView;DetailsGridView.DataBind();OrderDetailsPanel.Visible = true;

    }else{

    OrderDetailsPanel.Visible = false;}

    }

    }

    Aadir datos a manoVamos a rellenar un conjunto de datos o una tabla a mano.

    Recoger datos de un usuario y guardarlos en una base de datos.

    El conjunto de datos es un buen sistema para transportar datos.

    Podramos crear todo, la base de datos, tablas, relaciones con cdigo.

    Ejemplo BugTrackerbyhand

    Nosotros queremos crear una base de datos con una tabla para guardar los

    datos de nuestros clientes interesados.

    Diseamos esta aplicacin con validacin y comprueba que los datos segraban correctamente.

  • 8/8/2019 Tema ADO

    10/10