Tarea ADO.NET

Anuncio
H E R R A M I E N T A S AVA N Z A D A S D E D I S E Ñ O D E
S O F T WA R E
2007-2008
TA R E A 3
ADO.NET
GRUPO 24
SARA EGUILUZ
GARBIÑE LÓPEZ
IGARKI SAN MILLAN
CARMEN RODRIGUEZ
A D O. N E T
¿EN QUÉ CONSISTEN LOS MODOS (DE ACCESO A ORÍGENES DE DATOS) CONECTADO Y
DESCONECTADO?
3
 MODO DE ACCESO CONECTADO
 MODO DESCONECTADO
3
3
¿EN QUÉ CONSISTEN LOS OBJETOS CONNECTION, COMMAND Y TRANSACTION, PARA QUÉ
SE USAN?
3



OBJETO CONNECTION
PROPIEDADES
3
4
4
5
7
METODOS
OBJETO COMMAND
OBJETO TRANSACTION
EXECUTENONQUERY, EXECUTESCALAR, EXECUTEREADER
10
DESCRIBIR BREVEMENTE LA SEMÁNTICA DE ESTOS LOS MÉTODOS Y EXPLICAR PARA QUÈ SE UTILIZAN:
 EXECUTENONQUERY
- SINTAXIS
- EJEMPLO EXECUTENONQUERY VB
 EXECUTESCALAR
- SINTAXIS
- EJEMPLO EXECUTESCALAR VB
 EXECUTEREADER
- SINTAXIS
- EJEMPLO EXECUTEREADER
- EJEMPLO EXECUTEREADER CON STOREDPROCEDURE
 RESUMEN:
10
10
10
10
11
11
11
12
12
12
13
13
CLASES DATAREADER Y DATAADAPTER
14
DESCRIBIR PARA QUÉ SE UTILIZAN
INDICAR PARA QUÉSE UTILIZAN LOS SIGUIENTES MÉTODOS DE LA CLASE DATA ADAPTER: FILL, UPDATE
14
14
CLASES DATATABLE, DATASET Y DATAVIEW
16
DESCRIBIR SU FUNCIONALIDAD Y LA RELACIÓN QUE EXISTE ENTRE ELLAS
16
¿LOS CAMBIOS REALIZADOS SOBRE UNA DATATABLE AFECTAN, ADEMÁS DE A LA INFORMACIÓN EN
MEMORIA, A LA BASE DE DATOS ORIGINAL?
16
CUANDO SE HA CREADO UN DATAVIEW A PARTIR DE UN DATATABLE: ¿QUÉ EFECTO TIENE EL MÉTODO DELETE
SOBRE LA DATATABLE A PARTIR DE LA CUAL SE HA CREADO UNA DATAVIEW?
17
2
¿ E N Q U É C O N S I S T E N L O S M OD OS ( D E A C C E S O A OR Í G E N E S D E DA TOS )
C O N E C TA D O Y D E S C O N E C TA D O?

MODO DE ACCESO CONECTADO
Cuando se está en modo conectado se está continuamente interactuando con la BD a través
de consultas SQL ejecutadas explícitamente.
Algo a resaltar es que este tipo de acceso a la base de datos es que puede consumir grandes
recursos sacrificando el rendimiento al mantener conexiones abiertas a la base de datos.

MODO DESCONECTADO
Normalmente, cuando se recoge información de una Base de Datos es con el propósito de
realizar algún tipo de proceso con ella: mostrarla por pantalla, procesarla o enviarla a algún
componente. Con frecuencia, no sólo necesitaremos una sola fila, sino un conjunto de ellas. Y
también será frecuente que necesitemos información que se encuentre en más de una tabla (join
de tablas). Lo que hará la aplicación entonces será cargarlos y tratarlos como un bloque
compacto. Sería muy costoso/tedioso tener que conectar cada vez que queramos avanzar al
registro siguiente para recoger la información de dicho registro. . En un modelo desconectado, lo
que se hace para solucionar ese inconveniente es almacenar temporalmente toda la información
necesaria para poder trabajar posteriormente con ella. Esto es lo que representa un objeto DataSet
en el modelo ADO.NET.
ADO.NET utiliza un modelo de acceso pensado para entornos desconectados. Esto quiere
decir que la aplicación se conecta al origen de datos, hace lo que tiene que hacer, por ejemplo
seleccionar registros, los carga en memoria y se desconecta del origen de datos.
Como contrapartida a las ventajas que representa sobre el modo conectado hay que tener en
cuenta que el objeto/objetos DataSet que se crean para trabajar en modo desconectado
consumen memoria, por lo que en diversos entornos (como por ejemplo, cuando la base de datos
es muy extensa) no es recomendable este tipo de acceso.
Cada enfoque, modo conectado o desconectado, ofrece una serie de beneficios y desventajas.
La elección del enfoque depende en gran medida de las características de la arquitectura y las
plataformas que vayan a utilizarse para el intercambio de los datos.
¿ E N Q U É C O N S I S T E N L O S OB J E TO S C ON N EC T I ON , C OM M AND Y
T RA NS AC T I ON , PA R A QU É S E U S A N ?

OBJETO CONNECTION
El objeto Connection nos proporciona una conexión a una base de datos desde una página
ASP.
Para establecer la conexión lo primero que hacemos es crear el Objeto Connection por medio
de la propiedad CreateObject de objeto Server:
<% Set conexion=Server.CreateObject("ADODB.Connection")%>
Una vez establecida la instancia del objeto pasamos a configurarlo mediante sus distintas
propiedades y métodos.
3
-
PROPIEDADES
 ConnectionString
Especifica la referencia a la base de datos con la cual queremos conectar, conteniendo en una
cadena de texto la información necesaria para efectuar esa conexión mediante parejas de valores
separadas por ";".
Los valores que podemos asignar son:
Data Source:
Usuario:
Password:
DSN=Nombre ODBC de la Base de Datos
UID=Nombre de Usuario
PWD=Password del usuario para la base de datos
Ejemplo:
<% conexion.ConnectionString="DSN=MIOdbc;UID=pepe;PWD=1234" %>

Mode
Especifica los permisos de la conexión.
Algunos de los valores más habituales que podemos asignar son:
1
2
3
Establece permiso solo de Lectura
Establece permiso solo de Escritura
Establece permiso de Lectura/Escritura
Ejemplo:
<% conexion.Mode=3 %>
-
METODOS
 BeginTrans
Abre una transacción; todas las operaciones que realicemos a partir de ese momento no serán
efectivas hasta que no cerremos la transacción.
Ejemplo:
<% conexion.BeginTrans %>

Close
Cierra el objeto
4
Ejemplo:
<% conexion.close %>

CommitTrans
Cierra una transacción haciendo efectivos los cambios efectuados dentro de ella.
Ejemplo:
<% conexion.CommitTrans %>

Execute
Ejecuta una sentencia SQL contra la base de datos.
Ejemplo:
<% Set resultado=conexion.execute (Select * from amigos) %>

Open
Abre la conexión con los parámetros especificados en las propiedades.
Ejemplo:
<% conexion.open %>

RollBackTrans
Deshace todos los cambios efectuados en la base de datos desde el inicio de la transacción.
Ejemplo:
<% conexion.RollBackTrans %>

OBJETO COMMAND
Una vez establecida una conexión a un origen de datos, se pueden ejecutar comandos y devolver
resultados desde el mismo mediante un objeto Command. Para crear un comando, se utiliza el
constructor Command, que toma argumentos opcionales de una instrucción SQL para ejecutar en
el origen de datos, un objeto Connection y un objeto Transaction. También se puede crear un
comando para una determinada conexión mediante el método CreateCommand del objeto
5
Connection. La instrucción SQL del objeto Command se puede consultar y modificar mediante el
uso de la propiedad CommandText.
El objeto Command expone varios métodos Execute que se utilizan para llevar a cabo la
acción deseada. Cuando los resultados se devuelven en forma de secuencia de datos, se utiliza
ExecuteReader para devolver un objeto DataReader. ExecuteScalar sirve para devolver un valor
Singleton. ExecuteNonQuery se utiliza para ejecutar comandos que no devuelven filas.
A continuación se presenta las propiedades y métodos:

Propiedades públicas
Nombre
CommandText
Descripción
Obtiene o establece el comando de texto que se debe ejecutar en el
origen de datos.
CommandTimeout Obtiene o establece el tiempo de espera antes de terminar el intento de
ejecutar un comando y generar un error.
CommandType
Indica o especifica cómo se interpreta la propiedad CommandText.
Connection
Obtiene o establece el objeto DbConnection que utiliza este
DbCommand.
Container
Obtiene IContainer que contiene Component.(Se hereda de
Component).
DesignTimeVisible Obtiene o establece un valor que indica si el objeto de comando debe
estar visible en un control de interfaz personalizado.
Parameters
Obtiene la colección de objetos DbParameter.
Site
Obtiene o establece ISite de Component.(Se hereda de Component).
Transaction
Obtiene o establece la transacción DbTransaction en la que se ejecuta
este objeto DbCommand.
UpdatedRowSource Obtiene o establece cómo se aplican los resultados de un comando al
objeto DataRow cuando lo utiliza el método Update de un objeto
DbDataAdapter.

Métodos públicos
Nombre
Cancel
CreateObjRef
CreateParameter
Dispose
Equals
ExecuteNonQuery
ExecuteReader
Descripción
Intenta cancelar la ejecución de un objeto DbCommand.
Crea un objeto que contiene toda la información relevante
necesaria para generar un proxy utilizado para comunicarse con
un objeto remoto. (Se hereda de MarshalByRefObject).
Crea una nueva instancia de un objeto DbParameter.
Sobrecargado. Libera los recursos utilizados por el objeto
Component. (Se hereda de Component).
Sobrecargado. Determina si dos instancias de Object son iguales.
(Se hereda de Object).
Ejecuta una instrucción SQL en un objeto de conexión.
Sobrecargado. Ejecuta CommandText en Connection y devuelve un
objeto DbDataReader.
6
ExecuteScalar
Ejecuta la consulta y devuelve la primera columna de la primera
fila del conjunto de resultados que devuelve la consulta. Se omiten
todas las demás columnas y filas.
GetHashCode
Sirve como función hash para un tipo concreto. GetHashCode es
apropiado para su utilización en algoritmos de hash y en
estructuras de datos como las tablas hash. (Se hereda de Object).
GetLifetimeService
Recupera el objeto de servicio de duración actual que controla la
directiva de duración de esta instancia. (Se hereda de
MarshalByRefObject).
GetType
Obtiene el objeto Type de la instancia actual. (Se hereda de
Object).
InitializeLifetimeService Obtiene un objeto de servicio de duración para controlar la
directiva de duración de esta instancia. (Se hereda de
MarshalByRefObject).
Prepare
Crea una versión preparada (o compilada) del comando en el
origen de datos.
ReferenceEquals
Determina si las instancias de Object especificadas son la misma
instancia. (Se hereda de Object).
ToString
Devuelve un objeto String que contiene el nombre del objeto
Component, en caso de que exista. Este método no debe
reemplazarse. (Se hereda de Component).

OBJETO TRANSACTION
 Transacciones locales (ADO.NET)
Las transacciones de ADO.NET se utilizan cuando se desea enlazar varias tareas para que se
ejecuten como una sola unidad de trabajo. Por ejemplo, consideremos una aplicación que realiza
dos tareas. Primero, actualiza una tabla con información de pedidos y luego, actualiza una tabla
que contiene la información de inventario, cargando en cuenta los elementos pedidos. Si alguna
de las tareas da error, ambas actualizaciones se revierten.
Una transacción se considera local cuando consta de una única fase y es controlada
directamente por la base de datos. Las transacciones se consideran distribuidas cuando se
coordinan mediante un monitor de transacciones y utilizan mecanismos a prueba de errores
(como confirmación en dos fases) en la resolución de transacciones.
Cada proveedor de datos de .NET Framework tiene su propio objeto Transaction para realizar
transacciones locales. Para transacciones que se realicen en una base de datos de SQL Server, se
utiliza una transacción de System.Data.SqlClient. En transacciones de Oracle, se debe utilizar el
proveedor System.Data.OracleClient. La clase DbTransaction está disponible para la escritura de
código independiente del proveedor que requiere transacciones.
El tipo DbTransaction expone los siguientes miembros.
 Constructores
Nombre
Descripción
DbTransaction Inicializa un nuevo objeto DbTransaction.

Métodos
7
Nombre
Commit
Descripción
Confirma la transacción de base de datos.
Crea un objeto que contiene toda la información relevante necesaria
CreateObjRef
para generar un proxy utilizado para comunicarse con un objeto remoto.
(Se hereda de MarshalByRefObject).
Sobrecargado. Libera los recursos no administrados que utiliza
Dispose
DbTransaction y, opcionalmente, libera los recursos administrados.
Determina si el objeto Object especificado es igual al objeto Object
Equals
actual. (Se hereda de Object).
Permite que un objeto Object intente liberar recursos y realizar otras
Finalize
operaciones de limpieza antes de que el objeto Object sea reclamado por
el recolector de elementos no utilizados. (Se hereda de Object).
GetHashCode
Actúa como función hash para un tipo concreto. (Se hereda de Object).
Recupera el objeto de servicio de duración actual que controla la
GetLifetimeService
directiva de duración de esta instancia. (Se hereda de
MarshalByRefObject).
GetType
Obtiene el objeto Type de la instancia actual. (Se hereda de Object).
Obtiene un objeto de servicio de duración para controlar la directiva de
InitializeLifetimeService
duración de esta instancia. (Se hereda de MarshalByRefObject).
MemberwiseClone
Sobrecargado.
Rollback
Deshace una transacción desde un estado pendiente.
Devuelve una clase String que representa la clase Object actual. (Se
ToString
hereda de Object).

Propiedades
Nombre
Descripción
Connection
Especifica el objeto DbConnection asociado a la transacción.
DbConnection Especifica el objeto DbConnection asociado a la transacción.
IsolationLevel Especifica IsolationLevel para esta transacción.

Implementaciones explícitas de interfaces
Nombre
Descripción
Obtiene el objeto DbConnection asociado a la transacción, o una
IDbTransaction..::.Connection
referencia nula si la transacción ya no es válida.
 Realizar una transacción mediante ADO.NET
Con los objetos Connection y Transaction se puede comenzar una transacción, confirmarla y
deshacerla. Para realizar una transacción hay que seguir los siguientes pasos:
1. Se llama al método BeginTransaction del objeto Connection para indicar el comienzo
de la transacción. El método BeginTransaction devuelve una referencia a
8
Transaction. Esta referencia se asigna a los objetos Command inscritos en la
transacción.
2. El objeto Transaction se asigna a la propiedad Transaction del Command que se
desea ejecutar. Si se ejecuta un comando (Command) en una conexión (Connection)
que tiene una transacción (Transaction) activa y no se ha asignado el objeto
Transaction a la propiedad Transaction del objeto Command, se inicia una
excepción.
3. A continuación se ejecutan los comandos deseados.
4. Finalmente se llama al método Commit del objeto Transaction para completar la
transacción o al método Rollback para cancelarla.
En el ejemplo de código siguiente se muestra la lógica de las transacciones que se realizan
mediante ADO.NET con Microsoft® SQL Server™.
Dim myConnection As SqlConnection = New SqlConnection("Data
Source=localhost;Initial Catalog=Northwind;Integrated
Security=SSPI;")
myConnection.Open()
' Start a local Transaction.
Dim myTrans As SqlTransaction = myConnection.BeginTransaction()
' Enlist the Command in the current Transaction.
Dim myCommand As SqlCommand = myConnection.CreateCommand()
myCommand.Transaction = myTrans
Try
myCommand.CommandText = "Insert into Region (RegionID,
RegionDescription) VALUES (100, 'Description')"
myCommand.ExecuteNonQuery()
myCommand.CommandText = "Insert into Region (RegionID,
RegionDescription) VALUES (101, 'Description')"
myCommand.ExecuteNonQuery()
myTrans.Commit()
Console.WriteLine("Both records are written to database.")
Catch e As Exception
Try
myTrans.Rollback()
Catch ex As SqlException
If Not myTrans.Connection Is Nothing Then
Console.WriteLine("An exception of type " &
ex.GetType().ToString() & _
" was encountered while attempting to roll
back the Transaction.")
End If
End Try
Console.WriteLine("An exception of type " & e.GetType().ToString()
& _
"was encountered while inserting the data.")
Console.WriteLine("Neither record was written to database.")
Finally
myConnection.Close()
End Try
9
EX EC U T E NO N QU E RY , EX EC U T ESC AL A R , EX EC U T E RE AD E R
DESCRIBIR BREVEMENTE LA SEMÁNTICA DE ESTOS LOS MÉTODOS Y
EXPLICAR PARA QUÈ SE UTILIZAN:

EXECUTENONQUERY
-
SINTAXIS
Public Overrides Function ExecuteNonQuery As Integer
Ejecuta una instrucción de Transact-SQL en la conexión y devuelve el número de filas
afectadas.
Se puede utilizar ExecuteNonQuery para realizar operaciones de catálogo (por ejemplo,
consultar la estructura de una base de datos o crear objetos de base de datos como tablas) o para
cambiar la información de una base de datos ejecutando las instrucciones UPDATE, INSERT o
DELETE. De hecho, normalmente se utilizan para ejecutar instrucciones que no devuelven
ningún resultado, como las anteriormente citadas.
Para las instrucciones UPDATE, INSERT y DELETE el valor devuelto corresponde al
número de filas afectadas por el comando. Para el resto de instrucciones, el valor devuelto es -1.
Si se produce una operación de deshacer, el valor devuelto también es -1.
-
EJEMPLO EXECUTENONQUERY VB
' Agregar N datos de prueba,
' usando el procedimiento almacenado
sp_InsertarVariosDatosPrueba
' creado con Visual Basic.
' Este procedimiento almacenado a su vez usa:
sp_TotalFilasPrueba
Dim cnn As SqlConnection = Nothing
Dim cmd As SqlCommand = Nothing
'
LabelAgregar.Text = "Agregando datos..."
LabelAgregar.Refresh()
'
Try
cnn = New SqlConnection(My.Settings.cs_pruebasGuille)
cmd = New SqlCommand("sp_InsertarVariosDatosPrueba", cnn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@cuantos", SqlDbType.Int)
cmd.Parameters.Add("@hastaMesActual", SqlDbType.Bit)
cmd.Parameters("@cuantos").Value =
CInt(Me.txtCuantos.Text)
cmd.Parameters("@hastaMesActual").Value =
Me.chkHastaEstemes.Checked
cnn.Open()
cmd.ExecuteNonQuery()
10
LabelAgregar.Text = "Añadir datos de ejemplo (indica el
número):"
LabelStatus.Text = "Datos añadidos correctamente"
Catch ex As Exception
Me.LabelAgregar.Text = "Error: " & ex.Message
LabelStatus.Text = "ERROR"
Finally
If cnn IsNot Nothing AndAlso cnn.State <>
ConnectionState.Closed Then
cnn.Close()
End If
End Try

EXECUTESCALAR
-
SINTAXIS
Public Overrides Function ExecuteScalar As Object
Ejecuta la consulta y devuelve la primera columna de la primera fila del conjunto de
resultados que devuelve la consulta. Se omiten todas las demás columnas y filas.
Se debe utilizar el método ExecuteScalar para recuperar un único valor (por ejemplo, un valor
agregado) de una base de datos. Esto requiere menos código que el uso del método ExecuteReader
y la posterior realización de las operaciones necesarias para generar un único valor a partir de los
datos devueltos por un objeto SqlDataReader.
Por tanto, podemos deducir que ExecuteNonQuery se utiliza para ejecutar la mayoría de las
instrucciones de SQL que ejecutará algo en la base de datos, pero que no devolverá un valor. En
realidad, en algunos casos sí que devolverá un valor, pero será para indicarnos, por ejemplo, si
eliminamos varias filas de la tabla, devolverá el número de filas eliminadas.
Por otro lado, ExecuteScalar se utiliza cuando se tenga que ejecutar un código de SQL del que
queremos
recuperar
la
primera
columna
de
la
primera
fila.
Este método devuelve un valor de tipo Object que tendremos que convertir según el valor
devuelto. Por ejemplo, si queremos saber el número de registros (filas) de una tabla que cumple
cierto
criterio,
podemos
usar
un
comando
SQL
como
este:
SELECT Count(*) FROM Prueba WHERE FechaAlta >= @Param1
En este caso, el valor devuelto será del tipo Int32 y será el número de filas que hay en la tabla
Prueba de la base de datos indicada en el objeto Connection (que previamente habremos abierto)
que tenga una fecha igual o superior a la indicada en el parámetro proporcionado a ese comando.
Si no hay ninguna fila que cumpla ese criterio, devolverá cero.
-
EJEMPLO EXECUTESCALAR VB
Public Function AddProductCategory( _
ByVal newName As String, ByVal connString As String) As Integer
Dim newProdID As Int32 = 0
Dim sql As String = _
"INSERT INTO Production.ProductCategory (Name) VALUES (@Name); "
_
11
& "SELECT CAST(scope_identity() AS int);"
Using conn As New SqlConnection(connString)
Dim cmd As New SqlCommand(sql, conn)
cmd.Parameters.Add("@Name", SqlDbType.VarChar)
cmd.Parameters("@Name").Value = newName
Try
conn.Open()
newProdID = Convert.ToInt32(cmd.ExecuteScalar())
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End Using
Return newProdID
End Function

EXECUTEREADER
-
SINTAXIS
Public Function ExecuteReader As SqlDataReader
Envía la propiedad CommandText a Connection y crea un objeto SqlDataReader (clase que
permite leer un conjunto de registros avanzando únicamente hacia adelante).
Cuando la propiedad CommandType se establece en StoredProcedure, la propiedad
CommandText se debe establecer con el nombre del procedimiento almacenado. El comando
ejecuta este procedimiento almacenado cuando se llama al método ExecuteReader.
Cuando se utilizan versiones de SQL Server anteriores a SQL Server 2005, mientras se utiliza
SqlDataReader, la conexión SqlConnection estará atendiendo SqlDataReader. En este estado, no
se pueden realizar otras operaciones en la conexión SqlConnection, aparte de cerrarla. Esto es así
hasta que se llama al método Close de SqlDataReader. A partir de SQL Server 2005, la
característica Conjunto de resultados activo múltiple permite que varias acciones utilicen la
misma conexión.
-
EJEMPLO EXECUTEREADER
Public Sub CreateCommand(ByVal queryString As String, _
ByVal connectionString As String)
Using Connection As New SqlConnection(connectionString)
Connection.Open()
Dim Command As New SqlCommand(queryString, Connection)
Dim reader As SqlDataReader = Command.ExecuteReader()
While reader.Read()
Console.WriteLine("{0}", reader(0))
End While
End Using
End Sub
12
-
EJEMPLO EXECUTEREADER CON STOREDPROCEDURE
Dim nwindConn As SqlConnection = New SqlConnection("Data
Source=localhost;Integrated Security=SSPI;" & _
"Initial
Catalog=northwind")
Dim salesCMD As SqlCommand = New SqlCommand("SalesByCategory",
nwindConn)
salesCMD.CommandType = CommandType.StoredProcedure
Dim myParm As SqlParameter = salesCMD.Parameters.Add("@CategoryName",
SqlDbType.NVarChar, 15)
myParm.Value = "Beverages"
nwindConn.Open()
Dim myReader As SqlDataReader = salesCMD.ExecuteReader()
Console.WriteLine("{0}, {1}", myReader.GetName(0),
myReader.GetName(1))
Do While myReader.Read()
Console.WriteLine("{0}, ${1}", myReader.GetString(0),
myReader.GetDecimal(1))
Loop
myReader.Close()
nwindConn.Close()

RESUMEN:
Si el usuario espera obtener filas, se invoca al método ExecuteReader del comando, el cual
devuelve registros a un lector de datos. Si ejecuta un comando UPDATE, INSERT o DELETE,
llamará al método ExecuteNonQuery, el cual devuelve un valor que indica el número de filas
afectadas. Si realiza una función de agregado, como devolver el recuento de pedidos para un
cliente, se llama al método ExecuteScalar.
13
C L A S E S DA TA RE AD E R Y DA TA ADAPT E R
DESCRIBIR PARA QUÉ SE UTILIZAN
El objeto DataAdapter funciona como un puente entre el objeto DataSet (que representa los
datos obtenidos desde una fuente de datos en memoria) y dicha fuente de datos, proporcionando
los métodos necesarios para obtener y almacenar la información. Como se verá más tarde, es el
objeto DataAdapter el encargado de trasladar los cambios realizados sobre un DataSet a la base de
datos asociada a él.
Representando esta relación gráficamente,
INDICAR PARA QUÉSE UTILIZAN LOS SIGUIENTES MÉTODOS DE LA CLASE DATA
ADAPTER: FILL, UPDATE
El método Fill cambia los datos almacenados en un objeto DataSet para que sean acordes a
los datos en la fuente datos. Es decir, (literalmente) rellena el objeto DataSet que se le indique con
los datos correspondientes de la fuente de datos asociada.
El método Update tiene el efecto contrario, cambia los datos en la fuente de datos para que
sean acordes a los datos del objeto DataSet que los representan. Es decir, actualiza los cambios
que hayamos podido realizar en los datos del objeto DataSet en los datos correspondientes de la
fuente de datos asociada.
Ejemplo del uso de Fill():
En este ejemplo se muestran los pasos necesarios para conectarse a una base de datos y crear
un objeto DataSet que represente una de las tablas de la misma.
Private Sub ConnectToData()
Crea la conexión a la base de datos, y la denomina cnNorthwind
Dim cString As string = "Persist Security Info=False;Integrated
Security=SSPI;database=northwind;server=mySQLServer"
Dim cnNorthwind As SqlConnection
= new SqlConnection(cString)
Crea un objeto de tipo DataAdapter llamado adpSuppliers que actúa como puente entre la base de
datos y el futuro objeto DataSet que representará los datos de la base de datos que le indiquemos
al crearlo.
Dim adpSuppliers As SqlDataAdapter = new SqlDataAdapter()
Abre la conexión con la base de datos y asocia al objeto DataAdapter una sentencia de selección
que selecciona todas las filas de la tabla Suppliers (cmdSuppliers)
cnNorthwind.Open()
Dim cmdSuppliers As SqlCommand = _
new SqlCommand("SELECT * FROM Suppliers", cnNorthwind)
14
cmdSuppliers.CommandType = CommandType.Text
adpSuppliers.SelectCommand = cmdSuppliers
Crea un objeto DataSet y a través del método Fill del objeto adpSuppliers (de tipo DataAdapter)
“rellena” dicho DataSet con los datos provenientes del resultado de la consulta de selección
cmdSuppliers, es decir, todos los registros de la tabla Suppliers.
ds = New DataSet("Suppliers")
adpSuppliers.Fill(ds)
La siguiente instrucción nos permite posteriormente acceder a través del método Tables() del
DataSet a la tabla que denominaremos Suppliers mediante una instrucción del tipo
ds.Tables("Suppliers"). Es equivalente a llamar al método Fill pasándole como segundo argumento
el nombre de la tabla (adpSuppliers.Fill(ds,”Suppliers”)
adpSuppliers.TableMappings.Add("Table", "Suppliers")
End Sub
Ejemplo del uso de Update():
Una vez obtenido el objeto DataSet manipularemos los datos correspondientes y posteriormente
deberemos actualizar los cambios en la base de datos, para lo que utilizaremos el método update()
del objeto DataAdapter que corresponda.
Siguiendo con el ejemplo anterior, supongamos que queremos cambiar el nombre del supplier
con id=1001. Para ello creamos un objeto de tipo DataRow dr que nos permite iterar sobre las
filas de la tabla Suppliers y acceder a sus atributos.
Dim dr As DataRow
For Each dr In ds.Tables("Suppliers").Rows
If dr("ID") = 1001 Then
dr("name") = "pepe"
End If
Next dr
Para actualizar estos cambios en la base de datos:
1. ejecutamos el método getChanges() del DataSet para obtener un nuevo DataSet que refleje
los cambios acontecidos en el primero
2. invocamos al método update() del DataAdapter pasándole como parámetro el nuevo
DataSet creado en el paso 1 y (opcional) el nombre de la tabla a actualizar.
Dim ds2 As DataSet = ds.GetChanges()
adpSuppliers.Update(ds2, "Suppliers")
En resumen,
15
C L A S E S DA TA TA B L E , DATA S ET Y DA TAV I E W
DESCRIBIR SU FUNCIONALIDAD Y LA RELACIÓN QUE EXISTE ENTRE ELLAS
Como se ha mencionado con anterioridad, el objeto DataSet representa los datos obtenidos
desde una fuente de datos en memoria.
El objeto DataTable representa una tabla de datos en memoria.
El objeto DataView representa una vista personalizada de los datos de que representa un
objeto DataTable.
En resumen, los tres objetos son la manera que tiene el framework .net de representar en
memoria a una base de datos, una tabla y una vista de tabla, respectivamente.
El objeto DataView es utilizado principalmente para (asociado a controles de tipo Windows o
de tipo web) mostrar diferentes informaciones de una misma tabla. Por ejemplo, podríamos crear
dos vistas de la tabla pacientes, una para enfermeras/os y otra para los médicos, con información
de la misma tabla pero restringiendo los campos que unos y otros pueden visualizar (tal y como
se hace en lenguaje SQL), y mostrar una u otra según el tipo de usuario logueado en el sistema.
¿LOS CAMBIOS REALIZADOS SOBRE UNA DATATABLE AFECTAN, ADEMÁS DE A LA
INFORMACIÓN EN MEMORIA, A LA BASE DE DATOS ORIGINAL?
No, los cambios en una DataTable afectan, únicamente, a la copia de la información en
memoria.
Para actualizar la base de datos original es necesario un segundo paso, copiando los datos de
la memoria a la base de datos original. Para este segundo paso se puede hacer, por ejemplo,
llamando al método Update del TableAdapter.
16
CUANDO SE HA CREADO UN DATAVIEW A PARTIR DE UN DATATABLE: ¿QUÉ EFECTO
TIENE EL MÉTODO DELETE SOBRE LA DATATABLE A PARTIR DE LA CUAL SE HA
CREADO UNA DATAVIEW?
La eliminación de una fila mediante el método Delete de un objeto de tipo DataView , conlleva
la eliminación de esta misma fila en su DataTable subyacente. Estos cambios podrán ser
posteriormente aceptados o rechazados mediante la llamada a los métodos del objeto DataTable
que corresponda AcceptChanges (para aceptar los cambios) o RejectChanges (para rechazarlos).
Si AllowDelete tiene el valor true, puede eliminar filas en la DataView mediante el
método Delete del objeto DataView o DataRowView y las filas se eliminarán de la
DataTable subyacente. Más tarde puede confirmar o rechazar las eliminaciones mediante
AcceptChanges o RejectChanges, respectivamente. Cuando AllowDelete tiene el
valor false, se iniciará una excepción si llama al método Delete del objeto DataView o
DataRowView.
http://msdn2.microsoft.com/es-es/library/70k6287b.aspx
Referencias utilizadas:
Librería MSDN para DataSet, DataView y DataTable
http://msdn2.microsoft.com/en-us/library/system.data.dataset(VS.80).aspx
http://msdn2.microsoft.com/en-us/library/system.data.dataview(VS.71).aspx
http://msdn2.microsoft.com/en-us/library/system.data.datatable(VS.71).aspx
Artículo en BeanSoftware sobre los objetos DataSet y DataAdapter
http://www.beansoftware.com/ASP.NET-Tutorials/DataSet-DataAdapter.aspx
http://www.asptutor.com/asp/vart.asp?id=2
http://www.elguille.info/colabora/NET2005/perxi_introadonet.htm
17
Descargar