Cómo actualizar una base de datos a partir de un objeto DataSet mediante Visual Basic .NET

Seleccione idioma Seleccione idioma
Id. de artículo: 301248 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Los objetos DataSet, un componente fundamental para el acceso a datos en Microsoft .NET Framework, son objetos en memoria que pueden contener tablas, vistas y relaciones. En este artículo se demuestra cómo tomar un objeto DataSet que contiene datos (que se cargan de una base de datos), modificar esos datos y, a continuación, devolverlos a la base de datos para actualizar el origen original.

Requisitos

En la lista siguiente se describe el hardware, el software, la infraestructura de red y los Service Packs recomendados que necesitará:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server o Windows NT 4.0 Server
  • Microsoft SQL Server versión 7.0 ó 2000, o Microsoft Data Engine (MSDE) con la base de datos de ejemplo PUBS instalada
  • Microsoft Visual Studio .NET
  • Los permisos adecuados y los valores correctos para conectar con el equipo en el que se ejecuta SQL Server
En este artículo se da por supuesto que está familiarizado con los temas siguientes:
  • Terminología de base de datos
  • Lenguaje de consulta estructurado (SQL)

Cómo actualizar una base de datos a partir de un objeto DataSet

Esta sección demuestra cómo utilizar el objeto DataSet para actualizar los datos de una base de datos. Es importante recordar que también puede utilizar un objeto SqlCommand para insertar, actualizar y eliminar directamente los datos de una base de datos.

Como ayuda para entender este artículo, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
301216 Cómo llenar un objeto DataSet desde una base de datos mediante Visual Basic .NET
Algunos de los temas que se tratan en el artículo 301216 incluyen cómo recuperar los datos de una base de datos y en un objeto DataSet y cómo el objeto DataSet es independiente y distinto de la base de datos.

Una vez cargado el DataSet, puede modificar los datos y el DataSet realizará el seguimiento de los cambios. El objeto DataSet puede ser considerado una caché en-memoria de los datos que se recuperaron de una base de datos y que consta de una colección de tablas, relaciones y restricciones.

Para actualizar un objeto DataSet y devolver esas actualizaciones a la base de datos, siga estos pasos:
  1. Abra Microsoft Visual Studio .NET.
  2. Cree una nueva aplicación de consola en Visual Basic .NET. De forma predeterminada, Visual Studio crea un módulo estático y un procedimiento Main() vacío.
  3. Asegúrese de que el proyecto contiene una referencia a los espacios de nombres System y System.Data. Utilice la instrucción Imports de los espacios de nombres System, System.Data y System.Data.SqlClient para que no tenga que calificar las declaraciones de estos espacios de nombres más adelante en el código. Debe utilizar estas instrucciones antes que cualquier otra declaración.
    Imports System
    Imports System.Data
    Imports System.Data.SqlClient
    					
  4. Para poder modificar los datos y devolver los cambios a la base de datos, debe cargar la información en el objeto DataSet. Para consultar el procedimiento detallado, consulte el artículo 301216. Para evitar la duplicación, el código de este paso no se presenta en detalle.

    La cadena de conexión del código siguiente señala a un servidor SQL Server que se encuentra en el equipo local (el equipo en el que se está ejecutando el código). Reemplace esta cadena con su propia configuración, si es necesario. Para resumir, se crea una conexión y, a continuación, se crea un adaptador de datos que se utiliza para llenar el objeto DataSet con los datos.

    Nota: en el código de ejemplo que aparece en este artículo, debe cambiar UID =nombreDeUsuario y Contraseña =contraseñaSegura por los valores correctos. Asegúrese de que el identificador de usuario tiene los permisos apropiados para realizar esta operación en la base de datos.
    Dim sConnectionString As String
    
    
    ' Modify the following code to correctly connect to your SQL Server.
    sConnectionString = "Password=StrongPassword;User ID=UserName;" & _
                        "Initial Catalog=pubs;" & _
                        "Data Source=(local)"
    
    Dim objConn As New SqlConnection(sConnectionString)
    objConn.Open()
    
    ' Create an instance of a DataAdapter.
    Dim daAuthors As _
        New SqlDataAdapter("Select * From Authors", objConn)
    
    ' Create an instance of a DataSet, and retrieve data from the Authors table.
    Dim dsPubs As New DataSet("Pubs")
    daAuthors.FillSchema(dsPubs, SchemaType.Source, "Authors")
    daAuthors.Fill(dsPubs, "Authors")
    					
  5. Ahora que los datos están cargados, puede modificarlos. Hay muchas maneras de agregar una fila (o registro). Este ejemplo de código utiliza un procedimiento de tres pasos:
      • Obtenga un nuevo objeto DataRow del objeto DataTable.
      • Establezca los valores de campo del DataRow según corresponda.
      • Pase ese nuevo objeto en el método Add de la colección DataTable.Rows.

    Pegue el código siguiente después del código en el paso 4:
    '*****************
    'BEGIN ADD CODE 
    ' Create a new instance of a DataTable.
    Dim tblAuthors As DataTable
    tblAuthors = dsPubs.Tables("Authors")
    
    Dim drCurrent As DataRow
    ' Obtain a new DataRow object from the DataTable.
    drCurrent = tblAuthors.NewRow()
    
    ' Set the DataRow field values as necessary.
    drCurrent("au_id") = "993-21-3427"
    drCurrent("au_fname") = "George"
    drCurrent("au_lname") = "Johnson"
    drCurrent("phone") = "800 226-0752"
    drCurrent("address") = "1956 Arlington Pl."
    drCurrent("city") = "Winnipeg"
    drCurrent("state") = "MB"
    drCurrent("contract") = 1
    
    'Pass that new object into the Add method of the DataTable.Rows collection.
    tblAuthors.Rows.Add(drCurrent)
    MsgBox("Add was successful.")
    
    'END ADD CODE 
    					
  6. Para editar las filas existentes, obtenga el objeto DataRow adecuado y, a continuación, proporcione los nuevos valores para una o varias columnas. Debe encontrar primero la fila correcta, lo que es mucho más fácil porque cargó el esquema de la tabla además de los datos (la llamada a FillSchema en el paso 4). Con el esquema, la tabla sabe qué columna es su clave principal y el método Find de la colección Rows está disponible.

    El método Find devuelve el objeto DataRow con un valor concreto en su clave principal (en este caso, au_id). Cuando tenga ese DataRow, puede modificar las columnas. No tiene que ajustar las modificaciones en BeginEdit y EndEdit, pero esto simplifica el trabajo que el DataSet tiene que hacer y le permite realizar sus comprobaciones de validación todas a la vez en la llamada a EndEdit. Pegue el código siguiente después del código ADD:
    '*****************
    'BEGIN EDIT CODE 
    
    drCurrent = tblAuthors.Rows.Find("213-46-8915")
    drCurrent.BeginEdit()
    drCurrent("phone") = "342" & drCurrent("phone").ToString.Substring(3)
    drCurrent.EndEdit()
    MsgBox("Record edited successfully")
    
    'END EDIT CODE  
    					
  7. Para actualizar la base de datos original con todos estos cambios, pase el DataSet en el método Update del objeto DataAdapter.

    Sin embargo, para poder llamar a Update, debe establecer las propiedades InsertCommand, UpdateCommand y DeleteCommand del objeto DataAdapter. Puede escribir código SQL usted mismo y llenar estas tres propiedades con los objetos SqlCommand correspondientes, pero también puede utilizar Visual Studio .NET para generar estos tres comandos de forma automática.

    Para generar los comandos requeridos cuando se necesiten, debe crear una instancia del objeto SqlCommandBuilder y utilizar el DataAdapter en el constructor. Si desea utilizar este método, que se ilustra en el ejemplo de código, debe tener la información de la clave principal disponible para su tabla. Para tener acceso a la información de la clave principal, llame a FillSchema y, a continuación, establezca la propiedad MissingSchemaAction de su DataAdapter en AddWithKey, o establezca manualmente la clave principal en el código. Pegue el código siguiente después del código EDIT:
    '*****************
    'BEGIN SEND CHANGES TO SQL SERVER 
    
    Dim objCommandBuilder As New SqlCommandBuilder(daAuthors)
    daAuthors.Update(dsPubs, "Authors")
    MsgBox("SQL Server updated successfully" & chr(13) & "Check Server explorer to see changes")
    
    ' END SEND CHANGES TO SQL SERVER
    					
  8. Para eliminar completamente una fila, utilice el método Delete del objeto DataRow. Observe que la colección Rows contiene dos métodos, Remove y RemoveAt, que parece que eliminan la fila pero que sólo la quitan de la colección. Sólo el método Delete devuelve su eliminación de vuelta a la base de datos de origen. Pegue el código siguiente después del código SEND CHANGES TO SQL SERVER:
    '*****************
    'BEGIN DELETE CODE
    
    drCurrent = tblAuthors.Rows.Find("993-21-3427")
    drCurrent.Delete()
    MsgBox("Record deleted successfully")
    
    'END DELETE CODE
    					
  9. Envíe los cambios a SQL Server para quitar el registro que agregó anteriormente. Pegue el código siguiente después del código DELETE:
    '*****************
    ' CLEAN UP SQL SERVER
    daAuthors.Update(dsPubs, "Authors")
    MsgBox("SQL Server updated successfully" & Chr(13) & Chr(13) & "Check Server Explorer to see changes")
    					
  10. Guarde el proyecto.
  11. En el menú Depurar, haga clic en Iniciar y ejecute el proyecto. Observe que aparecen varios cuadros de mensaje, que indican el progreso del código y le permiten revisar el estado actual de los datos a medida que se ejecuta.

Código completo

Imports System
Imports System.Data
Imports System.Data.SqlClient

Module Module1

    Sub Main()
        Dim sConnectionString As String
        ' Modify the following code to correctly connect to your SQL Server.
        sConnectionString = "Password=StrongPassword;User ID=UserName;" & _
                            "Initial Catalog=pubs;" & _
                            "Data Source=(local)"

        Dim objConn As New SqlConnection(sConnectionString)
        objConn.Open()

        ' Create an instance of a DataAdapter.
        Dim daAuthors As _
            New SqlDataAdapter("Select * From Authors", objConn)

        ' Create an instance of a DataSet, and retrieve data from the Authors table.
        Dim dsPubs As New DataSet("Pubs")
        daAuthors.FillSchema(dsPubs, SchemaType.Source, "Authors")
        daAuthors.Fill(dsPubs, "Authors")

        '*****************
        'BEGIN ADD CODE 
        ' Create a new instance of a DataTable
        Dim tblAuthors As DataTable
        tblAuthors = dsPubs.Tables("Authors")

        Dim drCurrent As DataRow
        ' Obtain a new DataRow object from the DataTable.
        drCurrent = tblAuthors.NewRow()

        ' Set the DataRow field values as necessary.
        drCurrent("au_id") = "993-21-3427"
        drCurrent("au_fname") = "George"
        drCurrent("au_lname") = "Johnson"
        drCurrent("phone") = "800 226-0752"
        drCurrent("address") = "1956 Arlington Pl."
        drCurrent("city") = "Winnipeg"
        drCurrent("state") = "MB"
        drCurrent("contract") = 1

        'Pass that new object into the Add method of the DataTable.Rows collection.
        tblAuthors.Rows.Add(drCurrent)
        MsgBox("Add was successful.")

        'END ADD CODE    
        '*****************
        'BEGIN EDIT CODE

        drCurrent = tblAuthors.Rows.Find("213-46-8915")
        drCurrent.BeginEdit()
        drCurrent("phone") = "342" & drCurrent("phone").ToString.Substring(3)
        drCurrent.EndEdit()
        MsgBox("Record edited successfully")

        'END EDIT CODE   
        '*****************
        'BEGIN SEND CHANGES TO SQL SERVER

        Dim objCommandBuilder As New SqlCommandBuilder(daAuthors)
        daAuthors.Update(dsPubs, "Authors")
        MsgBox("SQL Server updated successfully" & chr(13) & "Check Server explorer to see changes")

        ' END SEND CHANGES TO SQL SERVER 
        '*****************
        'BEGIN DELETE CODE 

        drCurrent = tblAuthors.Rows.Find("993-21-3427")
        drCurrent.Delete()
        MsgBox("Record deleted successfully")

        'END DELETE CODE 
        '*****************
        ' CLEAN UP SQL SERVER
        daAuthors.Update(dsPubs, "Authors")
        MsgBox("SQL Server updated successfully" & Chr(13) & Chr(13) & "Check Server Explorer to see changes")
    End Sub

End Module
				

Referencias

Para obtener más información sobre cómo usar ADO.NET, los objetos DataSet y SQL, visite los siguientes sitios Web de Microsoft:
http://msdn.microsoft.com/es-es/library/ms810293.aspx

ADO.NET para el programador de ADO
http://msdn.microsoft.com/es-es/library/ms973217.aspx

Centro de desarrollo de MSDN Online .NET
http://msdn.microsoft.com/es-es/vstudio/aa496123
Nota: es un artículo de "PUBLICACIÓN RÁPIDA" creado directamente por la organización de soporte técnico de Microsoft. La información aquí contenida se proporciona como está, como respuesta a problemas que han surgido. Como consecuencia de la rapidez con la que lo hemos puesto disponible, los materiales podrían incluir errores tipográficos y pueden ser revisados en cualquier momento sin previo aviso. Vea las Condiciones de uso para otras consideraciones

Propiedades

Id. de artículo: 301248 - Última revisión: lunes, 27 de enero de 2014 - Versión: 1.0
La información de este artículo se refiere a:
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
Palabras clave: 
kbhowtomaster KB301248

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com