Problema al actualizar BD desde DataSet

20/04/2005 - 17:10 por trinity.9bi | Informe spam
Hola,
he estado revisando los posts del grupo y he visto un mensaje con
(creo) el mismo titulo, pero no me ha resuelto la duda.

El caso es que creo que tengo todo puesto pero no consigo que se
actualice la base de datos con los cambios del DataSet. Lo que intento
hacer es lo siguiente:
En el DataSet "datos" tengo una tabla (obtenida con un simple "Select
*"). Como el Fill del DataSet no te crea claves, le pongo yo una
clave. Y una vez especificada la clave busco un par de registros y les
cambio el contenido. Con el DataSet ya modificado intento actualizar
la BD y es cuando no me funciona.

El codigo viene a ser:
//INICIO DE CODIGO
DataColumn [] clave = new DataColumn[1];
clave[0] = datos.Tables["Talleres"].Columns["IDTaller"];
datos.Tables["Talleres"].PrimaryKey = clave;

DataRow filaCambio = datos.Tables["Talleres"].Rows.Find("175");
filaCambio["Descripción"] = "Esto es un taller";

filaCambio = datos.Tables["Talleres"].Rows.Find("176");
filaCambio["Descripción"] = "Esto es otro taller";

int retorno = adaptador.Update(datos);
txtInformacion.Text = "Numero de filas actualizadas: " + retorno;
//FIN DE CODIGO

Y claro, el valor de "retorno" es cero.
He leido por ahi que hay que rellenar el UpdateCommand del Adapter,
pero no entiendo como hay que llenarlo. Si lo lleno con una sentencia
Update, entonces me puede afectar a varias filas que no deseo, y no
tengo forma de actualizar las filas tal y como lo hago a mano en el
DataSet.

Por favor, ¿alguien que me resuelva el problema?

Preguntas similare

Leer las respuestas

#6 trinity.9bi
25/04/2005 - 13:15 | Informe spam
Entonces con ponerle al Adapter la sentencia update que comentas mas
arriba bastaria para poder hacer las updates.

¿Y el SQLCommandBuilder que utiilidad tiene entonces?

Por cierto, lo del AddWithKey es una propiedad del Schema de la tabla
que cargas en el Dataset. Aunque aun no he hecho pruebas con ella
supongo que antes de hacer el Fill de la tabla X en el dataset habra
que cargar el Schema diciendole que lo haga con clave (es decir,
usando el addwithkeys). Si alguien me puede confirmar esto seria
estupendo.

Gracias.

Braulio Diez wrote in message news:...
Hola,

Aquà­ viene la mejor parte: no te hace falta llevar un control de los
cambios que se han hecho en el Dataset, el Dataset sólo lleva que cambios se
han hecho (cuales han sido inserciones y actualizaciones), el update lo àºnico
que hace es recorrer un datatable de ese dataset y dependiendo del estado que
tenga esa fila hacer un insert o un update.

Si te fijas, en un DataSet/Row puedes ver metodos/propiedades como
GetChanges (te devuelve las filas que han cambiado con respecto el Ds
original), AcceptChanges (para cuando una vez que actualizas los cambios en
BD estos los das ya por buenos)...

Esto de las DataSet al principio puede ser un poco complicado de entender
como funcionan, pero una vez que les pillas el truco es muy fà¡cil de manejar
y muy potente (lo àºnico malo es que para algunos escenarios es lento).

Saludos
Braulio


"EAmez" wrote:

> Gracias Braulio, ya he repasado tu primera respuesta y he descubierto
> que no la habia entendido bien. Lo siento.
> De todos modos, para hacerlo asi tendria que llevar un control de los
> cambios que ha habido en el dataset, ¿no? Y si se modifican muchos
> campos la sentencia de update supongo que habra que hacerla mas grande
> tambien.
>
>
> (EAmez) wrote in message news:...
> > Gracias Braulio, pero ya se que las sentencias update permiten la
> > actualizacion de varios campos. Sin embargo me parece que lo que no
> > permiten es actualizar un registro que tiene una clave de una manera,
> > y otro registro que responde a otra clave actualizarlo de otra manera.
> > Es decir, si tengo una tabla de Talleres identificados por su IDTAller
> > no puedo escribir una sentencia update que me actualice dos talleres
> > distintos de dos formas distintas. Eso tendria que hacerlo con dos
> > sentencias update.
> >
> > En cualquier caso, despues de postear mi mensaje ayer segui haciendo
> > pruebas y descubri que creando un SqlCommandBuilder y asociandolo a mi
> > SqlDataAdapter podia hacer adaptador.update(dataset, tabla) sin
> > problemas.
> >
> > Es decir, ahora consigo hacer lo que quiero pero no entiendo como ni
> > porque.
> >
> >
> > (EAmez) wrote in message news:...
> > > Hola,
> > > he estado revisando los posts del grupo y he visto un mensaje con
> > > (creo) el mismo titulo, pero no me ha resuelto la duda.
> > >
> > > El caso es que creo que tengo todo puesto pero no consigo que se
> > > actualice la base de datos con los cambios del DataSet. Lo que intento
> > > hacer es lo siguiente:
> > > En el DataSet "datos" tengo una tabla (obtenida con un simple "Select
> > > *"). Como el Fill del DataSet no te crea claves, le pongo yo una
> > > clave. Y una vez especificada la clave busco un par de registros y les
> > > cambio el contenido. Con el DataSet ya modificado intento actualizar
> > > la BD y es cuando no me funciona.
> > >
> > > El codigo viene a ser:
> > > //INICIO DE CODIGO
> > > DataColumn [] clave = new DataColumn[1];
> > > clave[0] = datos.Tables["Talleres"].Columns["IDTaller"];
> > > datos.Tables["Talleres"].PrimaryKey = clave;
> > >
> > > DataRow filaCambio = datos.Tables["Talleres"].Rows.Find("175");
> > > filaCambio["Descripci?n"] = "Esto es un taller";
> > >
> > > filaCambio = datos.Tables["Talleres"].Rows.Find("176");
> > > filaCambio["Descripci?n"] = "Esto es otro taller";
> > >
> > > int retorno = adaptador.Update(datos);
> > > txtInformacion.Text = "Numero de filas actualizadas: " + retorno;
> > > //FIN DE CODIGO
> > >
> > > Y claro, el valor de "retorno" es cero.
> > > He leido por ahi que hay que rellenar el UpdateCommand del Adapter,
> > > pero no entiendo como hay que llenarlo. Si lo lleno con una sentencia
> > > Update, entonces me puede afectar a varias filas que no deseo, y no
> > > tengo forma de actualizar las filas tal y como lo hago a mano en el
> > > DataSet.
> > >
> > > Por favor, ?alguien que me resuelva el problema?
>
Respuesta Responder a este mensaje
#7 Braulio Diez
26/04/2005 - 10:26 | Informe spam
Hola,

El AddwithKey hace que te cargue el daraset identificando la clave
primaria de forma automática (de hecho otra cosa muy interesante es que
puedes crear DataSets tipados con lo que puedes acceder a los campos de las
filas como si fuera un propiedad, eso te ahorra un montón de errores).

Aquí tienes un link que te explica como hacer el update usando los comandos:

(Inside ADO.NET Batch Update)

http://msdn.microsoft.com/library/d...082001.asp


y otro en Español

http://www.elguille.info/NET/ADONET/ejemploSQL.htm


Yo también me quede así cuando leí que teniendo la clave primaria ya
cargada podías actualizarlo directamente, siempre había utilizado la vía de
especificarle los metodos para actualizar, borrar..., también lo que pasa es
que puedes crearte datatables que no represente exactamente a una tabla de la
base de datos con lo que los update/insert... te los tienes que hacer tu.

Esto de ADO .net está muy bien, el problema es que conseguir un buen libro
sobre el tema no es fácil ya que la mayoría se hicieron cuando salió la Beta
2 de Visual studio 2002 y a la buya, pero es muy muy potente

Saludos
Braulio

"EAmez" wrote:

Entonces con ponerle al Adapter la sentencia update que comentas mas
arriba bastaria para poder hacer las updates.

¿Y el SQLCommandBuilder que utiilidad tiene entonces?

Por cierto, lo del AddWithKey es una propiedad del Schema de la tabla
que cargas en el Dataset. Aunque aun no he hecho pruebas con ella
supongo que antes de hacer el Fill de la tabla X en el dataset habra
que cargar el Schema diciendole que lo haga con clave (es decir,
usando el addwithkeys). Si alguien me puede confirmar esto seria
estupendo.

Gracias.

Braulio Diez wrote in message news:...
> Hola,
>
> Aquà­ viene la mejor parte: no te hace falta llevar un control de los
> cambios que se han hecho en el Dataset, el Dataset sólo lleva que cambios se
> han hecho (cuales han sido inserciones y actualizaciones), el update lo àºnico
> que hace es recorrer un datatable de ese dataset y dependiendo del estado que
> tenga esa fila hacer un insert o un update.
>
> Si te fijas, en un DataSet/Row puedes ver metodos/propiedades como
> GetChanges (te devuelve las filas que han cambiado con respecto el Ds
> original), AcceptChanges (para cuando una vez que actualizas los cambios en
> BD estos los das ya por buenos)...
>
> Esto de las DataSet al principio puede ser un poco complicado de entender
> como funcionan, pero una vez que les pillas el truco es muy fà¡cil de manejar
> y muy potente (lo àºnico malo es que para algunos escenarios es lento).
>
> Saludos
> Braulio
>
>
> "EAmez" wrote:
>
> > Gracias Braulio, ya he repasado tu primera respuesta y he descubierto
> > que no la habia entendido bien. Lo siento.
> > De todos modos, para hacerlo asi tendria que llevar un control de los
> > cambios que ha habido en el dataset, ¿no? Y si se modifican muchos
> > campos la sentencia de update supongo que habra que hacerla mas grande
> > tambien.
> >
> >
> > (EAmez) wrote in message news:...
> > > Gracias Braulio, pero ya se que las sentencias update permiten la
> > > actualizacion de varios campos. Sin embargo me parece que lo que no
> > > permiten es actualizar un registro que tiene una clave de una manera,
> > > y otro registro que responde a otra clave actualizarlo de otra manera.
> > > Es decir, si tengo una tabla de Talleres identificados por su IDTAller
> > > no puedo escribir una sentencia update que me actualice dos talleres
> > > distintos de dos formas distintas. Eso tendria que hacerlo con dos
> > > sentencias update.
> > >
> > > En cualquier caso, despues de postear mi mensaje ayer segui haciendo
> > > pruebas y descubri que creando un SqlCommandBuilder y asociandolo a mi
> > > SqlDataAdapter podia hacer adaptador.update(dataset, tabla) sin
> > > problemas.
> > >
> > > Es decir, ahora consigo hacer lo que quiero pero no entiendo como ni
> > > porque.
> > >
> > >
> > > (EAmez) wrote in message news:...
> > > > Hola,
> > > > he estado revisando los posts del grupo y he visto un mensaje con
> > > > (creo) el mismo titulo, pero no me ha resuelto la duda.
> > > >
> > > > El caso es que creo que tengo todo puesto pero no consigo que se
> > > > actualice la base de datos con los cambios del DataSet. Lo que intento
> > > > hacer es lo siguiente:
> > > > En el DataSet "datos" tengo una tabla (obtenida con un simple "Select
> > > > *"). Como el Fill del DataSet no te crea claves, le pongo yo una
> > > > clave. Y una vez especificada la clave busco un par de registros y les
> > > > cambio el contenido. Con el DataSet ya modificado intento actualizar
> > > > la BD y es cuando no me funciona.
> > > >
> > > > El codigo viene a ser:
> > > > //INICIO DE CODIGO
> > > > DataColumn [] clave = new DataColumn[1];
> > > > clave[0] = datos.Tables["Talleres"].Columns["IDTaller"];
> > > > datos.Tables["Talleres"].PrimaryKey = clave;
> > > >
> > > > DataRow filaCambio = datos.Tables["Talleres"].Rows.Find("175");
> > > > filaCambio["Descripci?n"] = "Esto es un taller";
> > > >
> > > > filaCambio = datos.Tables["Talleres"].Rows.Find("176");
> > > > filaCambio["Descripci?n"] = "Esto es otro taller";
> > > >
> > > > int retorno = adaptador.Update(datos);
> > > > txtInformacion.Text = "Numero de filas actualizadas: " + retorno;
> > > > //FIN DE CODIGO
> > > >
> > > > Y claro, el valor de "retorno" es cero.
> > > > He leido por ahi que hay que rellenar el UpdateCommand del Adapter,
> > > > pero no entiendo como hay que llenarlo. Si lo lleno con una sentencia
> > > > Update, entonces me puede afectar a varias filas que no deseo, y no
> > > > tengo forma de actualizar las filas tal y como lo hago a mano en el
> > > > DataSet.
> > > >
> > > > Por favor, ?alguien que me resuelva el problema?
> >

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