TEMA 7. PROVEEDORES Y CONEXIÓN A BASES DE … · El espacio de nombres System.Data.OleDb es el...

15
7.1 Programació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.

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)

...