TEMA 7. PROVEEDORES Y CONEXIÓN A BASES DE … · El espacio de nombres System.Data.OleDb es el...
Transcript of TEMA 7. PROVEEDORES Y CONEXIÓN A BASES DE … · El espacio de nombres System.Data.OleDb es el...
7.1Programación .NET (II). Proveedores y conexión a bases de datos
TEMA 7. PROVEEDORES Y CONEXIÓN A BASES DE DATOS
7.1. PROVEEDORES MÁS HABITUALES
Anteriormente ya hemos mencionado cuáles son los proveedores de datos de
.NET Framework más habituales. A continuación haremos una descripción más
profunda de sus funcionalidades, prestando especial atención al proveedor para
SQL Server.
Aunque aquí nos centraremos en aquellos componentes comunes a todos los
proveedores, debes tener en cuenta que cada proveedor puede ofrecer otros
específicos para el origen de datos al que se orienta.
Principales proveedores de datos ADO.NET
Proveedor de datos para SQL Server
Proporciona acceso a datos para Microsoft SQL Server (versión 7.0 o
posterior). Utiliza el espacio de nombres System.Data.SqlClient.
Proveedor de datos para OLE DB
Para orígenes de datos accesibles mediante OLE DB. Utiliza el espacio de
nombres System.Data.OleDb.
Proveedor de datos para ODBC
Para orígenes de datos accesibles mediante ODBC. Utiliza el espacio de
nombres System.Data.Odbc.
Proveedor de datos para Oracle
Para orígenes de datos de Oracle (versión 8.1.7 o posteriores). Utiliza el
espacio de nombres System.Data.OracleClient.
Programación .NET (II). Proveedores y conexión a bases de datos7.2
Proveedor de datos para SQL Server – SqlClient
La funcionalidad que vamos a encontrar en este proveedor para el acceso a
bases de datos SQL Server tiene un diseño muy similar al de los demás
proveedores, por ello nos va a servir de ejemplo sobre el uso de estos
elementos.
A continuación puedes ver las principales clases, similares a los demás
proveedores, que contiene el espacio de nombres System.Data.SqlClient.
Veamos cómo funcionan.
Objeto SqlConnection
ADO.NET nos proporciona la clase SqlConnection para establecer una
conexión con un origen de datos SQL Server.
Además de establecer la conexión, SqlConnection presenta atributos y métodos
para determinar o modificar propiedades de la conexión tales como la ubicación
de los datos, usuario y contraseña de conexión, tiempo máximo de espera…
A continuación realizaremos un ejemplo de creación de una nueva conexión a
una base de datos SQL Server con SqlConnection.
7.3Programación .NET (II). Proveedores y conexión a bases de datos
'El objeto conexión para SQL Server pertenece espacio de
'nombres System.Data.SqlClient
Imports System.Data.SqlClient
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
'Declaramos la conexión
Dim conexion As New SqlConnection()
'Utilizamos la propiedad ConnectionString para especificar
'la ubicación de los datos, el modo de conexión…
'Si queremos abrir una base de datos
'SQL Server de un archivo
conexion.ConnectionString = "Data Source=.\SQLEXPRESS;" _
& "AttachDbFilename=C:\nueva.mdf;" _
& "Integrated Security=SSPI;" _
& "Connect Timeout=30;"
'Si queremos abrir una base de datos SQL Server en un
'servidor SQL Server (remoto o local)
conexion.ConnectionString = "Data Source=.\SQLEXPRESS;" _
& "Initial Catalog=CLIENTES;" _
& "user=miusuario;" _
& "password=miclave"
'Abrimos la conexión
conexion.Open()
'Cerramos la conexión
conexion.Close()
End Sub
End Class
Programación .NET (II). Proveedores y conexión a bases de datos7.4
En nuestro ejemplo se muestran dos modos de conexión: a una base de datos
de archivo y a una base de datos en un servidor SQL Server (local, en este
caso).
El método open abre la conexión con el origen de datos y, como supondrás,
close la cierra.
Objeto SqlCommand
Tras abrir una conexión, podremos ejecutar sentencias SQL y obtener
resultados usando la clase SqlCommand trabajando con SQL Server.
A continuación puedes ver dos maneras distintas declarar un comando de esta
clase.
'Abrimos la conexión previamente creada
conexion.Open()
'Definimos una cadena de texto con la sentencia a ejecutar
Dim orden As String = "UPDATE Agenda SET " _
& "nombre = 'Pepe' WHERE nombre LIKE 'Jose%'"
'Creamos un comando sin ningún parámetro inicial
Dim comando As New SqlCommand()
'Configuramos conexión y orden a ejecutar
comando.Connection = conexion
comando.CommandText = orden
'Ejecuta la orden
comando.ExecuteNonQuery()
'................
'Creamos ahora un comando indicando directamente
' conexión a usar y orden a ejecutar
Dim comando2 As New SqlCommand(orden, conexion)
'Ejecuta la orden
comando2.ExecuteNonQuery()
'Cerramos la conexión
conexion.Close()
7.5Programación .NET (II). Proveedores y conexión a bases de datos
Usamos el método ExecuteNonQuery para ejecutar las órdenes SQL. Si
consultamos el valor devuelto por este método obtendremos el número de
registros que se vieron afectados por la sentencia.
El objeto “comando”, de clase SqlCommand, cuenta con otro método llamado
ExecuteReader que servirá para ejecutar sentencias de consulta de datos
(“Select…”). Este método ejecuta la consulta y construye con los datos
obtenidos un lector de datos.
Hablaremos más de este objeto a continuación.
Objeto SqlDataReader
A través de SqlDataReader podemos recorrer de principio a fin los datos
resultantes de una consulta realizada con un comando SqlCommand. Esta
forma de acceder a datos se realiza directamente de la fuente de datos,
manteniendo la conexión, no de forma independiente, como ocurre con un
DataSet. Más adelante aclararemos conceptos sobre diferentes formas de
acceder a los datos en función de la conexión.
Cada vez que abrimos un lector de datos DataReader (sea del proveedor que
sea) el objeto Connection asociado a él queda ocupado, no pudiendo realizar
otras operaciones hasta que se libere cerrando el lector.
Por otro lado, si se producen cambios en los datos mientras los estamos
leyendo, éstos serán visibles para nosotros.
Observa el siguiente ejemplo de creación de un SqlDataReader.
Programación .NET (II). Proveedores y conexión a bases de datos7.6
Imports System.Data.SqlClient
Module Module1
Sub Main()
'Creamos la conexión
Dim conexion As New SqlConnection()
conexion.ConnectionString = "Data Source=(local);" _
& "Initial Catalog=CLIENTES;" _
& "user=miusuario;" _
& "password=miclave"
'Abrimos la conexión
conexion.Open()
'Definimos un comando
Dim orden As String = "SELECT * FROM Agenda"
Dim comando As New SqlCommand(orden, conexion)
'Creamos un lector mediante el comando
Dim lector As SqlDataReader = comando.ExecuteReader()
'Siempre hay que leer antes de acceder a los datos
While lector.Read
'podemos acceder a cada campo con lector("el_campo")
'o lector(0), lector(1)… según su orden en la tabla.
Console.Write(lector("nombre") & " ")
Console.WriteLine(lector("apellidos"))
End While
'cerramos el lector
lector.Close()
'Cerramos la conexión
conexion.Close()
Console.ReadKey()
End Sub
End Module
7.7Programación .NET (II). Proveedores y conexión a bases de datos
El método ExecuteReader de SqlCommand es el encargado de obtener los
datos de la clase SqlDataReader.
Los principales métodos de la clase SqlDataReader son open, close y read.
Nos permiten abrir, cerrar el lector y leer un registro de los datos, pasando el
cursor al siguiente registro, respectivamente.
Objeto SqlDataAdapter
Como decíamos en el tema anterior, mediante un adaptador podemos llenar
un DataSet con datos procedentes de un origen de datos. El adaptador actúacomo “puente” entre el origen de datos y el DataSet, para que éstepueda interactuar con aquel.
El adaptador está formado por un conjunto de objetos: varios comandos de
datos y una conexión a base de datos. En el caso del adaptador de datos para
SQL Server, SqlDataAdapter, los objetos que tiene asociados son de clase
SqlConnection y SqlCommand. Además, el método Fill será el encargado de
rellenar un Dataset o un DataTable.
Los comandos asociados al adaptador le permiten obtener un conjunto de datos
del origen (SelectCommand), añadir nuevos registros a una tabla del origen
de datos (InsertCommand), eliminar registros de una tabla del origen de
datos (DeleteCommand) y actualizar datos en el origen (UpdateCommand).
Vemos ahora un pequeño ejemplo de uso de un adaptador SqlDataAdapter para
llenar un conujto de datos DataSet.
Programación .NET (II). Proveedores y conexión a bases de datos7.8
Imports System.Data.SqlClient
Module Module2
Sub main()
Dim conexion As New SqlConnection
conexion.ConnectionString = "Data Source=(local);" _
& "Initial Catalog=CLIENTES;" _
& "user=miusuario;" _
& "password=miclave"
Dim consulta As String = "SELECT * FROM Agenda"
Dim conjunto_datos As New DataSet
Dim adaptador As New SqlDataAdapter()
'Definimos el comando de selección de datos.
adaptador.SelectCommand = New SqlCommand(consulta, conexion)
'Llenamos el DataSet con el método Fill del adaptador.
adaptador.Fill(conjunto_datos)
'Tenemos un DataSet lleno con los datos de la tabla Agenda
'Vemos el dato en la primera tabla, 2ª fila, 3ª columna
Console.WriteLine(conjunto_datos.Tables(0).Rows(1).Item(2).ToString)
Console.ReadKey()
conjunto_datos.Dispose()
adaptador.Dispose()
conexion.Dispose()
End Sub
End Module
7.9Programación .NET (II). Proveedores y conexión a bases de datos
Proveedor de datos para OLE DB – OleDb
El espacio de nombres System.Data.OleDb es el proveedor de datos de .NET
Framework para orígenes de datos OLE DB.
Su estructura y funcionamiento son análogos al del espacio de nombres
SqlClient que hemos visto anteriormente. Esto queda patente en el esquema
de clases que puedes ver a continuación.
OLE DB fue pensado para acceder a distintos tipos de orígenes de datos de
forma uniforme, por ello, con System.Data.OleDb vamos a poder acceder a
cualquier origen de datos que sea accesible mediante OLE DB.
Por ejemplo, podríamos utilizar el proveedor de datos OLE DB para acceder a
un origen de datos SQL Server. No obstante, como norma general, si existe un
proveedor específico para el origen de datos será mejor usar éste, puesto que
estará optimizado para ese tipo de base de datos.
Programación .NET (II). Proveedores y conexión a bases de datos7.10
Proveedor de datos para ODBC – Odbc
ODBC son las siglas de Open DataBase Connectivity, que es un estándardesarrollado por Microsoft para acceder a diversos orígenes de datossea cual sea su SGBD.
Estos orígenes de datos deberán contar con controladores ODBC adecuados,
que permitan la comunicación entre ellos y las aplicaciones haciendo de
intérpretes entre ODBC y el lenguaje de consultas utilizado por elorigen.
El espacio de nombres System.Data.ODBC es el proveedor de datos para
ODBC en .NET Framework. Como los demás, presenta estructura y funciones
similares a los demás proveedores.
7.11Programación .NET (II). Proveedores y conexión a bases de datos
Proveedor de datos para ORACLE – OracleClient
Como supondrás, este es el proveedor adecuado para obtener datos de bases
de datos Oracle. El espacio de nombres que lo engloba es
System.Data.OracleClient. Como siempre, la funcionalidad de este
proveedor será similar a la de los demás.
Para acceder al origen de datos de Oracle, este proveedor usa lo que se conoce
como la interfaz de llamada de Oracle (OCI), que incorpora el software del
cliente Oracle.
Como ocurre con otros proveedores específicos, OracleClient proporciona
soporte a tipos de datos específicos de Oracle.
Programación .NET (II). Proveedores y conexión a bases de datos7.12
7.2. CADENAS DE CONEXIÓN
Cuando accedemos a datos desde
una aplicación .NET, nuestro
proveedor de datos necesita
conocer una serie de información
para que sea capaz de establecer
la conexión con la base de datos,
ya sea en un servidor de bases de
datos o en un archivo. Deberemos
incluir esa información en una
cadena de conexión.
La cadena de conexión se escribe como una lista de parámetros y será
transmitida por el proveedor de datos hasta el origen de los mismos. Si la
información que contiene la cadena de conexión es correcta y válida el origen
de datos aplicará las opciones que contiene y abrirá la conexión.
La sintaxis empleada para las cadenas de conexión va a depender del proveedor
de datos utilizado. De forma genérica será una lista de parámetros con sus
correspondientes valores separados por punto y coma.
Los datos que necesitamos pueden estar en la propia máquina local o en una
ubicación remota accesible a través de una red local o Internet. En cualquier
caso habrá que establecer la cadena de conexión adecuada.
Por ejemplo, para SQL Server, el formato estándar básico sería:
parámetro1=valor1; parametro2=valor2;…
Data Source=<direccion_servidor>;
Initial Catalog=<nombre_base_datos>;
User Id=<usuario>;Password=<claveusuario>;
7.13Programación .NET (II). Proveedores y conexión a bases de datos
Con esta sintaxis estamos indicando, mediante Id y Password, con qué usuario
nos queremos conectar al servidor cuya dirección especificamos en el
parámetro Data Source. En Initial Catalog indicamos el nombre de la base
de datos con la que queremos conectar. Para poder utilizar esta forma de
conexión, el modo de autenticación del servidor SQL Server debe estar
configurado en modo mixto (en inglés mixed mode). Este modo permitirá tanto
autenticación de SQL Server como autenticación Windows.
Si se trata de una conexión de confianza (servidor local o dentro de una red de
confianza), podremos utilizar autenticación de Windows:
En este caso habrá que tener en cuenta que el usuario Windows que estemos
usando deberá tener los permisos necesarios para conectar con el servidor y
acceder a la base de datos deseada.
ADO.NET proporciona un generador de cadenas de conexión para facilitar su
correcta construcción en tiempo de ejecución, puesto que es fácil equivocarse
y cometer algún error de sintaxis.
Se trata de la clase DbConnecionStringBuilder, clase que heredarán otrasclases dentro del espacio de nombres de cada proveedor de datos. Por
ejemplo, para SQL Server existe la clase SqlConnectionStringBuilder, para
Oracle OracleConnectionStringBuilder...
Esta clase previene errores a la hora de construir la cadena de conexión.
También previene vulnerabilidades de seguridad por ataques de inyección en
la cadena de conexión cuando obtenemos sus parámetros a partir de datos
obtenidos del usuario.
A continuación verás un pequeño ejemplo del uso del generador de cadenas
de conexión para SQL Server.
Data Source=<direccion_servidor>;
Initial Catalog=<nombre_base_datos>;
Integrated Security=SSPI;
Programación .NET (II). Proveedores y conexión a bases de datos7.14
Si ejecutamos este código en una aplicación de consola obtendremos por
pantalla una cadena como esta:
Data Source=(local);Initial Catalog=CLIENTES;Integrated Security=True
Como hemos visto, las cadenas de conexión se podrán crear dinámicamente
en tiempo de ejecución o bien, si conocemos de antemano la configuración de
la conexión, podemos almacenar la cadena de conexión en un fichero de
configuración.
Las cadenas de conexión escritas directamente en nuestro códigopueden suponer un problema de vulnerabilidad y dificultan sumantenimiento, por ello, será más recomendable guardar nuestras cadenas
de conexión en un archivo de configuración de nuestra aplicación. En una
aplicación Windows, el archivo de configuración sería el archivo app.config,
en formato XML.
Imports System.Data.SqlClient
Module Module1
Sub Main()
'Definimos el constructor de cadenas de conexión
Dim constructor As New SqlConnectionStringBuilder
'Algunos parámetros para la cadena de conexión:
constructor("Data Source") = "(local)"
constructor("Integrated Security") = "SSPI"
constructor("Initial Catalog") = "CLIENTES"
'Visualizamos la cadena construída
Console.WriteLine(constructor.ConnectionString)
Console.ReadKey()
End Sub
End Module
7.15Programación .NET (II). Proveedores y conexión a bases de datos
Con Visual Basic 2008 este archivo se puede crear automáticamente si
entramos en la sección “Configuración” de las propiedades del proyecto.
Una vez que tenemos una base sobre la forma de conectar con los orígenes de
datos, es hora de conocer los métodos para acceder a los propios datos.
Ejemplo:
En el archivo app.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="Conexiones2.My.MySettings.CadConexion"
connectionString="Data Source=(local);Initial
Catalog=CLIENTES;Integrated Security=True" />
</connectionStrings>
</configuration>
Desde nuestro código:
...
Dim conexion As New SqlConnection(My.Settings.CadConexion)
...