Foros del Web » Programación para mayores de 30 ;) » .NET »

Problema con DataAdapter.Update()

Estas en el tema de Problema con DataAdapter.Update() en el foro de .NET en Foros del Web. Hola a tod@s! Tengo una tabla un archivo XML con la que quiero actualizar otra tabla de una base de datos SQL Server. Para hacer ...
  #1 (permalink)  
Antiguo 17/01/2005, 13:00
 
Fecha de Ingreso: marzo-2004
Ubicación: Valencia
Mensajes: 367
Antigüedad: 20 años, 1 mes
Puntos: 1
Problema con DataAdapter.Update()

Hola a tod@s!
Tengo una tabla un archivo XML con la que quiero actualizar otra tabla de una base de datos SQL Server. Para hacer esto primero cargo el XML en un dataset con el método writeXML y después con un SqlCommandBuilder y el método del dataAdapter Update() intento que actualice la tabla de la base de datos pero sólo consigo insertar las filas que no existen, si una fila ya existía en la base de datos también intenta insertarla en vez de actualizarla y me da error porque intenta inserta un fila con la misma clave primaria que una ya existente en la BD.

Os pongo un poco de código para ver si me entendéis mejor.


Código:
' Cargo los datos del XML en un dataset.
Dim ds As New DataSet
ds.ReadXmlSchema("archivo.xsd")
ds.ReadXml("archivo.xml")

Dim da As New SqlDataAdapter("SELECT * FROM Tabla", conex)
Dim cb As SqlCommandBuilder = New SqlCommandBuilder(da)
da.Update(ds, "Tabla")
Que podría hacer? alguna idea?

Gracias y saludos!!
  #2 (permalink)  
Antiguo 17/01/2005, 13:12
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 4 meses
Puntos: 7
Hola, supongo que ambas tablas tienen la misma estructura, siendo este el caso te falta asignar la propiedad UpdateCommand del DataAdapter para que se realize la actualización.

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #3 (permalink)  
Antiguo 17/01/2005, 14:07
 
Fecha de Ingreso: marzo-2004
Ubicación: Valencia
Mensajes: 367
Antigüedad: 20 años, 1 mes
Puntos: 1
Sí, tienen la misma estructura, podrías ponerme algún un ejemplo de como sería un UpdateCommand en una tabla simple de 2 columnas por ejemplo para que me haga una idea de como es?

Saludos.
  #4 (permalink)  
Antiguo 17/01/2005, 14:42
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 4 meses
Puntos: 7
Sería algo como esto, pero necesitas cuidar más detalles, espero que te sirva de base:
Código:
<%@ Page Language="VB" %>
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.Data.SqlClient" %>
<script runat="server">

    Dim command as New SqlCommand("select des from foo", _
                New SqlConnection("server=localhost;pwd=;uid=sa;database=test;"))
    Dim ds as New DataSet

    Sub cmdWrite_Click(sender As Object, e As EventArgs)
        Dim da as New SqlDataAdapter
        da.SelectCommand=command
        da.Fill(ds,"foo")
        Response.Write(Server.MapPath("./") & "/foo.xml")
        ds.WriteXml(Server.MapPath("./") & "/foo.xml")
    End Sub

    Sub cmdUpdate_Click(sender As Object, e As EventArgs)
        ds.Clear
        ds.ReadXML(Server.MapPath("./") & "/foo.xml")
        Dim da as New SqlDataAdapter
        command.Parameters.Add(New SqlParameter("@des",System.Data.SqlDbType.VarChar, 255, "des"))
        command.CommandText="update foo set des = @des"
        da.UpdateCommand=command
        command.CommandText="insert foo(des) values(@des)"
        da.InsertCommand=command
        da.Update(ds,"foo")
    End Sub

</script>
<html>
<head>
</head>
<body>
    <form runat="server">
        <asp:Button id="cmdUpdate" onclick="cmdUpdate_Click" runat="server" Text="Actualizar"></asp:Button>
        <asp:Button id="cmdWrite" onclick="cmdWrite_Click" runat="server" Text="Write XML"></asp:Button>
    </form>
</body>
</html>
Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #5 (permalink)  
Antiguo 18/01/2005, 11:02
 
Fecha de Ingreso: marzo-2004
Ubicación: Valencia
Mensajes: 367
Antigüedad: 20 años, 1 mes
Puntos: 1
Creo que el ejemplo me puede servir xknown, mañana pruebo y te cuento.

Muchas gracias y un saludo
  #6 (permalink)  
Antiguo 19/01/2005, 06:34
 
Fecha de Ingreso: marzo-2004
Ubicación: Valencia
Mensajes: 367
Antigüedad: 20 años, 1 mes
Puntos: 1
xknown, he estado probando creando los comandos "a mano" y también con un sqlCommanBuilder pero de las dos formas me pasa lo mismo:
Siempre intenta insertar TODA la tabla del dataset y claro, si la tabla de la base de datos está vacía no hay problema, lo inserta todo y ya está, pero si ya está llena (aunque sea con los mismos datos que tiene el dataset) los vuelve a intentar insertar y me da una excepción por intentar insertar una fila con la misma clave primaria que una existente.
Qué está pasando? por que no me funciona? por que no me inserta sólo las filas que no están en la base de datos?

A ver si me podéis echar una mano. Saludos
  #7 (permalink)  
Antiguo 19/01/2005, 08:17
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 4 meses
Puntos: 7
Hola de nuevo, lo que mencionas es natural que sea de esa forma ya que la fuente de donde estás leyendo los datos es otra (el archivo XML) y el "destino" de dichos datos es otra (la BD), la forma como trabaja el DataSet es que cuando se elimina, modifica o inserta una fila esta es marcada en RowState (Deleted, Modified, Added) y así sólo se actualiza los cambios hechos, pero como te decía anteriormente, ya que se leen los datos desde el archivo XML no se tienen ninguna relación directa con la base de datos, es por eso que ingresa todo de nuevo. Segun esto creo que tienes 2 opciones, la primera y mejor opción es que ya no trabajes con el archivo XML sino directamente con la Base de Datos para evitar los problemas que mencionas y la segunda opción es que guardes el archivo XML como resultado del método GetChanges del DataSet para evitar que los datos se inserten nuevamente (pero aquí todavía hay un problema, si es que un dato existente sólo fue modificado, entonces es de seguro que te mandará un error en la actualización)

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #8 (permalink)  
Antiguo 19/01/2005, 10:05
 
Fecha de Ingreso: marzo-2004
Ubicación: Valencia
Mensajes: 367
Antigüedad: 20 años, 1 mes
Puntos: 1
Gracias xknown, creo que ya voy entendiendo porque no me funcionaba, tendré que idear otra forma y abandonar el DataAdapter.Update porque lo que me comentas no lo voy a poder utilizar: No puedo dejar de utilizar XML y trabajar directamente con la base de datos porque esos datos XML vienen de una base de datos diferente de donde los quiero insertar, y lo de guardarlo como resultado del método GetChanges pues lo mismo.

Puede parecer un poco raro pero te explico, hay una aplicación (ajena a mí, adquirida por la empresa y de la que no tenemos el fuente) que trabaja con la base de datos añadiendo, modificando y eliminando datos de la misma y lo que intentamos es trasvasar periodicamente parte de esos datos a otra base de datos diferente, así que extraemos la información que necesitamos de las tablas, las guardamos en XML, las enviamos y añadimos los datos a la nueva BD.

No conocía bien el método Update, ya me parecía a mí demasiado "listo" para hacer una comparación entre la BD existente y el dataset e insertar y actualizar sólo lo que hiciera falta jeje.

Gracias por aclarármelo todo. Un saludo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:46.