Conceptos de ADO.NET

 

DataSet, DataTable y Data Providers

Yhoan Galeano


A tener en cuenta...

  • Sql Server
  • ADO.NET

Bases de datos

  • Relacionales
  • No relacionales
  • Windows OS
  • Soporte de Transacciones
  • T-SQL
  • Business Intelligence

Versiones

  • Enterprise
  • Developer
  • Standard
  • Express
  • SQL Azure

Objetos

  • Tablas(Permanentes y Temporales)
  • Procedimientos Almacenados
  • Funciones
  • Vistas
  • Usuarios
  • Roles
  • Seguridad
  • Entre otros...

T-SQL

Transact SQL

Query

select * from tu_tabla
where tu_campo = tu_valor

Tablas

CREATE TABLE Clientes(
    Nombre VARCHAR (20), 
    Apellido VARCHAR (20), 
    FechaNacimiento DATETIME
);

Procedimientos Almacenados

CREATE PROCEDURE tuProcedimiento 
@param1 nvarchar(30) = NULL,
@param2 nvarchar(60) = NULL
AS
select * from tu_tabla
where tu_campo = @param1 
GO
exec tuProcedimiento 'valor1','valor2'

Vistas

CREATE VIEW tuVista
AS
SELECT * FROM tu_tabla;
SELECT * FROM tuVista;

Funciones

CREATE FUNCTION tuFuncion(@param1 VARCHAR(250))
RETURNS VARCHAR(250)
AS BEGIN
    DECLARE @var1 VARCHAR(250)
    SET @var1 = @param1 
    SET @var1 = REPLACE(@var1 , 'www.', '')
    SET @var1 = REPLACE(@var1 , '.com', '')
    RETURN @var1 
END
SELECT * FROM tuFuncion('hola') 

Sql Server Management Studio

Desbloquear SA

ALTER LOGIN sa ENABLE ;
GO
ALTER LOGIN sa WITH PASSWORD = 'tucontraseña' ;
GO

ADO.NET

ADO .NET responde a las siglas de Microsoft ActiveX Data Objects de la plataforma .NET, y  es una mejora evolutiva de la tecnología ADO. Realmente es una evolución más en las tecnologías de acceso a la información.

 

Es un conjunto de componentes del software que pueden ser usados por los programadores para acceder a datos y a servicios de datos. Es una parte de la biblioteca de clases base que están incluidas en el Microsoft .NET Framework.

ADO.NET

Access Data Object

  • Bases de datos relacionales
  • .NET Framework 
  • Datasets
  • XML(Extensible Markup Language)
  • LinQ (Language-Integrated Query)...Cooming Soon :)
  • Entity Framework
  • Data.SqlClient

¿Que namespaces debemos usar?

Debemos usar la instrucción using(c#) para importar los siguientes namespaces:

  •   System.Data *
  •   System.SqlClient  *
  •   System.OleDB (MsAccess)
  •   System.ODBC  (otros)
  •   System.OrcaleClient (para Oracle)

 

Nosotros trabajaremos con los dos primeros namespace.

¿Que es un DataTable?

Es uno de los objetos centrales de la biblioteca ADO.NET. Su esquema esta definido por la clase  DataColumnCollection.

 

Por medio de sus eventos podemos controlar los diferentes estados de los registros que se encuentran allí almacenados, porque esto funciona como una tabla de la base de datos. Tengamos en cuenta que este objeto desconoce su origen de datos, por lo que funciona como una entidad independiente.

¿Que es un DataTable?

Las clases que debemos usar para trabajar con los DataTables son:

  • System.Data.DataTable
  • System.Data.DataRow
  • System.Data.DataColumn

Algunos miembros del DataTable

.NewRow: Devuelve un objeto DataRow vació con el esquema del DataTable.

 

.Rows: Colección de Rows contenidos dentro del DataTable.

 

.Select: Método del cual podemos por medio de expresiones realizar consultas sobre los DataRows cargados.

Algunos miembros del DataTable

.Columns: Colección de objetos DataColumn

 

  • .Add: Insertamos un Objeto DataColumn o bien indicamos el nombre y el tipo 

 

  • .Remove: Eliminamos un objeto DataColumn del DataTable

Ejercicio

¿Que es un DataSet?

El DataSet de ADO.NET es una representación de datos residente en memoria que proporciona un modelo de programación relacional coherente independientemente del origen de datos que contiene.

 

Un DataSet representa un conjunto completo de datos, incluyendo las tablas que contienen, ordenan y restringen los datos, así como las relaciones entre las tablas (Colección de objetos DataTables). Puede mantener la integridad entre los DataTables por medio del objeto DataRelation.

¿Que es un DataSet?

Las clases que debemos usar son:

 

  • System.Data.DataSet
  • System.Data.DataRelation

¿Que es un DataSet?

¿Que es un DataSet?

Ejercicio

Objetos

ADO.NET

  • Connection String
  • SqlConnection
  • SqlCommand
  • SqlDataReader
  • SqlParameter
  • SqlDataAdapter

¿Que es .NET Data Provider?

El .NET Data Provider es  el proveedor de datos de la plataforma .NET que permite conectar a un origen de datos con  una aplicación para recuperar y modificar información. También este proveedor sirve de  puente entre el origen de datos y el objeto más importante de ADO.NET, el DataSet.

 

Para utilizar los proveedores de acceso a datos de .NET debe utilizarse el namespace correspondiente: 

System.Data.SqlClient para SQL Server 7.0 o Superior 

System.Data.OleDb para proveedores OLE DB

¿Que es .NET Data Provider?

El .NET Data Provider es  el proveedor de datos de la plataforma .NET que permite conectar a un origen de datos con  una aplicación para recuperar y modificar información. También este proveedor sirve de  puente entre el origen de datos y el objeto más importante de ADO.NET, el DataSet.

 

Para utilizar los proveedores de acceso a datos de .NET debe utilizarse el namespace correspondiente: 

System.Data.SqlClient para SQL Server 7.0 o Superior 

System.Data.OleDb para proveedores OLE DB

Connection String

Data Source=myServerAddress;Initial Catalog=myDataBase;Integrated Security=SSPI;
User ID=myDomain\myUsername;Password=myPassword;

SqlConnection

El objeto SqlConnection se encarga de la parte de la comunicación física entre la aplicación y la base de datos SQL Server. Una instancia de la clase SqlConnection toma la cadena de conexión como argumento.

 

Cuando se establece la conexión, los comandos SQL se puede ejecutar, con la ayuda del objeto de conexión, para recuperar o manipular los datos en la base de datos. Una vez que las actividades de base de datos terminen la conexión se debe cerrar y liberar los recursos de base de datos.

using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
	//
	// 
	//
	string connectionString = "Data Source=myServerAddress;Initial Catalog=myDataBase;Integrated Security=SSPI; User ID=myDomain\myUsername;Password=myPassword;";
	//
	//
	using (SqlConnection con = new SqlConnection(connectionString))
	{
	    //
	    // Open SqlConnection.
	    //
	    con.Open();
	}
    }
}

Cadena de conexión en web.config

Trabajando con el appSettings, ponemos lo siguiente en el web.config y en nuestra clase de conexión

<appSettings>
    <add key="myConnectionString" value="server=localhost;database=myDb;
    uid=myUser;password=myPass;" />
</appSettings>

y en nuestra clase de conexión

string connStr = ConfigurationSettings.AppSettings("myConnectionString");

Cadena de conexión en web.config

Trabajando con el connectionStrings, ponemos lo siguiente en el web.config

<connectionStrings>
    <add name="myConnectionString" connectionString="server=localhost;database=myDb;
    uid=myUser;password=myPass;" />
</connectionStrings>

y en nuestra clase de conexión

string connStr = 
ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;

La clase Command

Un objeto Command básicamente formula una petición y se la envía al origen de datos. Si esa petición devuelve datos, el objeto Command se encarga de empaquetarlos y devolverlos como  un objeto DataReader, un valor escalar o como los parámetros de salida utilizados en el  propio comando.

 

Existen dos propiedades muy importantes de la clase Command: 

CommandType.Text. Indica que la propiedad CommandText es un texto plano.  Por ejemplo: 

using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        String strConexion = “SERVER=(local); uid=sa; pwd=sa; database=Northwind”; 

        using(SqlConnection ObjCnn = new SqlConnection(strConexion)){
            
            ObjCnn.Open();
            
            String strSQL = ”SELECT * FROM Employees”;
            SqlCommand ObjCmd = new SqlCommand(strSQL, ObjCnn); 
            // La línea siguiente no es necesaria porque Text es el 
            // valor por defecto 
            ObjCmd.CommandType = CommandType.Text;

        }
    }
}

CommandType.StoredProcedure. Representa que la propiedad CommandText es el nombre de un procedimiento almacenado. Por ejemplo:

using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        String strConexion = “SERVER=(local); uid=sa; pwd=sa; database=Northwind”; 

        using(SqlConnection ObjCnn = new SqlConnection(strConexion)){
            
            ObjCnn.Open();
            
            String strSP = ”CustOrdersDetail”; 
            
            SqlCommand ObjCmd = new SqlCommand(strSP, ObjCnn); 
            
            ObjCmd.ComamndType = CommandType.StoredProcedure;

        }
    }
}

Se necesita que haya una conexión válida abierta y dependiendo del comportamiento que se desee dar al objeto Command se utilizará uno de los siguientes:

 

ExecuteNonQuery: No devuelve un conjunto de registros sino que devuelve el número  de filas afectadas por la acción. 

 

ExecuteReader: Devuelve un conjunto de registros de sólo lectura y “forward-only”.  No se informa del número de filas afectadas.

 

ExecuteScalar: Devuelve sólo el valor de la celda (0,0) del conjunto de registros.

Para ejecutar un comando

using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        String strConexion = “SERVER=(local); uid=sa; pwd=sa; database=Northwind”; 

        using(SqlConnection ObjCnn = new SqlConnection(strConexion)){
            
            ObjCnn.Open();
            String strSQL = ”UPDATE Employees SET lastname=’Alvaro’ WHERE EmployeeID=2”; 
            
            SqlCommand ObjCmd = new SqlCommand(strSQL, ObjCnn); 
            
            ObjCmd.ExecuteNonQuery();

        }
    }
}

ExecuteNonQuery

using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        String strConexion = “SERVER=(local); uid=sa; pwd=sa; database=Northwind”; 

        using(SqlConnection ObjCnn = new SqlConnection(strConexion)){
            
            ObjCnn.Open();
            String strSQL = ”SELECT * FROM Employees”; 
            SqlCommand ObjCmd = new SqlCommand(strSQL, ObjCnn);

            SqlDataReader ObjReader = ObjCmd.ExecuteReader();
            while (ObjReader.Read()) 
            { 
                Console.Write(ObjReader[0].ToString());
            }

        }
    }
}

ExecuteReader

using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        String strConexion = “SERVER=(local); uid=sa; pwd=sa; database=Northwind”; 

        using(SqlConnection ObjCnn = new SqlConnection(strConexion)){
            
            ObjCnn.Open();
            String strSQL=”SELECT COUNT(*) FROM Employees”; 

            SqlCommand ObjCmd=new SqlCommand(strSQL, ObjCnn); 
            
            Object ObjAux = ObjCmd.ExecuteScalar();

         }
    }
}

ExecuteScalar

Pasar parámetros por el Command

using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        String strConexion = “SERVER=(local); uid=sa; pwd=sa; database=Northwind”; 

        using(SqlConnection ObjCnn = new SqlConnection(strConexion)){
            
            ObjCnn.Open();
            String strSQL = ”UPDATE Employees SET lastname=’Alvaro’ WHERE EmployeeID = @ID”; 
            
            SqlCommand ObjCmd = new SqlCommand(strSQL, ObjCnn); 
            
            SqlParameter param  = new SqlParameter();
	    param.ParameterName = "@ID";
	    param.Value         = 1;
	
	    ObjCmd.Parameters.Add(param);

	    SqlDataReader reader = cmd.ExecuteReader();

	    while(reader.Read())
	    {
		Console.WriteLine("{0}, {1}", reader["CompanyName"], reader["ContactName"]);
	    }

            ObjCnn.Close();

        }
    }
}
using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        String strConexion = “SERVER=(local); uid=sa; pwd=sa; database=Northwind”; 

        using(SqlConnection ObjCnn = new SqlConnection(strConexion)){
            
            ObjCnn.Open();
            
            SqlCommand command = new SqlCommand("SalesByCategory", ObjCnn);

            command.CommandType = CommandType.StoredProcedure;
    
            SqlParameter parameter = new SqlParameter();
            parameter.ParameterName = "@CategoryName";
            parameter.SqlDbType = SqlDbType.NVarChar;
            parameter.Direction = ParameterDirection.Input;
            parameter.Value = categoryName;
            command.Parameters.Add(parameter);
    
            SqlDataReader reader = command.ExecuteReader();
    
            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    Console.WriteLine("{0}: {1:C}", reader["Name"], reader[1]);
                }
            }
            else
            {
                Console.WriteLine("No rows found.");
            }
            reader.Close();
        }
    }
} 

Llamar un procedimiento almacenado

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[GetFruitName]
      @FruitId INT,
      @FruitName VARCHAR(30) OUTPUT
AS
BEGIN
      SET NOCOUNT ON;
     
      SELECT @FruitName = FruitName
      FROM Fruits
      WHERE FruitId = @FruitId
END

Parámetros de entrada y Salida

string constring = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
using (SqlConnection con = new SqlConnection(constring))
{
    using (SqlCommand cmd = new SqlCommand("GetFruitName", con))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@FruitId", int.Parse(txtFruitId.Text.Trim()));
        cmd.Parameters.Add("@FruitName", SqlDbType.VarChar, 30);
        cmd.Parameters["@FruitName"].Direction = ParameterDirection.Output;
        con.Open();
        cmd.ExecuteNonQuery();
        con.Close();
        lblFruitName.Text = "Fruit Name: " + cmd.Parameters["@FruitName"].Value.ToString();
    }
}

Parámetros de entrada y Salida

Recuperar un conjunto de datos (DataTable)

1. Creamos el método para realizar la consulta y devolver una DataSet.

public static DataSet GetAllFromDataSet()
{
    string sql = @"SELECT [IdContacto]
                          ,[Nombre]
                          ,[Apellido]
                          ,[FechaNacimiento]
                          ,[Localidad]
                          ,[Calle]
                          ,[Numero]
                      FROM Contacto";

    using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
    {

        SqlCommand command = new SqlCommand(sql, conn);

        SqlDataAdapter da = new SqlDataAdapter(command);

        DataSet contactos = new DataSet();

        da.Fill(contactos, "Contacto");

        return contactos;
    }

}

Recuperar un conjunto de datos (List)

1. Creamos el método para realizar la consulta y devolver una lista.

public static List<ContactoEntity> GetAll()
{
    string sql = @"SELECT [IdContacto],[Nombre] ,[Apellido]
                          ,[FechaNacimiento] ,[Localidad]
                          ,[Calle] ,[Numero] FROM Contacto";

    List<ContactoEntity> list = new List<ContactoEntity>();

    using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
    {

        SqlCommand command = new SqlCommand(sql, conn);

        conn.Open();

        SqlDataReader reader = command.ExecuteReader();

        while (reader.Read())
        {
            list.Add(LoadContacto(reader));
        }

        return list;
    }

}

2. Creamos el método que se va encargar de encapsular los datos que devuelve la consulta

private static ContactoEntity LoadContacto(IDataReader reader)
{
    ContactoEntity contacto = new ContactoEntity();

    contacto.IdContacto = Convert.ToInt32(reader["IdContacto"]);
    contacto.Nombre = Convert.ToString(reader["Nombre"]);
    contacto.Apellido = Convert.ToString(reader["Apellido"]);
    contacto.FechaNacimiento = Convert.ToDateTime(reader["FechaNacimiento"]);
    contacto.Localidad = Convert.ToString(reader["Localidad"]);
    contacto.Calle = Convert.ToString(reader["Calle"]);
    contacto.Numero = Convert.ToInt16(reader["Numero"]);

    return contacto;
}

Algunos controles gráficos de datos..

  • GridView
  • ListView
  • DataList
  • Repeater

Hora de practicar

Conceptos de ADO.NET

By Yhoan Andres Galeano Urrea