Boletín mugperu Digital - Julio 2009!
  Search 
Thursday, February 09, 2012 ..:: Foros de Discusión ::.. Register  Login
Foros MUGPERU Minimize
Subject: Adicionar Registros usando un DataAdapter
Prev Next
You are not authorized to post a reply.

Author Messages
DeveloperNet2005
Posts:18

07/07/2005 08:13 AM  

Estimados amigos

Tengo un Metodo de una Clase que me devuelve un DataTable y que luego quiero adicionar todos esos registros a una tabla. La BD es Access y estoy usando OLEDB. Si me pueden dar un ejemplo se los agradeceria mucho.

Saludos

DeveloperNet2005

 

 

richie_crazy57
Posts:203

07/07/2005 02:37 PM  

Hola, DeveloperNet 2005:

 

Rápidamente. Lo que tienes que hacer es iterar en la colección de filas del DataTable, y por cada una de las filas, llamar al método para insertar los campos en tu BD de MSAccess.

 

Te propongo un ejemplo simple:

 

Supongamos que cargas en el DataTable los datos devueltos por una consulta a la vista Products by Category de la base de datos Northwind de MSSQL. La estructura de esta vista es la siguiente:

 

CategoryName

DeveloperNet2005
Posts:18

07/07/2005 02:51 PM  

Gracias Richie

Pero, tambien me gustaria tambien tener un ejemplo de actualizar una tabla usando un DataAdapter y un Datatable.

Gracias y Saludos

 

richie_crazy57
Posts:203

07/07/2005 03:20 PM  

Hola otra vez, DeveloperNet:

 

Quiero ayudarte, pero necesito que expliques un poco mejor el escenario. Espero tus posts.

 

Bye.

 

Я!©ђ!Є ©Я∆ZΨ

DeveloperNet2005
Posts:18

07/07/2005 04:03 PM  

Ok Richie

Tengo una opcion donde debe leer un archivo XML que contiene una buena cantidad de Registros haciendo referencia a 2 Tablas donde una es una especie de tabla cabecera y la otra un detalle (como Cabecera y Detalle de una factura)  ese detalle es aprox 200 registro (5 campos x registro) , entonces este archivo XML puede venir la informacion de 5 o mas cabeceras con sus respecitvos detalle.

Entonces al leer el XML obtengo 2 Datatable y luego se los paso como parametro a un metodo para que los inserte a una tabla de una BD de Access entonces en este punto es donde tengo el problema como agregar esos registros usando un DataAdapter y Datatables, tu me distes un ejemplo usando un objeto Command, pero tambien quisiera evaluar con el DataAdapter, espero que este mas claro.

Saludos 

richie_crazy57
Posts:203

08/07/2005 10:10 AM  

Hola otra vez, DeveloperNet:

 

Una última consulta para poder imlementar bien la solución a tu problema: La estructura de los XMLs (y, por ende, de los DataTables obtenidos a partir de ellos) es igual a la estructura de la tabla de destino en la que deseas cargar los datos? Espero tu respuesta…

 

Bye.

Я!©ђ!Є ©Я∆ZΨ

DeveloperNet2005
Posts:18

08/07/2005 10:36 AM  

Hola Richie

Al principio no, porque habia campos en blanco y en la creacion del XML no los consideraba, luego le agrege el parametro en el metodo WriteXML para que grabe con  esquema entonces en el archivo XML se agrega la estructura de las tablas. Pero sigue sin considerar los campos en blanco en los nodos de los registros que crea.

Saludos

richie_crazy57
Posts:203

08/07/2005 10:53 AM  

Ok, DeveloperNet, voy a considerar ambos escenarios para evitar problemas, ok? Cuando lo tenga listo, te lo paso. Bye.

 

Я!©ђ!Є ©Я∆ZΨ

richie_crazy57
Posts:203

11/07/2005 12:43 PM  

Hola, DeveloperNet2005:

 

En primer lugar, disculpa por la demora, pero he estado un poco ocupado el fin de semana. Pero finalmente, ya tengo listo lo que necesitabas: un conjunto de rutinas para insertar en una base de datos de MSAccess los datos leídos a partir de un archivo XML. Y, tal como lo solicitaste, he implementado el caso en el que la estructura de los datos es idéntica a la de las tablas de MSAccess. Además, te adjunto el proyecto completo en el que desarrollé la solución, para que veas completamente cómo está estructurada, ya que muchas veces unos pequeños fragmentos de código no son suficientes.

 

Paso a detallarte el código utilizado. Empiezo con mis rutinas de ayuda. El siguiente método recibe 3 parámetros: un IDbCommand, un DataSet y un String. Ejecuta el comando (que puede utilizar el proveedor de datos OleDB o el de MSSQL, ya que heredan de IdbCommand, y tiene que ser una consulta de selección, o sea, “SELECT …”), carga los datos devueltos por la consulta en el DataTable con el nombre especificado por el String, y agrega el DataTable a la colección Tables del DataSet.

 

Private Sub LoadDataTable(ByVal cmd As IDbCommand, ByVal ds As DataSet, ByVal tableName As String)

    Try

        If TypeOf cmd Is SqlCommand Then

            Dim da As New SqlDataAdapter(cmd)

            da.Fill(ds, tableName)

        ElseIf TypeOf cmd Is OleDbCommand Then

            Dim da As New OleDbDataAdapter(cmd)

            da.Fill(ds, tableName)

        End If

    Catch ex As Exception

        ' Si se lanza alguna excepción, se muestra su mensaje correspondiente

        MsgBox(ex.Message)

    End Try

End Sub

 

De manera similar, el siguiente método recibe además de los 3 parámetros ya vistos, un objeto de tipo IDbDataAdapter. Fíjate que utiliza ByRef en vez de ByVal para el IdbDataAapter, puesto que al finalizar la ejecución del método, dicho objeto debe mantener la inicialización que se ejecuta en el cuerpo del método. De esta manera, el objeto DataAdapter utilizado para cargar los datos en el DataSet es externo al método y puede ser llamado luego, como veremos más adelante.

 

Private Sub LoadDataTable(ByVal cmd As IDbCommand, ByVal ds As DataSet, ByVal tableName As String, ByRef da As IDbDataAdapter)

    Try

        If TypeOf cmd Is SqlCommand Then

            da = New SqlDataAdapter(cmd)

            CTye(da, SqlDataAdapter).Fill(ds, tableName)

        ElseIf TypeOf cmd Is OleDbCommand Then

            da = New OleDbDataAdapter(cmd)

            CType(da, OleDbDataAdapter).Fill(ds, tableName)

        End If

    Catch ex As Exception

        ' Si se lanza alguna excepción, se muestra su mensaje correspondiente

        MsgBox(ex.Message)

    End Try

End Sub

 

Ahora, para el el siguiente fragmento de código, partimos de la premisa de que tenemos 2 objetos de tipo DataSet cargados: uno con los datos del XML, y otro con los de la base de datos de MSAccess. No voy a entrar en detalle ahora acerca de cómo cargar ambos DataSets, ya que está todo en el proyecto de prueba. El siguiente método hace exactamente lo que pides inserta los datos del XML en la base de datos de MSAccess utilizando objetos de tipo OleDbDataAdapter.

 

Private Sub btnTransferData1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTransferData1.Click

    Try

        ' Fusionamos los datos de dbDataSet1 con los de xmlDataSet1

        dbDataSet1.Merge(xmlDataSet1)

 

        ' Creamos los CommandBuilders respectivos a cada DataAdapter

        Dim cbMaster As OleDbCommandBuilder = New OleDbCommandBuilder(dbDataAdapterMaster1)

        Dim cbDetail As OleDbCommandBuilder = New OleDbCommandBuilder(dbDataAdapterDetail1)

 

        ' Creamos las referencias a las tablas que vamos a actualizar

        Dim dtMaster As DataTable = dbDataSet1.Tables("Orders")

  amp;nbsp;     Dim dtDetail As DataTable = dbDataSet1.Tables("OrderDetails")

 

        ' Actualizamos las tablas en el origen de datos (nuestra BD de MSAccess)

        CType(dbDataAdapterMaster1, OleDbDataAdapter).Update(dtMaster)

        CType(dbDataAdapterDetail1, OleDbDataAdapter).Update(dtDetail)

    Catch ex As Exception

        ' Si se lanza alguna excepción, se muestra su mensaje correspondiente

        MsgBox(ex.Message)

    End Try

End Sub

 

Como puedes apreciar, hacemos uso del método Merge de la clase DataSet. Este método combina un DataSet especificado y su esquema con el DataSet actual. De esta manera, la siguiente línea de código combina los datos y el esquema de dbDataSet1 con los de xmlDataSet1.

 

dbDataSet1.Merge(xmlDataSet1)

 

Finalmente, viene lo más fácil: simplemente tenemos que crear los CommandBuilders respectivos de los DataAdapters de las tablas que deseas actualizar en la base de datos…

 

Dim cbMaster As OleDbCommandBuilder = New OleDbCommandBuilder(dbDataAdapterMaster1)

Dim cbDetail As OleDbCommandBuilder = New OleDbCommandBuilder(dbDataAdapterDetail1)

 

… y llamar por último al método Update de los DataAdapters para que transfieran los cambios a la base de datos de MSAccess.

 

Dim dtMaster As DataTable = dbDataSet1.Tables("Orders")

Dim dtDetail As DataTable = dbDataSet1.Tables("OrderDetails")

 

No es muy complicado, como puedes apreciar. Más bien, cuando termine el otro escenario (en el que la estructura de las tablas es diferente), lo posteo para que lo revises. Quizás también sea útil.

 

Espero que haberte ayudado. Y ya sabes, si tienes alguna consulta con el proyecto de demostración, sólo avísame. Bye. Y suerte…

 

L Intenté adjuntar el proyecto a este post, pero sale un error. Si desean el proyecto de prueba, me escriben a mi coreo. Ok? Yo se los envío. Bye.

 

Я!©ђ!Є ©Я∆ZΨ

DeveloperNet2005
Posts:18

11/07/2005 01:12 PM  

Hola Richie gracias, mas bien el Proyecto me lo puedes enviar a DeveloperNet2005@Hotmail.com  gracias y te cuento como me fue.

Saludos

DeveloperNet2005

richie_crazy57
Posts:203

12/07/2005 10:35 AM  

Hola a todos:

 

Para facilitar las cosas, les envío un vínculo a mi proyecto de demostración:

  • De DataTable a MSAccess.zip (Ya no hay vínculo)

Si bien comparto los proyectos de manera libre, me gustaría que compartieran (conmigo y con los demás miembros de la comunidad) también las modificaciones que les hagan para así ir aprendiendo de manera colectiva.

 

Espero que les sirva. Cualquier consulta, me escriben. Bye.

 

Я!©ђ!Є ©Я∆ZΨ

roberth20032002
Posts:88

15/07/2005 03:00 PM  

Hola Richie, disculpa, el vinculo que pusistes para ver el proyecto que hicistes no abre, me sale que la pagina no existe. El punto que has tocado es muy interesante, por favor no seria una molestia si me lo envias a mi correo?

Por se acaso aqui esta mi correo robron22@hotmail.com, mil gracias de antemano

richie_crazy57
Posts:203

16/07/2005 10:06 AM  

Hola a todos:

 

Esta es una pequeña descripción de lo que encontrarán en el proyecto de demostración. Espero que les sea de utilidad.

 

Ya quité el vínculo al proyecto, dado que tenía funcionaba en mi PC gracias a que mi información de inicio de sesión estaba almacenada. Así que si lo desean o tienen alguna consulta, escríbanme al correo o a posteen aquí mismo, en este hilo del foro, yo estaré atento.

 

Como podrán apreciar al abrir el proyecto, el formulario consta de dos TabPages principales: uno ya está codificado (el del escenario de la estructura idéntica entre el XML y las tablas de MSAccess), el otro lo voy a completar en estos días.

 

Dentro de cada uno de esos TabPages verás 3 TabPages adicionales de detalle:

  • El primer tab permite crear los XMLs (para lo que tienes que tener acceso a un servidor MSSQL Server local. Este tab consultará las tablas Orders y Order Details de la base de
richie_crazy57
Posts:203

20/07/2005 03:48 PM  

Hola a todos:

Ahora sí, aquí está mi pequeño proyecto de demostración. Sus comentarios me los pueden mandar al correo o postearlos en este thread. Yo responderé lo más pronto posible. Espero que les guste y les sea útil!!! Hasta la próxima...

Я!©ђ!Є ©Я∆ZΨ

You are not authorized to post a reply.
Forums > Temas de Interés > Usando ADO.NET > Adicionar Registros usando un DataAdapter



ActiveForums 3.7
        
Copyright 2001-2012 MUGPERU   Terms Of Use  Privacy Statement