Problemas al actualizar con dataadapter

27/03/2006 - 10:39 por solusoft | Informe spam
Hola a todos.

Tengo un mantenimiento en Winforms, y utilizo un DataAdapter para realizar
las actualizaciones a la base de datos.

Mas o menos hago algo así:

System.Data.DataRow dr = null;
dr = dsMantenimiento.Tables[indiceTable].Rows[0];

dr.BeginEdit();

dr["DS_TITULO"] = DS_TITULO;
dr["NM_CANTIDAD"] = NM_CANTIDAD;
dr["FC_ENTRADA"] = vSqlFC_ENTRADA;
dr["NM_ESTADO"] = vSqlNM_ESTADO;
dr["CD_COPIA"] = vSqlCD_COPIA;
dr["NM_PRECIO"] = vSqlNM_PRECIO;

dr.EndEdit();

...
int numFilas = ds.Tables[indiceTable].Rows.Count;

bool tieneCambios = ds.HasChanges();

// No actualizar si no se producen cambios en el Dataset
if (!tieneCambios) return;

System.Data.DataSet dsCambios = ds.GetChanges();

int numActualizados = da.Update(dsCambios); // DataTable de nombre "Table"


numFilas = ds.Tables[indiceTable].Rows.Count;

ds.Merge(dsCambios, false);

ds.AcceptChanges();

numFilas = ds.Tables[indiceTable].Rows.Count;
Console.WriteLine("Num filas " + numFilas);


El caso que después de llamar a AcceptChanges(), el número de filas del
datatable (del ds) aumenta en uno, cuando se supone que he modificado sólo la
fila de la tabla. No entiendo porqué añade otra fila en el datatable.

Por qué puede ser ?

Saludos y gracias de antemano.

Preguntas similare

Leer las respuestas

#1 Diego \(DCD\)
27/03/2006 - 11:59 | Informe spam
Hola,

creo que no necesitas hacer el Merge de la fila cambiada, si no que al
referenciarla todos los cambios que haces en el DataRow se reflejan también
en el DataSet. Prueba a quitar el ds.Merge(dsCambios, false); y hacer
directamente del AcceptChanges();

Un saludo.


"solusoft" escribió en el mensaje
news:
Hola a todos.

Tengo un mantenimiento en Winforms, y utilizo un DataAdapter para realizar
las actualizaciones a la base de datos.

Mas o menos hago algo así:

System.Data.DataRow dr = null;
dr = dsMantenimiento.Tables[indiceTable].Rows[0];

dr.BeginEdit();

dr["DS_TITULO"] = DS_TITULO;
dr["NM_CANTIDAD"] = NM_CANTIDAD;
dr["FC_ENTRADA"] = vSqlFC_ENTRADA;
dr["NM_ESTADO"] = vSqlNM_ESTADO;
dr["CD_COPIA"] = vSqlCD_COPIA;
dr["NM_PRECIO"] = vSqlNM_PRECIO;

dr.EndEdit();

...
int numFilas = ds.Tables[indiceTable].Rows.Count;

bool tieneCambios = ds.HasChanges();

// No actualizar si no se producen cambios en el Dataset
if (!tieneCambios) return;

System.Data.DataSet dsCambios = ds.GetChanges();

int numActualizados = da.Update(dsCambios); // DataTable de nombre "Table"


numFilas = ds.Tables[indiceTable].Rows.Count;

ds.Merge(dsCambios, false);

ds.AcceptChanges();

numFilas = ds.Tables[indiceTable].Rows.Count;
Console.WriteLine("Num filas " + numFilas);


El caso que después de llamar a AcceptChanges(), el número de filas del
datatable (del ds) aumenta en uno, cuando se supone que he modificado sólo
la
fila de la tabla. No entiendo porqué añade otra fila en el datatable.

Por qué puede ser ?

Saludos y gracias de antemano.

Respuesta Responder a este mensaje
#2 solusoft
27/03/2006 - 12:20 | Informe spam
Muchas gracias, Diego.

Efectivamente era eso,

ds.Merge(dsCambios, false);
ó
ds.Merge(dsCambios);

Después de llamar a Merge, en número de Rows en el DataTable (del ds) pasaba
de una fila a dos filas, añadía siempre una.

Entonces, en qué casos hay que utilizar Merge ? Tampoco, en mi caso, tendría
sentido ds.GetChanges() ?? La verdad que en este tema sigo algo confuso.

Un saludo. Gracias de antemano.


"Diego (DCD)" escribió:

Hola,

creo que no necesitas hacer el Merge de la fila cambiada, si no que al
referenciarla todos los cambios que haces en el DataRow se reflejan también
en el DataSet. Prueba a quitar el ds.Merge(dsCambios, false); y hacer
directamente del AcceptChanges();

Respuesta Responder a este mensaje
#3 Diego \(DCD\)
27/03/2006 - 15:57 | Informe spam
Hola,

supongo que depende en qué contexto lo quieres utilizar. Yo tengo un
formulario donde el usuario mediante un filtro puede hacer busqueda por
ejemplo de artículos luego si quiero establecer ese filtro en el formulario
principal de artículos, lo único que tendría que hacer es un Merge. Si
quiero matener lo anterior, es decir si he realizado cambios que no quiero
que se pierdan hago como he dicho el Merge. Y si quiero eliminar todas las
modificaciones haría antes un DataSet.Clear() y luego el Merge con el
dataset que me devuelve el formulari de filtros.

Incluso si quieres obtener otro dataset haciendo un select de algunos
registros, también sería útil.

Espero te aclare algo.

Un saludo.



"solusoft" escribió en el mensaje
news:
Muchas gracias, Diego.

Efectivamente era eso,

ds.Merge(dsCambios, false);
ó
ds.Merge(dsCambios);

Después de llamar a Merge, en número de Rows en el DataTable (del ds)
pasaba
de una fila a dos filas, añadía siempre una.

Entonces, en qué casos hay que utilizar Merge ? Tampoco, en mi caso,
tendría
sentido ds.GetChanges() ?? La verdad que en este tema sigo algo confuso.

Un saludo. Gracias de antemano.


"Diego (DCD)" escribió:

Hola,

creo que no necesitas hacer el Merge de la fila cambiada, si no que
al
referenciarla todos los cambios que haces en el DataRow se reflejan
también
en el DataSet. Prueba a quitar el ds.Merge(dsCambios, false); y hacer
directamente del AcceptChanges();




email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida