Ejemplo de Acceso a Datos Con Una Base de Access

download Ejemplo de Acceso a Datos Con Una Base de Access

of 66

  • date post

    22-Nov-2014
  • Category

    Documents

  • view

    400
  • download

    6

Embed Size (px)

Transcript of Ejemplo de Acceso a Datos Con Una Base de Access

Ejemplo de acceso a datos con una base de AccessPublicado: 13/Jun/2002 Actualizado: 19/Abr/2003

En este ejemplo veremos cmo acceder a una base de datos de Access, usando los objetos del espacio de nombres OLEDB. Los conceptos que se tratarn sern los siguientes: - Crear una conexin a la base de datos. - Mostrar las tablas de la base de datos indicada. - Mostrar las columnas (o campos) de una tabla. - Crear un DataAdapter para acceder a los datos devueltos por una consulta. - Crear un DataSet basado en los datos asociados al DataAdapter. - Crear nuevos registros. - Modificar registros. - Eliminar registros. - Mostrar el contenido de la tabla en un control ListView.

Nota del 20/Jul/2002: He recibido varios mensajes diciendo que les daba error el ejemplo aqu puesto, he probado y efectivamente, me da error... le he puesto una captura (en el mtodo Conecta) y me muestra un error de que la cadena SQL no es vlida, pero si continuo, funciona bien. Aunque, he de aclarar que ese error se produce en el cdigo del ejemplo adjunto, si se deja el texto que por defecto tiene la caja de textos en la que se indica la cadena SQL, si se deja en blanco, no se produce error. He modificado el cdigo aqu mostrado, el cual puedes ver pulsando este link. Nota del 06/Ene/2006: Si este ejemplo te parece muy complicado, puedes ver otro ms simple.

Los objetos a usar en el proyecto.Los objetos que vamos a usar en este ejemplo, en su gran mayora residen en el espacio de nombres System.Data.OleDb, aunque tambin se usarn objetos genricos (DataSet, DataRow, DataColumn ) que residen en System.Data. Para que nos sea ms fcil declarar esos objetos, importaremos el espacio de nombres System.Data.OleDb y dado que usaremos procedimientos genricos, estos los incluiremos en un mdulo, al que llamaremos: ADONETUtil, veamos el cdigo con las declaraciones de los objetos que usaremos en el proyecto:

'----------------------------------------------------------------------------' Prueba de acceso a base de tipo Access con ADO.NET (25/May/02) ' Mdulo con las declaraciones de objetos ' ' Guillermo 'guille' Som, 2002 '-----------------------------------------------------------------------------

Imports System.Data.OleDb

Module ADONETUtil Friend dbConnection As OleDbConnection ' Friend dbDataTable As Data.DataTable Friend dbDataSet As Data.DataSet Friend dbDataAdapter As OleDbDataAdapter ' Friend CadenaConexion As String Friend CadenaSelect As String ' Friend ArchivoDatos As String Friend NombreTabla As String = "Tabla1" ' La variable CadenaConexion ser la cadena con la que conectaremos a la base de datos. La variable CadenaSelect ser el cdigo SQL que usaremos para acceder a la tabla de esa base de datos. La variable ArchivoDatos ser el nombre completo de la base de datos (Path incluido). La variable NombreTabla ser el nombre que usaremos para identificar a los datos que cargaremos en el objeto DataAdapter, ese nombre no tiene nada que ver con el nombre de la tabla a la que vamos a acceder, es slo un nombre que usaremos con los distintos objetos de ADO.NET.

Conectar a una base de datos del tipo AccessPara conectar a la base de datos y crear los objetos que cargarn la tabla (definida en la consulta SQL contenida en la variable CadenaSelect), vamos a crear un procedimiento en el mismo mdulo ADONETUtil:

Friend Sub Conectar( Optional ByVal nombreBaseDatos As String = "", _ Optional ByVal commandString As String = "")

If nombreBaseDatos = "" Then nombreBaseDatos = ArchivoDatos End If ArchivoDatos = nombreBaseDatos If ArchivoDatos = "" Then Exit Sub End If ' If CadenaSelect = "" Then CadenaSelect = "SELECT * FROM Table1" End If If commandString = "" Then commandString = CadenaSelect End If CadenaSelect = commandString ' CadenaConexion = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" ArchivoDatos ' Try dbConnection = New OleDbConnection(CadenaConexion) Catch e As Exception MessageBox.Show( "Error al crear la conexin:" & vbCrLf & e.Message) Exit Sub End Try ' dbConnection.Open() ' dbDataSet = New Data.DataSet() ' dbDataAdapter = New OleDbDataAdapter(CadenaSelect, dbConnection) ' &

Dim commandBuilder As New OleDbCommandBuilder(dbDataAdapter) ' dbDataAdapter.MissingSchemaAction = MissingSchemaAction.AddW ithKey 'dbDataAdapter.Fill(dbDataSet, NombreTabla) ' Cambio para comprobar que funciona, (20/Jul/02) ' En la versin Architect me da error, pero continua funcionando. ' Aunque el error lo da si se pasa una es correcta, cadena SQL que no

' por ejemplo, cuando se inicia la aplicacin y se deja el texto por defecto. Try dbDataAdapter.Fill(dbDataSet, NombreTabla) Catch ex As Exception MessageBox.Show("Error en Fill:" & vb CrLf & ex.Message) End Try ' End Sub A este procedimiento se le pueden indicar dos parmetros: El primero indicar el nombre de la base de datos (path incluido), mientras que el segundo ser la instruccin SQL que nos permitir acceder a la tabla. Cuando veamos el cdigo del formulario, tendremos ocasin de ver cmo se llama a este procedimiento. Lo que aqu tenemos que destacar es lo siguiente: La cadena de conexin que tenemos que usar para conectar con la base de datos es igual que la usada en las versiones anteriores de ADO, en esto no ha cambiado nada; se le indica el tipo de proveedor y el nombre de la base de datos. Creamos un nuevo objeto del tipo DataSet, que ser el que nos permita acceder a los datos. Creamos un objeto del tipo DataAdapter, este ser el que realmente nos permita acceder a los datos fsicos de la base de datos, primero para rellenar el DataSet y posteriormente para actualizar los cambios realizados en la base de datos. Es importante saber que los datos contenidos en el objeto DataSet estn en memoria y se acceden y manipulan de forma independiente, sin ninguna relacin directa con la base de datos original. Para que los cambios realizados en memoria se puedan reflejar de forma permanente en la base de datos, tenemos que usar el objeto DataAdapter. Una vez creado el DataAdapter, al que se le indica la cadena de seleccin y la cadena de conexin o el objeto del tipo Connection. En este caso, le he indicado el objetoConnection, pero si no queremos crear una conexin permanente, tambin podemos usar la misma cadena de conexin usada para crear el objeto Connection en lugar de ese objeto.

Para poder realizar cambios en la base de datos, hay que indicarle al DataAdapter los comandos SQL que habra que usar para aadir, modificar y eliminar, pero esos comandos se pueden crear de forma automtica creando un nuevo objeto del tipo CommandBuilder, al que se le pasar como parmetro el adaptador que usar dichos comandos, en realidad el objeto CommandBuilder no se usa nada ms que para que de esta forma se asignen dichos comandos de actualizacin de datos. Si la tabla a la que queremos acceder tiene clave principal (cosa que es comn o debera serlo en todas las tablas), le indicamos mediante la asignacin a la propiedadMissingSchemaAction el valor de aadir con clave. Si no hacemos esta asignacin y la tabla tiene un campo que se incrementa automticamente, no podramos crear varios registros (o filas) en memoria y despus actualizar esas nuevas filas de forma permanente, ya que nos dara un error de que hay duplicidad en el campo (o columna) autoincremental. Por ltimo, llenamos el objeto DataSet con los datos del DataAdapter, el segundo parmetro es el nombre que le vamos a dar a la tabla virtual (la que se crea en memoria), si no le damos un nombre a esa tabla virtual del DataSet, se asignar de forma predeterminada con el nombre Table. Es conveniente asignar un nombre, ya que un objeto DataSet permite tener en memoria distintos datos, de la misma o de otras tablas o consultas. Ese nombre ser el que usaremos para acceder a esos datos en memoria, ya que todos los accesos al contenido del DataSet, como he comentado antes, se realizan de forma desconectada, es decir sin relacin ninguna con la base de datos fsica.

Los nombres de las tablas de una base de datosVamos a crear una funcin que devuelva una matriz (o array) del tipo String, con los nombres de las tablas de la base de datos.

Friend Function NombresTablas() As String() Dim nomTablas() As String Dim dataTable As Data.DataTable Dim dbNull As System.DBNull Dim restrictions() As Object = {dbNull, dbNull, dbNull, "TABLE"} Dim i As Integer ' If dbConnection Is Nothing Then dbConnection = New Data.OleDb.OleDbConnection(CadenaConexion) End If If dbConnection.State ConnectionState.Open Then dbConnection.Open() End If

' dataTable = dbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, restrictions) i = dataTable.Rows.Count - 1 If i > -1 Then ReDim nomTablas(i) For i = 0 To dataTable.Rows.Count - 1 nomTablas(i) = dataTable.Rows(i).Item( "TABLE_NAME" ).ToString() Next End If ' Return nomTablas End Function Antes de llamar a esta funcin tendremos que tener asignada la cadena de conexin o, mejor an, creada la conexin a la base de datos. Eso es lo que se hace en las primeras lneas, si el objeto del tipo Connection no est creado, se crea un nuevo objeto, usando la cadena de conexin. En caso de que est creado el objeto, se comprueba si est abierta dicha conexin, de no ser as, se abre. A continuacin asignamos un objeto del tipo DataTable con el "esquema" de las tablas contenidas en la base de datos a la que apunta el objeto Connection. El "truco" para conseguir los nombres de las tablas, est en el array restrictions, particularmente en el cuarto elemento: "TABLE". Recorremos el contenido del objeto DataTable y accedemos a cada una de las filas cuyo elemento contenga la cadena "TABLE_NAME", el cual nos dar el nombre de cada una de las tablas. Ese nombre lo asignamos a cada uno de los elementos del array que estamos usando de forma interna, el cual ser el que la funcin devuelva.

Los nombres de los campos (o columnas) de una tablaPara saber los nombres de los campos o columnas de una tabla, usar