Download 1. Bases de datos desde VB.Net 1.1 Introducción. 1.2

Document related concepts

ADO.NET wikipedia , lookup

SQL wikipedia , lookup

Mapeo objeto wikipedia , lookup

Microsoft SQL Server wikipedia , lookup

Tabla (base de datos) wikipedia , lookup

Transcript
1. Bases de datos desde VB.Net
1.1 Introducción.
Desde Vb Net 2005 se puede acceder a las siguientes bases de datos, utilizando las clases adecuadas.
Oracle
SQL Server
Access
Las que se puedan acceder a través de ODBC
Cualquier base de datos que pueda ser accesible desde la clase genérica DataBase.
En éste apartado nos vamos a centrar en Access, pero hay que tener presente que la diferencia en el
acceso a una base de datos solo cambia por la clase de origen que se utiliza en el uso de la misma, ya que los
objetos a utilizar son básicamente los mismos.
Los cambios en esta versión con respecto a la seis son considerables, hasta el punto que casi
podríamos decir que sirve de poco lo que sabíamos de la versión anterior. Por lo tanto quizás sea buena idea
hacer como un reset y no pensar en el como lo hacíamos antes, pues posiblemente ganemos tiempo.
El primer cambio viene en el número de objetos disponibles para el manejo de la base de datos, que son
más, y conviene comprender el destino de cada uno, para facilitar las cosas.
Otro apartado es que ahora la filosofía pasa por acceder a la base de datos y cerrar la conexión, lo cual
tiene la ventaja de descargar de recursos al servidor, y así este gana en prestaciones y recursos disponibles.
En Vb Net hay que, o se puede contemplar dos escenarios distintos.
Uno en el que el acceso a los datos se hace directamente a la base de datos, otro en el que el acceso se
hace solo al inicio del programa para obtener el subconjunto de la base de datos necesario para el programa
que se esté ejecutando en ese momento, para luego al final hacer una actualización con los cambios realizados
en la base de datos, este proceso de actualización lo gestionan los métodos que incorpora la clase que
gestiona el acceso a la base de datos.
El acceso a la base de datos se realiza siempre mediante instrucciones SQL, no se dispone de métodos
de acceso para leer o grabar, como en la versión anterior.
Las relaciones de integridad se definen en la base de datos, y se captura el error en el programa para la
gestión de las mismas.
El enfoque de está documentación se aparta del uso de los asistentes de Vb Net 2005, por lo que no
haremos uso de los mismos.
1.2 Las clases.
Cada base de datos dispone de una clase especializada en el manejo de la misma.
Oracle
SQL
Access
Odbc
Genérico
OracleClient
SQLClient
OleDb
ODBC
DB
Y estas clases están disponibles en el espacio de nombres System.Data.
Como vamos a centrarnos en Access, la clase que utilizaremos será OleDb.
1.3 Los objetos.
Podemos clasificarlos o agruparlos en
Conexión.
Almacenamiento.
Visualización.
Otros.
1.3.1 Conexión.
El objeto de conexión en Access es el OleDbConnection.
Permite definir los datos necesarios para acceder a cada tipo de base de datos.
Otro objeto de conexión, es el DataAdapter.
Este objeto permite realizar el acceso a la base de datos para el intercambio de información en los dos
sentidos, digamos que gestiona los datos entre la base de datos y la aplicación a partir de los datos facilitados
en la conexión.
Pertenece a System.Data.oleDb.OleDbDataAdapter.
Cada objeto de almacenamiento debe tener un objeto DataAdapter asignado, pues es el que a través del
cual puede hacerse luego el proceso de actualización.
1.3.2 Almacenamiento.
Los objetos de almacenamiento son
DataReader
DataTable
DataSet
DataRow
System.Data.OleDb.OleDbDataReader
System.Data.DataTable
System.Data.DataSet
System.Data.DataRow
Como podemos observar el objeto DataReader pertenece al espacio de nombres OleDb mientras que los
demás pertenecen a System.Data.
El objeto DataReader es un objeto ágil y que esta especializado en almacenar datos para solo lectura, lo
que le quita la gestión de las actualizaciones y le permite ser más rápido en los accesos a los datos de la base
de datos.
El objeto DataTable, es lo más parecido a una tabla de la base de datos, dispone de la posibilidad de
definir clave primaria de uno o varios campos.
El DataTable puede ser la imagen de una tabla de la base de datos, o puede ser el resultado de una
SQL que combine varias tablas en la SQL, o tabla virtual si queremos llamarla así.
Este objeto en el uso del DataSet es usado como parte del DataSet.
El objeto DataSet es lo que hemos dado en llamar antes un subconjunto de la base de datos de nuestra
aplicación.
Al iniciar el programa se carga con aquellos datos que sean necesarios para el mismo, se cierra la
conexión y luego se realiza la actualización de los datos en la base de datos con los cambios que hayan habido
en el programa.
El DataSet no puede formar parte de un DataTable.
El objeto DataRow, lo hemos incorporado como elemento de almacenamiento, aunque hace referencia a
una fila, registro de la base de datos, porque hemos comprobado lo útil que llega a ser el uso del mismo, y al fin
y al cabo almacena datos, un registro, pero datos.
1.3.3 Visualización.
Los objetos de visualización puede ser cualquiera de los que tenemos disponibles en el entorno de
programación.
Lo importante aquí es como utilizarlos a la hora de visualizar los datos de nuestra fuente de
almacenamiento.
2
Podríamos hablar de dos posibilidades.
Asignación clásica de los datos, o enlazarlos a nuestra fuente de datos.
Las dos son válidas evidentemente, pero hay que ver la practicidad.
El enlazado de un DataDrid a nuestro DataTable es comodísimo, pues se encarga de representar los
datos que vamos incluyendo en la tabla, sea la origen o una virtual.
El enlazado de un TextBox a un objeto crea el mismo código que hacer una asignación manual o clásica,
por lo que ...
1.3.4 Otros.
Estos objetos pueden ser
BindingSource
CommandBuilder
Command
BindingSource
System.OleDb.OleDbCommandBuilder
System.OleDb.OleDbCommand
BindingSource, este objeto es el que hace de puente entre aquellos objetos que no disponen de la
propiedad DataSource y el objeto fuente de los datos.
CommandBuilder, este genera de forma automática código SQL para las opciones Insert, Update y
Delete, tanto para el uso normal, como para cuando se utiliza el DataAdapter en el entorno de un DataSet.
Command, sirve para indicar, almacenar y ejecutar cuando proceda, la instrucción SQl, sea almacenada
o incrustada, para un objeto DataReader o DataAdapter.
Tiene dos formatos de utilización,
ExecuteNonQuery se ejecuta y no devuelve datos, borrado por ejemplo.
ExecuteReader se ejecuta y devuelve una colección de datos que se asignan a un objeto.
3
2. Conexión.
2.1 Introducción.
La conexión a la base de datos se realiza a través de un objeto específico, lo cual permite que cada tipo
de base de datos posea un objeto especializado en la misma, y se facilite dicha tarea.
Cada base de datos posee un juego distinto de parámetros para su acceso, por lo tanto esto facilita
dicho proceso.
El objeto de conexión en Access es el OleDbConnection.
Además existe la clase
System.Data.OleDb.OleDbConnectionStringBuilder
Que permite añadir a una colección todos los datos necesarios para la configuración de la conexión, hay
que tener presente que el uso de parámetros no necesarios puede generar error, como por ejemplo el de
contraseña si la base de datos no la tiene.
2.2 OledbConnection.
Este es un ejemplo de cómo puede ser la configuración del acceso a la base de datos.
Hay dos pasos, la generación de la cadena de conexión, y la prueba de la disponibilidad de la base de
datos, forzando un open y close de la misma para su control.
En el ejemplo el objeto Conexión es del tipo OleDBConnection, y se supone declarado a nivel de
aplicación.
Public Conexion As New System.Data.OleDb.OleDbConnection
Public Sub CadenaConexion( _
ByRef CadConex As System.Data.OleDb.OleDbConnectionStringBuilder, _
ByVal Ruta As String)
CadConex.ConnectionString = Ruta
' Añadir el nombre de cada parámetro y el valor que se le asigna.
CadConex.Add("Provider", "Microsoft.Jet.Oledb.4.0")
' Password de la base de datos, si lo tiene.
CadConex.Add("Jet OLEDB:Database Password", "password")
' Información para el grupo de trabajo.
CadConex.Add("Jet
OLEDB:System
Database",
"C:\Archivos
programa\Microsoft Office\Office\System.mdw")
‘ Este es necesario
CadConex.Add("Jet OLEDB:Database Locking Mode", 1)
End Sub
de
La cadena de conexión que se ha generado se devuelve como un objeto del tipo
OleDbConnectionStringBuilder, que después se asigna como cadena a la propiedad ConnectionString del
objeto OleDbConnection.
En el siguiente procedimiento se procede a realizar la configuración del objeto asignando esta cadena,
pero se ha optado por hacer la prueba de disponible de la base de datos, devolviendo el dato Status a false
cuando la base de datos ha podido ser abierta sin error.
4
Public Sub ConfigurarConexion( _
ByRef Conexion As System.Data.OleDb.OleDbConnection, _
ByRef Status As Boolean)
Dim CadConex As New System.Data.OleDb.OleDbConnectionStringBuilder
Dim Ruta As String
Status = False
Ruta = "Data source=C:\Visual2005\" & NomBaseDatos
CadenaConexion(CadConex, Ruta)
Conexion.ConnectionString = CadConex.ConnectionString
Try
Conexion.Open()
Conexion.Close()
Catch ex As OleDbException
MsgBox("Falló la conexión con la base de datos",
MsgBoxStyle.Information)
Status = True
End Try
End Sub
_
Tras la ejecución de éste procedimiento, el objeto Conexión queda configurado y probada la
disponibilidad de la base de datos, por lo que después ya se puede abrir la conexión en cada momento que sea
preciso en la aplicación.
Toda la información referente a éste objeto la podemos encontrar en el siguiente link.
http://msdn2.microsoft.com/es-es/library/system.data.oledb.oledbconnection(VS.80).aspx
2.3 OleDbDataAdapter.
Este objeto permite realizar el acceso a la base de datos para el trasiego de información en los dos
sentidos, digamos que gestiona los datos entre la base de datos y la aplicación a partir de los datos facilitados
en la conexión.
Pertenece a System.Data.oleDb.OleDbDataAdapter.
Su definición es
Dim Adaptador As System.Data.OleDb.OleDbDataAdapter
En el ejemplo que sigue se utiliza la carga de un DataGrid que se enlaza a la tabla que se crea en el
procedimiento.
Como objeto de almacenamiento se utiliza un DataTable.
En el procedimiento se crea una restricción en la tabla para a posteriori controlar las duplicidades de los
datos en la misma y capturar el error.
Private Sub CargaDataGrid( _
ByVal Conexion As System.Data.OleDb.OleDbConnection, _
ByRef Adaptador As System.Data.OleDb.OleDbDataAdapter, _
ByRef EnlaceTabla As BindingSource, _
ByRef ObjDataGrid As DataGridView)
Dim Cliente As ItemLista = CType(Lista02.SelectedItem, ItemLista)
Dim CadenaSql As String
' Se deshace de los datos anteriores
Tabla = New DataTable
5
CadenaSql = "SELECT PublicClientes.TipPub as Tipo , " & _
"PublicClientes.CodPub as Codigo , " & _
"Titulos.Titulo as Denominación , " & _
"PublicClientes.Cant as Cantidad " & _
"FROM PublicClientes " & _
"INNER JOIN Titulos ON " & _
"(PublicClientes.CodPub = Titulos.Codigo) AND “ & _
“(PublicClientes.TipPub = Titulos.TipPub) " & _
"WHERE (((PublicClientes.TipCli)=' " & _
“Cliente.Codigo.ToString "') AND “ & _
((PublicClientes.CodCli)='" & Cliente.Codig2.ToString & "')); "
Try
' Crear un nuevo adaptador de datos
Adaptador = New OleDb.OleDbDataAdapter(CadenaSql, Conexion)
' Llenar la tabla con los datos y enlazarza con el 'bindingsource'
Adaptador.Fill(Tabla)
' Se define la restricción
CrearRestriccion(Tabla)
' Se enlaza el objeto
ObjDataGrid.DataSource = EnlaceTabla
EnlaceTabla.DataSource = Tabla
Catch ex As OleDb.OleDbException
MsgBox(ex.Message, MsgBoxStyle.Information)
End Try
End Sub
En el ejemplo que sigue vemos un ejemplo en el que se cargan datos, pero no es necesario el uso de un
DataAdapter para la captura de los datos.
Como objeto de almacenamiento se usa un DataReader.
Además aparece el uso de una clase que se usa para insertar objetos en el ListBox, y facilitar la gestión
del apartado de códigos de los datos del ListBox.
Public Sub CargaListaClientes( _
ByRef Lista As ListBox, _
ByVal Conexion As System.Data.OleDb.OleDbConnection, _
ByVal Tipo As String)
Dim CadenaSQL As String
Dim Comando As New System.Data.OleDb.OleDbCommand
Dim Reader As System.Data.OleDb.OleDbDataReader
Dim Objeto As ItemLista
Lista.Items.Clear()
CadenaSQL = "Select Tipo, Codigo, RazonSocial " & _
"From Clientes " & _
"Where Tipo = '" & Tipo & "' " & _
"Order By RazonSocial"
Try
' Abrir la base de datos.
Conexion.Open()
' Contenido del comando
Comando.CommandText = CadenaSQL
' Tipo de comando a ejecutar
Comando.CommandType = CommandType.Text
' Conexión a utilizar, configurada previamente.
Comando.Connection = Conexion
' Ejecución de SQL
Reader = Comando.ExecuteReader
6
Try
' Control y lectura
While Reader.Read
Objeto = New ItemLista(Trim(Reader.Item("RazonSocial").ToString), _
Reader.Item("Tipo").ToString, _
Reader.Item("Codigo").ToString)
Lista.Items.Add(Objeto)
End While
Catch ex As OleDb.OleDbException
MsgBox(ex.Message, MsgBoxStyle.Information, "Leer reader")
End Try
Catch Ex As OleDb.OleDbException
MsgBox(Ex.Message, MsgBoxStyle.Information, "Crear reader")
End Try
Conexion.Close()
End Sub
Toda la información referente a éste objeto la podemos encontrar en el siguiente link.
http://msdn2.microsoft.com/es-es/library/system.data.oledb.oledbdataadapter(VS.80).aspx
Como hemos podido comprobar la conexión se configura mediante el objeto OleDbConnection, pero lo
que es la tarea posterior de gestión de los datos podemos efectuarla de dos formas distintas, mediante el uso
del DataAdapter o mediante el formato del uso del DataReader.
Cada uno tiene un escenario distinto.
2.4 Clave principal.
En toda tabla que se precie, existe una clave principal, de uno o varios campos.
Dicha gestión se puede hacer a dos niveles, DataAdapter o DataTable.
Con el DataAdapter la gestión de la clave principal se puede hacer de la siguiente forma.
' Asignación del comando al objeto adapter.
AdapAlbCa.SelectCommand = Comando
' LLenar la tabla
Try
' Limpiar la tabla, solo si procede
ObjDataSet.Tables("AlbCab").Rows.Clear() ' limpia la tabla
Catch ex As NullReferenceException
Finally
' Capturar el esquema de la clave principal desde la tabla origen
AdapAlbCa.FillSchema(Tabla, SchemaType.Source)
' LLenar la tabla
AdapAlbCa.Fill(Tabla)
End Try
Esta es cómoda y efectiva.
El sistema del DataTable se puede reservar para las tablas de trabajo que se crean en tiempo de
ejecución.
7