miércoles, 19 de julio de 2017

OBJETO SQLDATAADAPTER.

https://es.slideshare.net/SILVA19_PAMELA/laboratorio-de-programacin-i-78071554

“AÑO DEL BUEN SERVICIO AL CIUDADANO”

TEMA: OBJETO SQLDATAADAPTER.

CURSO: LABORATORIO DE PROGRAMACIÓN I.

ESPECIALIDAD: INGENIERIA DE SISTEMAS Y TELEMATICA.

NOMBRE: GILDA  PAMELA

APELLIDO: SILVA  FLORES

DOCENTE: MARCO AURELIO  PORRO  CHULL.

CILCO: IV – A                                   AULA: 501

BAGUA GRANDE– PERÚ


2017



1.   Contenido

·        Definición

DataSet es una representación residente en memoria de datos que proporciona un modelo de programación relacional coherente e independiente del origen de datos. DataSet representa un conjunto completo de datos que incluye tablas, restricciones y relaciones entre las tablas.Dado que DataSet es independiente del origen de datos, DataSet puede incluir datos locales de la aplicación y datos de otros muchos orígenes. La interacción con los orígenes de datos existentes se controla mediante el DataAdapter.
La propiedad SelectCommand de DataAdapter es un objeto Command que recupera datos del origen de datos. Las propiedades InsertCommand, UpdateCommand y DeleteCommand de DataAdapter son objetos Command que permiten administrar las actualizaciones de los datos en el origen de datos para reflejar las modificaciones efectuadas en los datos de DataSet. Estas propiedades se describen más detalladamente enActualizar orígenes de datos con DataAdapters.
El método Fill de DataAdapter se usa para rellenar un objeto DataSet con los resultados del elemento SelectCommand de DataAdapter. Fill toma como argumentos un elemento DataSet que se debe rellenar y un objeto DataTable o el nombre del objeto DataTable que se debe rellenar con las filas que devuelve SelectCommand.

TENER EN CUENTA
Cuando utilizamos un objeto del tipo DataAdapter (por ejemplo SqlDataAdapter) éste se encarga de crear la conexión a la base de datos, abrir dicha conexión y después de actualizar los datos también se encarga de cerrar la conexión. Y lo importante es que NUNCA necesitamos un objeto Connection específico (e independiente) para hacer todo ese proceso de conexión, ya que el adaptador se encarga de todo ese tema por nosotros.
Pero para que todo esto de las transacciones con un DataAdapter funcione, lo mejor es crear nuestro objeto Connection para poder obtener la transacción por medio del método BeginTransaction (a lo mejor hay otra forma más fácil de hacerlo, pero esta es la que yo conozco y es la que te explico).
El segundo punto que debemos tener en cuenta es que si los comandos de actualización, inserción y eliminación los automatizamos con un objeto del tipo CommandBuilder tendremos que hacer un pequeño truco para que todo funcione como debe funcionar, ya que a esos comandos debemos asignarle el objeto Transaction que hemos obtenido por medio del método BeginTransaction de la conexión.
Si los comandos de actualización los creamos de forma manual, tendremos que hacer lo que te expliqué en el artículo anterior para asignar el objeto Transaction que cada comando debe usar. Aunque esto no es demasiado útil, al menos si queremos tener la "automatización" que nos da el modo desconectado... pero bueno, que sepas que se puede hacer.
En cualquier caso, solo debemos asignar el objeto de la transacción a los comandos INSERT, UPDATE y DELETE, pero no al de selección. Y si algunos de esos tres comandos no vamos a usarlo, por ejemplo porque no permitamos eliminar datos, no será necesario crear el comando correspondiente y por tanto no hay que asignarle nada... pero ante la duda... lo mejor es asignarlo a todos, al menos si usamos un objeto SqlCommandBuilder, para que no tengamos un error por falta de "previsión".


·        Propiedades

NOMBRE
DESCRIPCIÓN
Obtiene o establece un valor que indica si AcceptChanges se llama en un DataRow después de agregarlo a la DataTable durante alguno de los rellenar operaciones.(Heredado de DataAdapter).
Obtiene o establece si AcceptChanges se llama durante una Update. (Heredado de DataAdapter).
Obtiene IContainer que contiene Component. (Heredado de Component).
Obtiene o establece un valor que específica si generar una excepción cuando un error se produce durante una actualización de fila. (Heredado de DataAdapter).
Obtiene o establece una instrucción Transact-SQL o un procedimiento almacenado para eliminar registros del conjunto de datos.
Obtiene o establece una instrucción Transact-SQL o procedimiento almacenado para insertar nuevos registros en el origen de datos.
Determina la acción que se realizará cuando los datos de entrada no tienen una tabla o columna correspondiente. (Heredado de DataAdapter).
Obtiene o establece el comportamiento del comando utilizado para rellenar el adaptador de datos. (Heredado de DbDataAdapter).
Obtiene o establece el LoadOption que determina cómo rellena el adaptador el DataTable desde el DbDataReader.(Heredado de DataAdapter).



·        Métodos
NOMBRE
DESCRIPCIÓN
Crea un objeto que contiene toda la información relevante necesaria para generar a un proxy que se utiliza para comunicarse con un objeto remoto. (Heredado de MarshalByRefObject).
Libera todos los recursos que usa Component. (Heredado de Component).
Determina si el objeto especificado es igual al objeto actual. (Heredado de Object).
Agrega o actualiza filas en el DataSet. (Heredado de DbDataAdapter).
Agrega o actualiza filas en un intervalo especificado en el DataSet que coincidan con las de origen de datos utilizando el DataSet y DataTable
Agrega o actualiza filas en el DataSet que coincidan con las de origen de datos utilizando el DataSet y DataTable nombres.(Heredado de DbDataAdapter).
Agrega o actualiza filas en un intervalo especificado en el DataSet que coincidan con las de origen de datos utilizando el DataTable nombre. (Heredado de DbDataAdapter).
Agrega o actualiza filas en un DataTable que coincidan con las del origen de datos, empezando en el registro especificado y recuperar hasta el número máximo especificado de registros. (Heredado de DbDataAdapter).
Agrega una DataTable denominada "Table" para el DataSet especificado y configura el esquema para que coincida con el origen de datos basado en el SchemaType especificado.(Heredado de DbDataAdapter).
Agrega un elemento DataTable denominado "Table" para el elemento DataSet especificado y configura el esquema para que coincida con el del origen de datos basado en los elementos especificados SchemaType y DataTable.(Heredado de DbDataAdapter).
Configura el esquema del elemento DataTable especificado en función del elemento SchemaTypeespecificado. (Heredado de DbDataAdapter).
Obtiene los parámetros establecidos por el usuario al ejecutar una instrucción SELECT de SQL. (Heredado de DbDataAdapter).
Sirve como la función hash predeterminada. (Heredado de Object).
Recupera el objeto de servicio de duración actual que controla la directiva de duración de esta instancia. (Heredado de MarshalByRefObject).
Obtiene el Type de la instancia actual.(Heredado de Object).
Obtiene un objeto de servicio de duración para controlar la directiva de duración de esta instancia. (Heredado de MarshalByRefObject).
Restablece FillLoadOption a su estado predeterminado y causas DataAdapter.Fill respetando AcceptChangesDuringFill.(Heredado de DataAdapter).
Determina si el AcceptChangesDuringFill debe persistir la propiedad. (Heredado de DataAdapter).
Determina si el FillLoadOption debe persistir la propiedad. (Heredado de DataAdapter).
Devuelve un String que contiene el nombre de la Component, si existe. Este método no se debe invalidar. (Heredado de Component).
Actualiza los valores de la base de datos mediante la ejecución de las instrucciones INSERT, UPDATE o DELETE respectivas para cada inserta, actualiza o elimina la fila de la matriz especificada en el DataSet. (Heredado de DbDataAdapter).
Actualiza los valores de la base de datos mediante la ejecución de las instrucciones INSERT, UPDATE o DELETE respectivas para cada inserta, actualiza o elimina la fila de la manera especificada DataSet. (Heredado de DbDataAdapter).
Actualiza los valores de la base de datos mediante la ejecución de las instrucciones INSERT, UPDATE o DELETE respectivas para cada uno de ellos insertarlos, actualizarlos o fila eliminada de la DataSet con los valores especificados DataTable nombre.(Heredado de DbDataAdapter).
Actualiza los valores de la base de datos mediante la ejecución de las instrucciones INSERT, UPDATE o DELETE respectivas para cada inserta, actualiza o elimina la fila de la manera especificada DataTable. (Heredado de DbDataAdapter).


·        Ejemplos
Paso 1. Creamos el adaptador (y la conexión y el objeto Connection)
El comando SELECT es necesario para que el CommandBuilder sepa cómo debe crear los comandos.
' La cadena de conexión
Dim csb As New SqlConnectionStringBuilder
With csb
   ' El servidor al que nos conectamos
    .DataSource = "(local)\SQLEXPRESS"
    ' La base de datos que vamos a usar
    .InitialCatalog = "prueba"
    ' Usamos la seguridad integrada
    .IntegratedSecurity = True
End With

' Creamos la conexión
' la ponemos dentro de Using para asegurarnos de que se cierre si hay errores
Using con As New SqlConnection(csb.ConnectionString)

    Dim dt As New DataTable

    ' Creamos el adaptador usando el objeto Connection
    Dim da As New SqlDataAdapter("SELECT * FROM Table1", con)
    da.MissingSchemaAction = MissingSchemaAction.AddWithKey

Paso 2. Creamos los comandos y los asignamos al adaptador, si no lo hacemos de esta forma, al intentar acceder a los comandos desde el objeto del DataAdapter... obtendremos un error indicando que no están creados (son nulos).
' Creamos los comandos con el CommandBuilder
Dim cb As New SqlCommandBuilder(da)

' pero para asignarle el objeto Transaction debemos
' obtenerlos por medio de los métodos Get...Command
' ya que si intentamos acceder directamente a esos comandos
' del adaptador nos indicará que no están asignados (son nulos)
da.InsertCommand = cb.GetInsertCommand()
da.UpdateCommand = cb.GetUpdateCommand()
da.DeleteCommand = cb.GetDeleteCommand()

Paso 3. Abrimos la conexión y creamos el objeto Transaction llamando al método BeginTransaction, y asignamos ese objeto a cada uno de los comandos del adaptador, salvo al comando de selección.
' Abrimos la conexión
con.Open()

' Creamos el objeto Transaction
Dim tran As SqlTransaction = con.BeginTransaction

' Asignamos el objeto Transaction a los comandos
da.InsertCommand.Transaction = tran
da.UpdateCommand.Transaction = tran
da.DeleteCommand.Transaction = tran

Paso 4. Dentro de un bloque Try/Catch (para detectar los errores) es cuando actualizamos los datos llamando al método Update del adaptador. Es importante que la conexión siga abierta, ya que el objeto de la variable tran depende de esa conexión, pero el adaptador no depende directamente de la conexión abierta en la variable con, ya que el adaptador gestiona por su cuenta las conexiones y si ve que está cerrada, la abrirá, pero esa apertura es independiente del objeto que hemos usado para indicarle cuál es la conexión que debe usar... ¡un lío! pero es así...
Hay que tener en cuenta que la "aceptación" de los cambios del DataTable (o DataSet) se hace de forma independiente de la llamada a los métodos Commit (o Rollback) del objeto Transaction. En el caso de que todo vaya bien, el propio método Update del adaptador se encarga de decirle a la tabla que acepte los cambios, por tanto no es necesario llamar de forma explícita al método AcceptChanges, ya que esa es la forma "predeterminada" de actuar (lee el comentario del código si quieres saber algo más de esto... y, por supuesto, después te lees la documentación para informarte mejor, que con un par de líneas de comentarios no lo vas a aprender todo).
Cuando se cancela la actualización (en el bloque Catch del ejemplo), se hace una llamada al método Rollback del objeto Transaction, y también podrías llamar al método RejectChanges de la tabla, pero esto supondría perder TODAS las modificaciones que hayas hecho en los datos que están en memoria. Y debido a que esos datos están en memoria, puedes volver a actualizarlos posteriormente si así lo consideras necesario. Nuevamente te invito a que leas los comentarios del código para que veas qué debes hacer.
Try
    ' Para probar con un error
    If chkProducirError.Checked Then
        Throw New Exception("Candemore")
    End If
   ' Actualizamos los datos de la tabla
    da.Update(dt)
   ' Si llega aquí es que todo fue bien,
    ' por tanto, llamamos al método Commit
    tran.Commit()
   ' Esto no es necesario si dejamos el valor predeterminado
    ' de la propiedad AcceptChangesDuringUpdate del adaptador
    dt.AcceptChanges()

    txtInfo.Text = "Se han actualizado los datos"


Catch ex As Exception
    ' Si hay error, desahacemos lo que se haya hecho
    tran.Rollback()

    ' Desechar los cambios del DataTable
    ' si así lo estimamos oportuno,
    ' pero esto obligará a volver a añadir, modificar o eliminar
    ' nuevamente los datos.
    ' Por tanto, solo debemos hacerlo si no intentaremos nuevamente
    ' la actualización de los datos.
    ' Yo preguntaría al usuario antes de hacerlo...
    'dt.RejectChanges()


    txtInfo.Text = "ERROR: " & vbCrLf & ex.Message
End Try

Paso 5. Finalmente cerramos la conexión, aunque no es necesario hacerlo de forma explícita ya que al incluir el objeto Connection dentro de un bloque Using, se cerrará automáticamente.
    ' Cerramos la conexión,
    ' aunque no es necesario ya que al finalizar
    ' el using se cerrará
    con.Close()
End Using


1.   Resumen

Representa un conjunto de comandos de datos y una conexión de base de datos que se utilizan para rellenar un DataSet y actualizar una base de datos de SQL Server. Esta clase no se puede heredar. SqlDataAdapter, Se utiliza como un puente entre DataSet y SQL Server para recuperar y guardar datos. SqlDataAdapter proporciona este puente mediante la asignación de Fill, que cambia los datos en DataSet para que coincidan con los datos del origen de datos; y Update, que cambia los datos en el origen de datos para que coincidan con los datos en DataSet utilizando las instrucciones de Transact-SQL en el origen de datos adecuado.
DbDataAdapter.Fill. Rellena un objeto DataSet o un objeto DataTable.
DbDataAdapter.Update. Llama a las instrucciones INSERT, UPDATE o DELETE respectivas para cada fila insertada, actualizada o eliminada en DataSet.
Transact SQL .Es el lenguaje de programación que proporciona SQL Server para ampliar SQL con los elementos característicos de los lenguajes de programación: variables, sentencias de control de flujo.

En realidad no tiene mucho sentido hacer este tipo de comprobaciones de que todo va bien cuando usamos un adaptador, ya que la actualización (o modificación de los datos) se hace siempre en modo desconectado, por tanto siempre podemos comprobar que la información que hemos alterado está bien antes de hacer que se actualice la base de datos, pero... como siempre puede ocurrir cualquier imprevisto a la hora de que el adaptador ejecute los comandos correspondientes, pues no estará de más que tengamos esta forma de comprobar que esa actualización de datos se ha hecho de forma correcta, y lo mejor para comprobar que todo se hace bien es usando una transacción.




2.   Summary

Represents a set of data commands and a database connection that are used to populate a DataSet and update a SQL Server database. This class can not be inherited. SqlDataAdapter, Used as a bridge between DataSet and SQL Server to retrieve and save data. SqlDataAdapter provides this bridge by assigning Fill, which changes the data in the DataSet to match the data in the data source; And Update, which changes the data in the data source to match the data in the DataSet by using the Transact-SQL statements in the appropriate data source.
DbDataAdapter.Fill. Populate a DataSet object or a DataTable object.
DbDataAdapter.Update. Calls the respective INSERT, UPDATE, or DELETE statements for each row inserted, updated, or deleted in DataSet.
Transact SQL. It is the programming language that provides SQL Server to extend SQL with the characteristic elements of programming languages: variables, flow control statements.

Actually it does not make much sense to make these kind of checks that everything goes well when we use an adapter, since updating (or modifying the data) is always done in disconnected mode, so we can always verify that the information we have altered Is okay before making the database update, but ... as always can happen any unforeseen when the adapter executes the corresponding commands, it will not be bad if we have this way to verify that this update of Data has been done correctly, and the best thing to check that everything is done right is using a transaction.


3.   Recomendaciones

·         Si se va a utilizar procedimientos almacenados de SQL Server para editar o eliminar datos con DataAdapter, asegúrese de que no utiliza SET NOCOUNT ON en la definición del procedimiento almacenado. Esto hace que el recuento de filas afectadas vuelva a cero, lo que DataAdapter interpreta como un conflicto de simultaneidad.
·         Una InvalidOperationException se producirá si el Fill se llama al método y la tabla contiene un tipo definido por el usuario que no está disponible en el equipo cliente.
·         El SqlDataAdapter se utiliza junto con SqlConnection y SqlCommand para aumentar el rendimiento al conectarse a una base de datos de SQL Server.

4.   Conclusiones

El SqlDataAdapter, actúa como puente entre un DataSet y SQL Server para recuperar y guardar datos y proporciona este puente mediante la asignación de Fill, que cambia los datos en el DataSet coincidan con los datos del origen de datos, y Update, que cambia los datos del origen de datos coincidan con los datos en el DataSet, mediante las instrucciones de Transact-SQL adecuadas en el origen de datos.
La actualización se realiza por fila. Para cada fila insertada, modificada y eliminada, el Update método determina el tipo de cambio que se ha realizado en ella (Insert, Update, o Delete). Según el tipo de cambio que se haya ejecutado, el Insert, Update, o Delete plantilla del comando se ejecuta para propagar la fila modificada al origen de datos, cuando el SqlDataAdapter.
5.   Glosario de términos

Ø  Constructor (constructor) (C++). Una función miembro (método) con el mismo nombre de una clase en la que está definida. Un constructor se invoca para inicializar nuevas instancias de la clase. En C++ un constructor tiene el mismo nombre que su clase.
Class Text {
Public:
Text(); // constructor
};
En C++ el compilador llama a un constructor por defecto siempre que se define una instancia de una clase. Un tipo definido por el usuario (clase) puede tener más de un constructor, pero ninguno puede ser visual.
Ø  Constructor function (función constructor). La función miembro ejecutada cuando el programa declara una instancia de una clase.
Ø  Container class (clase recipiente o contenedora). Clases utilizadas como estructuras de datos que pueden contener un número de elementos.
Ø  Copy constructor (constructor de copia). Una función que inicializa un objeto como una copia de otro objeto.
Ø  Coupling (acoplamiento). Grado en el que los componentes independientes de un software se conectan. Contrasta con cohesión (cohesion).
Ø  CPU (Central Processing Unit). La parte de una computadora que ejecuta las instrucciones de máquina.
Ø  Data field (campo de datos). Una variable que está presente en cada objeto de una clase.
Ø  Data member (miembro dato) (C++.) Véase instance variable (variable de instancia). Características de un tipo. Un componente dato de una clase o una estructura.
Ø  Declaration (declaración). Una sentencia que anuncia la existencia de una variable, función o clase pero no la define. Especifica un nombre y tipo de identificador.
Ø  Default constructor (constructor por defecto). Un constructor que se puede invocar sin parámetros.




6.   Bibliografía o Linkografía

·        https://msdn.microsoft.com/es-es/.../system.data.sqlclient.sqldataadapter(v=vs.110).aspx
·        https://msdn.microsoft.com/es-es/library/bh8kx08z(v=vs.110).aspx
·        https://juanmaritoniadi.wordpress.com/2010/09/28/que-es-sqldataadapter/
·        https://es.slideshare.net/DEYSYSEGURAMONTENEGR/sqldataadapter
·        https://ja.scribd.com/presentation/234619358/DATAADAPTER-1
 https://es.scribd.com/document/.../Instructivo-Conexion-SQL-Server-Desde-NET
































No hay comentarios:

Publicar un comentario