Cómo actualizar una base de datos de un objeto DataSet mediante Visual C++ .NET o Visual C++ 2005

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

En esta página

Resumen

Este artículo paso a paso muestra cómo tomar un DataSet que contiene datos (que se cargan desde una base de datos), cómo modificar los datos y cómo enviar a la base de datos para actualizar el origen original.

los objetos DataSet , una parte clave de acceso a datos en Microsoft .NET Framework, son objetos en memoria que pueden contener tablas, vistas y relaciones.

Requisitos

En la lista siguiente se describe el hardware, el software, la infraestructura de red y los service pack recomendados que se necesitarán:
  • Uno de los siguientes: Microsoft Windows 2000 Professional, Microsoft Windows 2000 Server, Microsoft Windows 2000 Advanced Server o Microsoft Windows NT 4.0 Server
  • Uno de los siguientes: Microsoft SQL Server versión 7.0, Microsoft SQL Server 2000 o Microsoft Data Engine (MSDE) con la base de datos PUBS de ejemplo instalado con permisos apropiados, UserID y contraseña de valores.
  • Microsoft Visual Studio .NET o Microsoft Visual Studio 2005
En este artículo se supone 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 desde un objeto DataSet

Esta sección muestra cómo utilizar el objeto DataSet para actualizar datos en una base de datos.

importante También puede utilizar un objeto SqlCommand para insertar, actualizar y eliminar datos en una base de datos directamente.

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

Para actualizar un DataSet y enviar las actualizaciones a la base de datos, siga estos pasos:
  1. Abra Microsoft Visual Studio .NET o Microsoft Visual Studio 2005.
  2. Cree una nueva Aplicación C++ administrada en Visual C++. NET. Visual Studio crea una función main() . Quite cualquier código generado de la función main() .
  3. Para agregar una referencia a los espacios de nombres System y System.Data , agregue el código siguiente
    #using <System.Dll>
    #using <System.Data.Dll>
    #using <System.Xml.Dll>
  4. Utilice la instrucción USING en los espacios de nombres System , System.Data y System.Data.SqlClient para que no se 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.
    using namespace System;
    using namespace System::Data;
    using namespace System::Xml;
    using namespace System::Data::SqlClient;
    
  5. Antes de poder modificar los datos y enviar que los cambios de nuevo a la base de datos, debe cargar la información en el DataSet .

    La cadena de conexión en el código siguiente señala a un servidor SQL Server que se encuentra en el equipo local (o el equipo donde se ejecuta el código). Reemplace esta cadena con su propia configuración.

    Para resumir, se crea una conexión y, a continuación, se crea un adaptador de datos, que se utiliza para rellenar el DataSet con datos.
    SqlConnection  *objConn;
    String *sConnectionString;
    sConnectionString = "Password=StrongPassword;User ID=UserName;Initial Catalog=pubs;Data Source=(local)";
    
    objConn = new SqlConnection(sConnectionString);
    objConn->Open();
            
    // Create an instance of a DataAdapter.
    SqlDataAdapter* daAuthors = new SqlDataAdapter("Select * From Authors", objConn);
    
    // Create an instance of a DataSet, and retrieve data from the Authors table.
    DataSet* dsPubs = new DataSet("Pubs");
    daAuthors->FillSchema(dsPubs,SchemaType::Source, "Authors");
    daAuthors->Fill(dsPubs,"Authors");
    
    Nota debe agregar common language runtime admite opción de compilador (/ CLR: oldSyntax) en Visual C++ 2005 para compilar correctamente el ejemplo de código anterior. Para agregar la opción de compilador de common language runtime compatibilidad en Visual C++ 2005, siga estos pasos:
    1. Haga clic en proyecto y, a continuación, haga clic en <ProjectName> propiedades .

      Nota <ProjectName> es un marcador de posición para el nombre del proyecto.
    2. Expanda Propiedades de configuración y, a continuación, haga clic en General .
    3. Haga clic para seleccionar compatible con Common Language Runtime, sintaxis antigua (/ CLR: oldSyntax) en la configuración de proyecto compatibilidad con Common Language Runtime en el panel derecho, haga clic en Aplicar y, a continuación, haga clic en Aceptar .
    Para obtener más información acerca de common language runtime admite (opción del compilador), visite el siguiente sitio Web de Microsoft:
    / clr (Common Language Runtime Compilation)
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
    Estos pasos se aplican el artículo completo.
  6. Ahora que los datos están cargados, ya puede modificarlos. Existen varias formas de agregar una fila (o un registro). Este ejemplo de código utiliza un procedimiento de tres pasos:
    1. Obtenga un nuevo objeto DataRow de DataTable .
    2. Establezca los valores de campo DataRow según sea necesario.
    3. Pase el objeto nuevo al método Add de la colección DataTable.Rows .

    Pegue el código siguiente después del código en el paso 5:
    // BEGIN ADD CODE 
    // Create a new instance of a DataTable.
    DataTable* tblAuthors = dsPubs->Tables->Item["Authors"];
    
    
    // Obtain a new DataRow object from the DataTable.
    DataRow* drCurrent = tblAuthors->NewRow();
    
    // Set the DataRow field values as necessary.
    drCurrent->set_Item("au_id",new String("993-21-3427"));
    
    drCurrent->set_Item("au_fname",new String("George"));
    drCurrent->set_Item("au_lname",new String("Johnson"));
    drCurrent->set_Item("phone",new String("800 226-0752"));
    drCurrent->set_Item("address", new String ("1956 Arlington Pl."));
    drCurrent->set_Item("city", new String("Winnipeg"));
    drCurrent->set_Item("state", new String("MB"));
    drCurrent->set_Item("contract",__box(1));
    
    // Pass that new object into the Add method of the DataTable.
    tblAuthors->Rows->Add(drCurrent);
    Console::WriteLine("Add was successful, Click any key to continue!!");
    Console::ReadLine();
    
    // END ADD CODE  
    
  7. Para modificar filas existentes, obtenga el objeto DataRow apropiado y, a continuación, proporcione nuevos valores de uno o más columnas. Debe buscar primero la fila correcta, que es mucho más fácil porque cargó el esquema de la tabla, así como los datos (la llamada a FillSchema en el paso 5). Con el esquema en su lugar, la tabla sabe qué columna es su clave principal y el método Find de la colección de filas está disponible.

    El método Find devuelve el objeto DataRow con un valor específico en su clave principal (en este caso, au_id). Una vez DataRow , se pueden modificar las columnas. No es necesario incluir las modificaciones en BeginEdit y EndEdit , pero esto simplifica el trabajo que el DataSet tiene que realizar y permite al DataSet realizar simultáneamente sus comprobaciones de validación cuando se llama a EndEdit .

    Pegue el código siguiente después del código en el paso 6:
    // BEGIN EDIT CODE 
    
    drCurrent = tblAuthors->Rows->Find(new String("213-46-8915"));
    drCurrent->BeginEdit();
    
    drCurrent->set_Item("phone",String::Concat(S"342",(static_cast<String *>(drCurrent->Item["phone"]))->Substring(3)));
    drCurrent->EndEdit ();
    Console::WriteLine("Record edited successfully, Click any key to continue!!");
    Console::ReadLine();
    
    // END EDIT CODE
    
  8. Para actualizar la base de datos original con todos estos cambios, pase el DataSet en el método Update del objeto DataAdapter .

    Sin embargo, antes de llamar a Update , deben establecer las propiedades InsertCommand , UpdateCommand y DeleteCommand del objeto DataAdapter . Puede escribir SQL y llenar estas tres propiedades con los objetos SqlCommand correspondientes manualmente, pero también puede utilizar Visual Studio .NET para generar estos tres comandos automáticamente.

    Para generar los comandos requeridos cuando son necesarios, debe crear una instancia del objeto SqlCommandBuilder y utilizar el DataAdapter en el constructor. Si desea utilizar este método (que se muestra en el ejemplo de código siguiente), debe tener la información de clave principal disponible para la tabla. Para tener acceso a información de clave principal, llame a FillSchema y, a continuación, establezca la propiedad MissingSchemaAction del DataAdapter en AddWithKey o establezca manualmente la clave principal en el código.

    Pegue el código siguiente después del código paso 7.
    // BEGIN SEND CHANGES TO SQL SERVER 
    
    SqlCommandBuilder* objCommandBuilder = new SqlCommandBuilder(daAuthors);
    daAuthors->Update(dsPubs, "Authors");
    Console::WriteLine("SQL Server updated successfully, Check Server explorer to see changes");
    Console::ReadLine();
    
    // END SEND CHANGES TO SQL SERVER 
    
  9. Para eliminar completamente una fila, utilice el método Delete del objeto DataRow .

    Nota La colección Rows contiene dos métodos, Remove y RemoveAt , que parecen eliminar la fila pero en su lugar simplemente quitar la fila de la colección. Sólo el método Delete envía su eliminación en la base de datos de origen.

    Pegue el código siguiente después del código en el paso 8:
    //BEGIN DELETE CODE 
    
    drCurrent = tblAuthors->Rows->Find(new String("993-21-3427"));
    drCurrent->Delete();
    Console::WriteLine("Record deleted successfully, Click any key to continue!!"); 
    Console::ReadLine();
    
    //END DELETE CODE  
    
  10. Envíe los cambios a SQL Server para quitar el registro que agregó anteriormente.

    Pegue el código siguiente después del código en el paso 9:
    // CLEAN UP SQL SERVER
    daAuthors->Update(dsPubs, "Authors");
    Console::WriteLine("SQL Server updated successfully, Check Server explorer to see changes");
    Console::ReadLine();
    objConn->Close ();
    
  11. Guardar el proyecto.
  12. En el menú Depurar , haga clic en iniciar para ejecutar el proyecto.

    Observe que aparecerán varios cuadros de mensajes que indican el progreso del código y le permiten examinar el estado actual de los datos a medida que avanza el código.


Lista de código completa

// This is the main project file for VC++ application project 
// generated using an Application Wizard.

#include "stdafx.h"

#using <mscorlib.dll>
#using <System.Dll>
#using <System.Data.Dll>
#using <System.Xml.dll>
#include <tchar.h>

using namespace System;
using namespace System::Xml;
using namespace System::Data;
using namespace System::Data::SqlClient;

// This is the entry point for this application
int _tmain(void)
{
    SqlConnection  *objConn;
    try
    {
        String *sConnectionString;
        sConnectionString = "Password=StrongPassword;User ID=UserName;Initial Catalog=pubs;Data Source=(local)";

        objConn = new SqlConnection(sConnectionString);
        objConn->Open();
        
        // Create an instance of a DataAdapter.
        SqlDataAdapter* daAuthors = new SqlDataAdapter("Select * From Authors", objConn);

        // Create an instance of a DataSet, and retrieve data from the Authors table.
        DataSet* dsPubs = new DataSet("Pubs");
        daAuthors->FillSchema(dsPubs,SchemaType::Source, "Authors");
        daAuthors->Fill(dsPubs,"Authors");

        // BEGIN ADD CODE 
        // Create a new instance of a DataTable.
        DataTable* tblAuthors = dsPubs->Tables->Item["Authors"];


        // Obtain a new DataRow object from the DataTable.
        DataRow* drCurrent = tblAuthors->NewRow();

        // Set the DataRow field values as necessary.
        drCurrent->set_Item("au_id",new String("993-21-3427"));

        drCurrent->set_Item("au_fname",new String("George"));
        drCurrent->set_Item("au_lname",new String("Johnson"));
        drCurrent->set_Item("phone",new String("800 226-0752"));
        drCurrent->set_Item("address", new String ("1956 Arlington Pl."));
        drCurrent->set_Item("city", new String("Winnipeg"));
        drCurrent->set_Item("state", new String("MB"));
        drCurrent->set_Item("contract",__box(1));

        // Pass that new object into the Add method of the DataTable.
        tblAuthors->Rows->Add(drCurrent);
        Console::WriteLine("Add was successful, Click any key to continue!!");
        Console::ReadLine();

        // END ADD CODE  
        
        // BEGIN EDIT CODE 

        drCurrent = tblAuthors->Rows->Find(new String("213-46-8915"));
        drCurrent->BeginEdit();

        drCurrent->set_Item("phone",String::Concat(S"342",(static_cast<String *>(drCurrent->Item["phone"]))->Substring(3)));
        drCurrent->EndEdit ();
        Console::WriteLine("Record edited successfully, Click any key to continue!!");
        Console::ReadLine();

        // END EDIT CODE

        // BEGIN SEND CHANGES TO SQL SERVER 

        SqlCommandBuilder* objCommandBuilder = new SqlCommandBuilder(daAuthors);
        daAuthors->Update(dsPubs, "Authors");
        Console::WriteLine("SQL Server updated successfully, Check Server explorer to see changes");
        Console::ReadLine();

        // END SEND CHANGES TO SQL SERVER 

        //BEGIN DELETE CODE 

        drCurrent = tblAuthors->Rows->Find(new String("993-21-3427"));
        drCurrent->Delete();
        Console::WriteLine("SRecord deleted successfully, Click any key to continue!!"); 
        Console::ReadLine();

        //END DELETE CODE  


        // CLEAN UP SQL SERVER
        daAuthors->Update(dsPubs, "Authors");
        Console::WriteLine("SQL Server updated successfully, Check Server explorer to see changes");
        Console::ReadLine();
    }
    catch (Exception* ex)
    {
        Console::WriteLine (ex->Message );
    }
    __finally
    {
        objConn->Close ();
    }
}


Referencias

Para obtener más información acerca de cómo utilizar ADO.NET, los objetos DataSet y SQL, visite los siguientes sitios Web de Microsoft:

Propiedades

Id. de artículo: 815660 - Última revisión: lunes, 19 de marzo de 2007 - Versión: 5.2
La información de este artículo se refiere a:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2002 Standard
Palabras clave: 
kbmt kbsystemdata kbsqlclient kbhowtomaster kbhowto KB815660 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 815660

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