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
Conceptos de ADO.NET
Sql Server, ADO.NET Parte 1
- 1,065