Anda di halaman 1dari 53

Acceso a Datos en .

NET
ADO.Net
Que es ADO.NET
Revisión de ADO
Proveedores incluidos en el Framework.NET
Clases Principales de ADO.NET
Revisión de ADO
Diseñado para acceso conectado.
Vinculado al modelo físico de los datos.
El RecordSet es el contenedor central de
datos.
El RecordSet es una tabla que contiene
todos los datos.
El envío de datos es complicado a traves de
firewalls.
ADO.NET
Es una evolución de ADO.
Diseñado para acceso desconectado.
El DataSet reemplaza al RecordSet.
El DataSet puede contener múltiples
tablas.
Se puede enviar a traves de firewalls ya que
permite ser enviado como XML.
Dispone de clases de datos especializadas
para distintos proveedores.
Beneficios de ADO.NET
Interoperabilidad por el uso de XML
 Estándar abierto
 Se usa para todas las transferencias de datos en
ADO.NET.
Escalabilidad por el DataSet desconectado
 No se mantienen conexiones por períodos largos
 No se producen “bloqueos” en la base de datos
 Trabaja como la Web “Toco y me voy”
ADO.NET trabaja con tipos nativos (no se
necesitan conversiones.
Se puede trabajar con estructuras tipificadas
iguales a las de la base de datos (No necesitamos
recordar los campos).
Usando Namespaces
Use la instrucción “using” para importar
namespaces. using System.Data;
using System.Data.SqlClient;

Los namespaces usados en ADO.NET incluyen:


 System.Data: Incluye las clases que implementan la
funcionalidad básica de ADO.NET, son independientes del motor de
base de datos.
 System.Data.SqlClient: Incluye las clases para conectarse a
una fuente de datos Microsoft SQLServer.
 System.Data.OleDb: Incluye las clases para conectarse a una
fuente de datos OleDb.
 System.Data.Common: Incluye las clases para conectarse a
una fuente de datos genérica.
El modelo de objetos de ADO.NET
DataSet
DataTable
DataTable

SqlDataAdapter
OleDbDataAdapter

Oracle .NET
Data Provider
MySQL .NET SQL Server .NET OLE DB .NET
DataDB2
Provider
.NET
Data Provider Data Provider
Data Provider
OleDbConnection

SqlConnection

SQL Server 7.0 Orígenes OLEDB


(y superior)
El modelo de objetos de ADO.NET
El DataSet
Un DataSet es una caché de registros
recuperados de una base de datos que actúa
como un sistema de almacenamiento virtual, y
que contiene una o más tablas basadas en las
tablas reales de la base de datos.
Adicionalmente, almacena las relaciones y reglas
de integridad existentes entre ellas para
garantizar la estabilidad e integridad de la
información de la base de datos. Muy importante
es recalcar, que los DataSets son almacenes
pasivos de datos, esto es, no se ven alterados
ante cambios subyacentes de la base de datos. Es
necesario recargarlos siempre que queramos
estar al día, en cuanto a datos se refiere.
Accediendo datos con ADO.NET
1.
1 El cliente realiza un request.
Database
2.
2 Se crean los objetos SqlConnection y SqlDataAdapter.
3
3. Llena el DataSet desde el DataAdapter Web server SqlConnection
y cierra la conexión.
4.
4 Retorna el DataSet al cliente. SqlDataAdapter

5.
5 El cliente manipula los datos.
6.
6 Actualiza el DataSet.
7.
7 Se usa el SqlDataAdapter para abrir
la SqlConnection, actualizar la base
de datos y cerrar la conexión. DataSet

Control
enlazado
Cliente
Proveedores incluidos
SQL Server
 System.Data.SqlClient
Oracle
 System.Data.OracleClient
OleDb (excepto ODBC)
 System.Data.OleDb
ODBC
 System.Data.ODBC
Databinding
Como mostramos los datos en la UI?
Controles que toman un set de datos
(DataSet, DataReader, Arrays, etc) y
muestran la información.
Entre ellos se encuentran los controles de
ASP.Net:
 DropDownList  GridView

 ListBox  DataList

 CheckBoxList  Repeater

 RadioButtonList
System.Data
Fundamento de la infraestructura de acceso a datos.
Es la base de ADO.NET
Namespace centrado en datos
Provee todos los mecanismos para trabajar con los
datos
Contiene clases de definición base de los objetos de
datos
 DataRelation (Permite relacionar 2 DataTables entre sí)
 DataColumn (Permite definir columnas en un DataTable).
 DataRow (Permite manipular una fila de un DataTable)
 DataTable (Persistencia en memoria de una tabla).
 DataSet (Persistencia en memoria de los datos).
System.Data.Common
Clases base que determinan la
funcionalidad de otras clases en los
espacios de nombres específicos
 DbDataAdapter
 DbCommand
 DbConnection
 DbDataReader
 …
System.Data.SqlClient
Específica para acceder a bases de datos
SQL Server©
 Optimizada en su comunicación con dicha base
 Implementa formas específicas de los mismos
objetos existentes en Common por herencia
 SqlDataAdapter

 SqlCommand

 SqlConnection

 …
System.Data.OleDb
Utiliza los proveedores OleDb para acceder
a cualquier base de datos compatible,
heredando de Common
 OleDbDataAdapter
 OleDbCommand
 OleDbConnection
Creando la conexión
Uso de SqlConnection
String strConn =
"data source=localhost; " +
"initial catalog=northwind; " +
"integrated security=true“;
SqlConnection conn = new SqlConnection(strConn);

Indicando parámetros del connection


string
 Connection timeout  Password

 Data source  Persist security info

 Initial catalog  Provider

 Integrated security  User ID


Clase Connection
Existe una clase diferente para cada
proveedor
Es similar al objeto Connection de ADO
Principales Métodos:
 Open
 Close
 BeginTransaction
La cadena de Conexión
Con SQL Server se puede utilizar
Autenticación Integrada o Mixta
Cuando no podemos acceder a la seguridad
del dominio (integrada), entonces usamos
seguridad de SQL Server
 Proveedores externos de sitios
Requiere mayor cuidado en la
configuración de la cadena de conexión
 Encriptación
 Almacenamiento en ubicaciones no comunes
ConnectionString
Dentro del archivo web.config
<connectionStrings>
<add name="Profoco" connectionString="Data Source=.;Initial
Catalog=Profoco;Persist Security Info=True;User ID=sa"/>
</connectionStrings>

Desde C#
 Utilizar el namespace System.Configuration
 Para leer la cadena del archivo web.config:
ConfigurationManager.ConnectionStrings["Prof
oco"].ConnectionString
Clase Command
Permite ejecutar una sentencia SQL sobre
el motor de base de datos
Existe uno para cada proveedor
Similar al objeto Command de ADO.
Necesita utilizar un objeto Connection
Para ejecutar una operación de lectura
sobre el motor se utiliza un DataReader
Clase Command. Principales
Métodos y propiedades
CommandText: Comando a ejecutar
CommandType: si es SQL o un SP
Connection: conexión a utilizar
ExecuteNonQuery: Ejecuta un sql sin
devolucion de datos
ExecuteReader: Ejecuta un SQL SELECT
ExecuteScalar: Ejecuta un SQL que
devuelve un solo valor
Parameters: colección de parámetros
Transaction: Transaccion a utilizar
Clase SqlParameter

Con los parámetros es posible generar


consultas en donde los valores variables se
generan dinámicamente.
Clarifican las consultas.
Son más seguras ya que evitan que un
usuario pueda incluir código dañino en la
consulta.
Se pueden crear objetos independientes o
crearlos directamente en el objeto que lo va a
usar
Clase SqlParameter

Se puede crear un objeto y luego agregarlo al


Command:
 SqlParameter pr = new SqlParameter("@id", 2);
 command.Parameters.Add(pr);
o Se puede agregar directamente al command:
 command.Parameters.Add(new SqlParameter("@id", 2));
Para utilizarlo, se reemplaza en el SQL el valor por la
variable @:
 "select nombrearea from customer_areas where idarea =
@id"
Clase DataReader
Sirve para recuperar el resultado de un
SELECT
Es el resultado del Método ExecuteReader de
un command
Es de solo lectura y solo adelante
Bloquea la conexión mientras esté abierto.
Se debe cerrar la conexión al finalizar
Datareader: Principales propiedades
y métodos
Close: cierra el DataReader
GetValue: Lee un campo
GetValues: Lee todos los campos
GetName: lee el nombre del campo
GetOrdinal: Lee el numero de columna
GetInt32, GetString: Lee un campo de un
tipo específico.
IsDBNull: si es un campo nulo
Read: avanza al siguiente registro.
Creando un DataReader
Para usar un DataReader:
1. Crear y abrir una conexión a una base de datos.
2. Crear el objeto Command.
3. Crear el DataReader desde el objeto Command.
4. Invocar el método ExecuteReader.
5. Usar el objeto DataReader.
6. Cerrar el objeto DataReader.
7. Cerrar el objeto Connection.

Usar siempre control de errores try…catch


Como leer desde un DataReader
Invocar Read para cada registro
 Devuelve false cuando no hay más registros
Acceso a campos
 Parámetro es la posición ordinal o nombre del campo
 Las funciones Get ofrecen un mejor rendimiento

while (myReader.Read())
{
str += myReader[1];
str += myReader["field"];
str += myReader.GetDateTime(2);
}

Cerrar el DataReader
Cerrar la conexión
Databinding DataReader
Crear el control
<asp:GridView id=“gvAuthors" runat="server" />

Enlazar al DataReader
gvAuthors.DataSource = dr;
gvAuthors.DataBind();
El modelo de objetos del
DataAdapter DataSet

DataAdapter
SelectCommand UpdateCommand InsertCommand DeleteCommand

DataReader

Command Command Command Command

Connection

sp_SELECT sp_UPDATE sp_INSERT sp_DELETE


Database
System.Data y DataSet
DataSet (1/3)
Reemplaza al RecordSet.
Es un repositorio en memoria de datos desde un
origen
Totalmente desconectado, no conoce nada del
origen de los datos
Forma común de representar y manipular datos
 Contenedor universal
 No sólo para base de datos
Representación lógica o física de los datos
Diseñado para estar desconectado del origen
 Acciones: Conectar, ejecutar consulta, desconectar
Se utiliza XML para leer y almacenar, tanto los
datos como el Esquema.
DataSet (2/3)
Espacio de nombres System.Data
Se usan colecciones para agregar Tablas y
Relaciones
Propiedades importantes
 Tables: Devuelve una colección de objetos
DataTable.
 Relations: Devuelve la colección de
DataRelations.
 Relacionadas con XML.
DataSet (3/3)
Principales médotos del DataSet
 AcceptChanges: Confirma los Cambios
 Clear: Borra todo el DataSet.
 Clone: hace una copia de la estructura
 Copy: copia la estructura y los datos
 GetChanges: obtiene un DS con los cambios
 GetXml: obtiene un xml de los datos
 HasChanges: indica si hubo cambios
 Merge: Suma un DataSet a otro.
 ReadXml: Levanta tablas y datos de un xml
 WriteXml: Graba un dataset en XML.
Clase DataAdapter
Trabaja sobre un DataTable para leer y
llevar todos los cambios del DataTable a la
Base de Datos
Internamente tiene 4 objetos command y
un datareader
Luego de actualizar los registros se llama a
AcceptChanges.
DataAdapter: Principales Métodos
y Propiedades
DeleteCommand, SelectCommand,
UpdateCommand e InsertCommand
Fill Ejecuta el SelectCommand y llena un
datatable
Update: Lleva todos los cambios a la base
de datos
Crear un DataAdapter
Almacenar la consulta en un
DataAdapter
SqlDataAdapter da = new SqlDataAdapter
("select * from Authors",conn);

El constructor DataAdapter establece


la propiedad SelectCommand
da.SelectCommand.CommandText = select ……; da.SelectCommand.CommandText;
da.SelectCommand.Connection = conn; da.SelectCommand.Connection;

Establecer las propiedades


InsertCommand, UpdateCommand y
DeleteCommand si fuera necesario
Creación de un DataSet
Crear y llenar las tablas del DataSet
 El método Fill ejecuta el SelectCommand.
DataSet ds = new DataSet();
da.Fill(ds, "Authors");

Acceso a un DataTable.
ds.Tables["Authors"].Rows.Count;

String str;

foreach (DataRow r in ds.Tables["Authors"].Rows)


{
str += r[2];
str += r["au_lname"];
}
DataTable
Espacio de nombres System.Data
Puede ser vinculado a una tabla física o a
una consulta.
Se puede relacionar con otras a través de
DataRelations.
Propiedades Importantes:
 Columns: Devuelve la colección de
DataColumns como ColumnsCollection.
 Rows: Devuelve objetos DataRow como una
RowsCollection
 PrimaryKey: Obtiene DataColumns que
conforman la clave primaria.
Uso de DataSets frente a
DataReaders
DataSet DataReader

Acceso lectura/escritura a datos Sólo lectura

Incluye múltiples tablas de distintas Basado en una instrucción SQL


bases de datos de una base de datos

Desconectado Conectado
Vinculado a múltiples controles Vinculado a un único control
Búsqueda de datos hacia delante y
hacia atrás Sólo hacia delante

Acceso más lento Acceso más rápido


Soportado por las herramientas de
Visual Studio .NET Codificación manual
Uso del DataView
El DataView puede ser personalizado para
presentar un subconjunto de información.
La propiedad DefaultView retorna la vista
por defecto del DataTable.
DataView dv;
dv = ds.Tables["Authors"].DefaultView;

Los DataViews personalizados retornan un


subconjunto de un DataTable.
DataView dv = new DataView(ds.Tables["Authors"]);
dv.RowFilter = "state = 'CA'";
Databinding Dataset
Crear el control.
<asp:GridView id=“gv" runat="server" />

Enlazar a un DataSet, DataTable o DataView.


gv.DataSource = ds;
gv.DataMember = "Authors";
gv.DataBind();
Obteniendo Datos (SQL)
SELECT *
FROM Oradores

SELECT Id, EsInternacional, EsRegional, EsGenerico, EsINETA


FROM Oradores
Obteniendo Datos (SQL)
Sentencias SQL
 Excepto que sean muy similares con alguna
anterior, requieren un análisis completo cada
vez que se ejecutan
 Si sólo varía el valor de los argumentos
utilizados, SQL Server es capaz de mantener
en caché las sentencias

Procedimientos Almacenados
 Sólo consumen el tiempo de la obtención de
datos
 Permiten implementar mejores mecanismos
de autorización de acceso
Actualizando datos (SQL)
Actualizar
UPDATE Oradores
SET Nombre = 'Nombre', Apellido = 'Apellido', EsInternacional = 1
where Id=3

Insertar
INSERT INTO Oradores
(Nombre, Apellido, EsInternacional)
VALUES (N'Nombre', N'Apellido', 1)
where Id=3

Eliminar
DELETE FROM Oradores
WHERE (Id = 3)
Actualizando datos (SQL) (2)
Procedimientos Almacenados
 Más rápidos
 Más seguros
CREATE/ALTER Procedure [Oradores_Update]
@Id int = null, @Nombre nvarchar(100) = null, @Apellido nvarchar(100) = null,
@EsInternacional bit = null, @EsRegional bit = null,
@Descripcion varchar(8000) = null,
@UrlFoto nvarchar(100) = null, @EsGenerico bit = null, @EsINETA bit = null,
@Passport nvarchar(200) = null, @EsAcademico bit = nulll
AS
Update [Oradores]
SET
[Id]=@Id, [Nombre]=@Nombre, [Apellido]=@Apellido,
[EsInternacional]=@EsInternacional, [EsRegional]=@EsRegional,
[Descripcion]=@Descripcion, [UrlFoto]=@UrlFoto,
[EsGenerico]=@EsGenerico, [EsINETA]=@EsINETA,
[Passport]=@Passport, [EsAcademico]=@EsAcademico
where Id=@Id
Utilizando procedimientos almacenados
Ejecutar cualquier sentencia SQL significa
 Control de sintaxis
 Control de validez de los objetos implicados
 Compilación
 Cálculo del plan de ejecución (Query Plan)
 Ejecución y obtención de resultados
Ejecutar cualquier procedimiento
almacenado significa
 Ejecución y obtención de resultados
 (el resto se realiza al guardar el PA en la base
de datos)
Utilizando procedimientos almacenados (2)

Los PA no son el mejor lugar para


implementar lógica de negocios
 … pero manipular grandes volúmenes suele ser
mejor dentro de la misma base
Cursores y tablas transitorias
 Armas de doble filo
 Consumen mucho proceso por implicar a la
base tempdb
 No se optimizan adecuadamente en su
ejecución, ya que se debe recalcular el Query
Plan sobre ellas según se agregan datos
Asegurando la base de datos
NUNCA usar sa
Cuidar los datos
 Permitir acceso a las tablas significa provocar
un punto de desastre
 Si se necesita autorizar el acceso directo a las
tablas, considerar utilizar Vistas
 En la medida de lo posible, denegar el acceso a
las tablas, y permitir la ejecución de
procedimientos almacenados
Buenas Prácticas
Las consultas deben ser específicas en
cuanto a las columnas que deben devolver
 Select * from tabla 
Un error común: denominar los
procedimientos almacenados comenzando
con sp_
 Sp_ significa “system procedure” no “Store
procedure”
Control de errores
La conexión no puede abrirse
 El connection string es inválido.

 El servidor o la base de datos no se


encuentra.
 Falló el login.

El DataAdapter no puede crear el DataSet


 Sintaxis SQL inválida.

 Nombre de tabla o campo inválidos.


El control GridView
Se utiliza para mostrar los valores de un origen de
datos en forma tabulada.
<asp:GridView id=“gvAuthors" runat="server" />

Características :
 Enlace a controles de origen de datos, como
SqlDataSource.
 Funciones de ordenación integradas.
 Funciones de actualización y eliminación integradas.
 Funciones de paginación integradas.
 Funciones de selección de fila integradas.
 Acceso mediante programación al modelo de objetos
GridView para establecer propiedades dinámicamente,
controlar eventos, etc.
 Varios campos de clave.
 Personalización de la apariencia a través de temas y
estilos.
El control GridView (cont)
Propiedades Eventos
 AllowPaging  PageIndexChanging
 AllowSorting  RowCommand
 AutoGenerateColumns  SelectedIndexChanged
 Sorting
 DataKeyNames
 DataMember
 DataSourceID Estructura de objetos
 EditIndex  Rows
 Row.Cells
 PageIndex
 PagerSettings > Mode
 PageSize
 SelectedDataKey
 SelectedIndex
 SelectedPage