Cómo: Realizar actualizaciones masivas e inserciones mediante OpenXML con proveedores de .NET en .NET Visual C#

Para una versión de Microsoft Visual C++ .NET de este artículo, consulte 316245 .

En este artículo se refiere a los siguientes espacios de nombres de biblioteca de clases de Microsoft.NET Framework:

  • System.Data
  • System.Data.SqlClient

EN ESTA TAREA

Resumen

En este artículo paso a paso se describe cómo realizar inserciones masivas de y se actualiza con diferentes proveedores de datos .NET de Microsoft mediante el método OpenXML . Aunque el ejemplo de este artículo utiliza el proveedor administrado SqlClient, también puede utilizar OLEDB o el proveedor administrado de ODBC.

Requisitos

La lista siguiente describe el hardware, software, infraestructura de red y service packs recomendados que necesita:
  • Microsoft Windows 2000 Professional, Microsoft Windows 2000 Server, Microsoft Windows 2000 Advanced Server o Microsoft Windows NT 4.0 Server
  • Microsoft Visual Studio .NET
  • Microsoft SQL Server 2000

Crear el proyecto

  1. En SQL Server, cree una tabla con el código siguiente:
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Employee]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[Employee]
    GO

    CREATE TABLE [dbo].[Employee] (
    [EmployeeId] [int] NOT NULL ,
    [FirstName] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
    [LastName] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
    ) ON [PRIMARY]
    GO

  2. En SQL Server, cree un procedimiento almacenado con el siguiente código:
    CREATE PROC sp_UpdateXML @empdata nTextAS 
    DECLARE @hDoc int
    exec sp_xml_preparedocument @hDoc OUTPUT,@empdata

    --This code updates old data.
    UPDATE Employee
    SET
    Employee.FirstName = XMLEmployee.FirstName,
    Employee.LastName = XMLEmployee.LastName
    FROM OPENXML(@hDoc, 'NewDataSet/Employee')
    WITH (EmployeeId Integer, FirstName varchar(100), LastName varchar(100)) XMLEmployee
    WHERE Employee.EmployeeId = XMLEmployee.EmployeeId

    --This code inserts new data.

    Insert Into Employee
    SELECT EmployeeId, FirstName, LastName
    FROM OPENXML (@hdoc, '/NewDataSet/Employee',1)
    WITH (EmployeeId Integer, FirstName varchar(100), LastName varchar(100)) XMLEmployee
    Where XMLEmployee.EmployeeId Not IN (Select EmployeeID from Employee)

    EXEC sp_xml_removedocument @hDoc
    GO

  3. Inicie Visual Studio .NET y, a continuación, cree un nuevo proyecto de aplicación de consola en Visual .NET C#.
  4. Copie y pegue el código siguiente en Class1 de la aplicación de consola:
    using System;using System.Data.SqlClient;
    using System.Data;

    namespace ConsoleApplication1
    {
    /// <summary>
    /// Summary description for Class1
    /// </summary>
    class Class1
    {
    /// <summary>
    /// Main entry point for the application
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
    try
    {
    BulkInsertUpdate();
    System.Console.WriteLine("Successfully inserted and updated data");
    System.Console.Read();
    }
    catch (System.Data.SqlClient.SqlException e)
    {
    System.Diagnostics.Debug.WriteLine (e.Message);
    System.Console.WriteLine(e.Message);
    }
    }
    static void BulkInsertUpdate()
    {
    //Steps:
    //1. Create the dataset.
    //2. Update the dataset.
    //3. Insert some data.
    //4. Save the changed data as XML
    // and send XML to SQL Server through the stored procedure.

    //Declaration
    System.Data.DataSet objDS;
    SqlConnection objCon;
    SqlCommand objCom1;
    SqlDataAdapter objAdpt1;
    String sConn;
    sConn = "user id=myUser;password=YourPassword;" +
    "Database=YourDatabase;Server=YourServer";
    objDS = new DataSet();
    objCon = new SqlConnection(sConn);
    objCon.Open();
    objCom1 = new SqlCommand();
    objCom1.Connection = objCon;
    objAdpt1 = new SqlDataAdapter();


    //Step 1: Create the dataset.
    CreateDataSetFromEmployee(objDS, objCom1,objAdpt1);

    //Step 2: Update the dataset.
    System.Data.DataTable tbl = objDS.Tables["Employee"];
    //DataRow aRow;
    int i = 0;
    foreach (DataRow aRow in tbl.Rows)
    {
    i++;
    aRow["FirstName"] = aRow["FirstName"].ToString() + i;
    aRow["LastName"] = aRow["LastName"].ToString() + i;
    }

    //Step 3: Insert some data.
    for( int ii = 1; ii <= 5; ii++)
    {
    DataRow newRow = tbl.NewRow();
    int j = ii+100;
    newRow["EmployeeId"] = j;
    newRow["FirstName"] = "Fname" + j;
    newRow["LastName"] = "LName" + j;
    tbl.Rows.Add( newRow);
    }


    //Step 4: Save the changed data as XML,
    //and send the XML to SQL Server through the stored procedure.
    //In SQL Server, you wrote a stored procedure that
    //accepts this XML and updates the corresponding table.

    SaveThroughXML(objDS, objCon);
    }

    static void SaveThroughXML(DataSet objDS, SqlConnection objCon)
    {
    //Change the column mapping first.
    DataTable tbl = objDS.Tables["Employee"];
    System.Text.StringBuilder sb = new System.Text.StringBuilder( 1000);
    System.IO.StringWriter sw = new System.IO.StringWriter(sb);

    foreach( DataColumn col in tbl.Columns)
    {
    col.ColumnMapping = System.Data.MappingType.Attribute;
    }

    objDS.WriteXml(sw, System.Data.XmlWriteMode.WriteSchema);

    SqlCommand objCom = new SqlCommand();
    objCom.Connection = objCon;
    objCom.CommandType = CommandType.StoredProcedure;
    objCom.CommandText = "sp_UpdateXML";

    objCom.Parameters.Add( new SqlParameter( "@empdata",
    System.Data.SqlDbType.NText));
    objCom.Parameters[0].Value = sb.ToString();;
    objCom.ExecuteNonQuery();
    }

    static void CreateDataSetFromEmployee( DataSet objDS,
    SqlCommand objCom1,SqlDataAdapter objAdpt1)
    {

    //Create related objects.
    objCom1.CommandType = CommandType.Text;
    objCom1.CommandText = "Select EmployeeId, FirstName,LastName from Employee";

    //Fill the Orders table.
    objAdpt1.SelectCommand = objCom1;
    objAdpt1.TableMappings.Add("Table", "Employee");
    objAdpt1.Fill(objDS);
    }
    }
    }

  5. Modifique la cadena de conexión según corresponda para su entorno.
  6. Presione la tecla F5 para generar y ejecutar la aplicación.
  7. Presione la tecla ENTRAR para cerrar la ventana de consola cuando la aplicación deja de ejecutarse.
Nota: en este ejemplo no incluye tratamiento de errores.

Referencias

Para obtener información adicional acerca de cómo utilizar los proveedores administrados. NET, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

313480 INFO: Guía básica para proveedores de datos .NET
Propiedades

Id. de artículo: 315968 - Última revisión: 17 ene. 2017 - Revisión: 1

Comentarios