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

#1 Braulio Diez
21/04/2005 - 11:03 | Informe spam
Hola,

Sobre el update command, aquí te va un ejemplo (a lo bestia :-)) de como va:

DataAdapter...
DataAdapter.UpdateCommand.CommandText "UPDATE Table1 SET "
+ "Column2 = @Column2"+ ", "
+ "Column3 = @Column3"+ " WHERE ID = @ID"

Sobre las claves en el Dataset, cuando lo cargas puedes decirle que te las
saque el sólo (creo que en el Fill, hay un flag AddWithKey o algo así)

Buena suerte
Braulio


"EAmez" escribió:

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
#2 trinity.9bi
21/04/2005 - 13:26 | Informe spam
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
#3 Braulio Diez
22/04/2005 - 09:44 | Informe spam
Hola,

Creo que no me he explicado bien, tu pone esa sentencia en el update del
data adapter, y lo que hace por ti es coger el datatable en contreto,
detectar que filas han cambiado y ejecutar el update para esas filas (De ahí
los parametros que le pasas).

Saludos
Braulio

"EAmez" wrote:

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
#4 trinity.9bi
22/04/2005 - 11:56 | Informe spam
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
#5 Braulio Diez
24/04/2005 - 18:56 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida