El DataAdapter no me borra registros!!!!!

12/01/2005 - 12:21 por Adolfofb | Informe spam
Hola a todos:

tengo un SqlDataAdapter creado con el asistente y un DataSet tipado.

Si hago esto:

Me.SqlDataAdapter1.Fill(Me.Ds_prueba41)

Me.Ds_prueba41.Tables("mitabla").Rows.Remove(Me.Ds_prueba41.Tables("mitabla").Rows.Item(1))

Me.SqlDataAdapter1.Update(Me.Ds_prueba41)

Veo depurando el código que efectivamente SI borra el registro de la
datatable pero al hacer el update no hace ningún cambio en la BD de Datos.

Sin embargo si en vez de borrar un registro lo añado si que funciona bien.
entiendo que no tengo que hacer nada con los parametros que´el asistente
crea automaticamente llamados "@Original...".

Pretendo borrar varios registros del dataset y luego hacer un único Update.

Muchas gracias.

Preguntas similare

Leer las respuestas

#1 SqlRanger
12/01/2005 - 15:11 | Informe spam
No deberías utilizar Remove porque Remove quita la fila del datatable sin
dejar rastro de ella. En su lugar deberías usar Delete que marca la fila
como eliminada pero no la quita del datatable. Cuando llamamos al método
Update del DatAdapter, el DataAdapter se recorre todas las filas del
DataTable, si la fila es una fila nueva (RowState = Added), ejecuta el
InserCommand, si está eliminada (RowState= Deleted) ejecuta el
DeleteCommand, si está modificada (RowState = Modified) ejecuta el
UpdateCommand y si no está modificada (RowState = Unchanged) no hace nada.
Antes de ejecutar el comando correspondiente establece el valor de los
parámetos de dicho comando copiando el valor original o actual de la columna
correspondiente. Los parámetros de los comandos tienen dos propiedades
SourceColumn y SourceVersion que determinan el nombre de la columna del
datatable y su versión (original o actual) respectivamente, cuyo valor
deberá copiarse al parámetro antes de su ejecución. Una vez que el
DataAdapter llama al comando correspondiente, llama al método AcceptChanges
del datarow, y esto es lo que ocurre: si la fila era una fila eliminada se
quita definitivamente del DataTable y si era nueva o modificada se copian
los valores actuales a los valores originales y se marca la fila como sin
cambios (RowState = Unchanged)


Me.Ds_prueba41.Tables("mitabla").Rows(1).Delete

Saludos desde Madrid:

Jesús López
MVP Visual Basic
Mentor Asociado Solid Quality Learning
www.solidqualitylearning.com

PD: Agradecería saber si esta respuesta te ha servido


"Adolfofb" escribió en el mensaje
news:
Hola a todos:

tengo un SqlDataAdapter creado con el asistente y un DataSet tipado.

Si hago esto:

Me.SqlDataAdapter1.Fill(Me.Ds_prueba41)

Me.Ds_prueba41.Tables("mitabla").Rows.Remove(Me.Ds_prueba41.Tables("mitabla").Rows.Item(1))

Me.SqlDataAdapter1.Update(Me.Ds_prueba41)

Veo depurando el código que efectivamente SI borra el registro de la
datatable pero al hacer el update no hace ningún cambio en la BD de Datos.

Sin embargo si en vez de borrar un registro lo añado si que funciona bien.
entiendo que no tengo que hacer nada con los parametros que´el asistente
crea automaticamente llamados "@Original...".

Pretendo borrar varios registros del dataset y luego hacer un único
Update.

Muchas gracias.
Respuesta Responder a este mensaje
#2 Adolfofb
12/01/2005 - 18:03 | Informe spam
Estimado Jesús:

Desconocía el tema del Delete, tiene lógica. Lo he probado simplemente
cambiando el Remove por el Delete y funciona perfectamente.
Lo que no acabo de comprender es el asunto de los parámetros que él crea
automaticamente en los comandos de Delete, Insert y Update. Yo no les he dado
valor ninguno y sin embargo ha funcionado.
No he utilizado el SourceColumn y SourceVersion que indicas porque no te he
entendido la utilidad, y por lo documentación que he estado leyendo no lo
tengo muy claro.

Muchas gracias por tu ayuda y un saludo desde Vigo.

"SqlRanger" escribió:

No deberías utilizar Remove porque Remove quita la fila del datatable sin
dejar rastro de ella. En su lugar deberías usar Delete que marca la fila
como eliminada pero no la quita del datatable. Cuando llamamos al método
Update del DatAdapter, el DataAdapter se recorre todas las filas del
DataTable, si la fila es una fila nueva (RowState = Added), ejecuta el
InserCommand, si está eliminada (RowState= Deleted) ejecuta el
DeleteCommand, si está modificada (RowState = Modified) ejecuta el
UpdateCommand y si no está modificada (RowState = Unchanged) no hace nada.
Antes de ejecutar el comando correspondiente establece el valor de los
parámetos de dicho comando copiando el valor original o actual de la columna
correspondiente. Los parámetros de los comandos tienen dos propiedades
SourceColumn y SourceVersion que determinan el nombre de la columna del
datatable y su versión (original o actual) respectivamente, cuyo valor
deberá copiarse al parámetro antes de su ejecución. Una vez que el
DataAdapter llama al comando correspondiente, llama al método AcceptChanges
del datarow, y esto es lo que ocurre: si la fila era una fila eliminada se
quita definitivamente del DataTable y si era nueva o modificada se copian
los valores actuales a los valores originales y se marca la fila como sin
cambios (RowState = Unchanged)


Me.Ds_prueba41.Tables("mitabla").Rows(1).Delete

Saludos desde Madrid:

Jesús López
MVP Visual Basic
Mentor Asociado Solid Quality Learning
www.solidqualitylearning.com

PD: Agradecería saber si esta respuesta te ha servido


"Adolfofb" escribió en el mensaje
news:
> Hola a todos:
>
> tengo un SqlDataAdapter creado con el asistente y un DataSet tipado.
>
> Si hago esto:
>
> Me.SqlDataAdapter1.Fill(Me.Ds_prueba41)
>
> Me.Ds_prueba41.Tables("mitabla").Rows.Remove(Me.Ds_prueba41.Tables("mitabla").Rows.Item(1))
>
> Me.SqlDataAdapter1.Update(Me.Ds_prueba41)
>
> Veo depurando el código que efectivamente SI borra el registro de la
> datatable pero al hacer el update no hace ningún cambio en la BD de Datos.
>
> Sin embargo si en vez de borrar un registro lo añado si que funciona bien.
> entiendo que no tengo que hacer nada con los parametros que´el asistente
> crea automaticamente llamados "@Original...".
>
> Pretendo borrar varios registros del dataset y luego hacer un único
> Update.
>
> Muchas gracias.



Respuesta Responder a este mensaje
#3 SqlRanger
13/01/2005 - 11:21 | Informe spam
Lamento no haberme explicado lo suficientemente claro :-(. Lo intentaré de
nuevo. Comentarios en línea

Saludos desde Madrid:

Jesús López
MVP Visual Basic
Mentor Asociado Solid Quality Learning
www.solidqualitylearning.com

PD: Agradecería saber si esta respuesta te ha servido


"Adolfofb" escribió en el mensaje
news:
Estimado Jesús:

Desconocía el tema del Delete, tiene lógica. Lo he probado simplemente
cambiando el Remove por el Delete y funciona perfectamente.
Lo que no acabo de comprender es el asunto de los parámetros que él crea
automaticamente en los comandos de Delete, Insert y Update. Yo no les he
dado
valor ninguno y sin embargo ha funcionado.



Los comandos deben tener parámetros para que sirvan para todas las filas de
un DataTable. Es el propio DataAdapter, en su método Update, el que
establece el valor de los parámetros de los comandos antes de ejecutarlos.
Estos valores son los valores de las columnas del registro (DataRow) que se
esta actualizando (update, delete o insert).

No he utilizado el SourceColumn y SourceVersion que indicas porque no te
he
entendido la utilidad, y por lo documentación que he estado leyendo no lo
tengo muy claro.




SourceColumn indica el nombre de la columna cuyo valor deberá copiarse al
parámetro del comando antes de ejecutarse.
SourceVersion indica si se debe usar el valor original o el valor actual de
la columna.

Muchas gracias por tu ayuda y un saludo desde Vigo.




Quizás sepa explicarme mejor con código que con palabras. Esto sería "muy
básicamente" lo que hace el método Update del DataAdapter:

Public Class SqlDataAdapter

'...

Public Sub Update(ByVal table As DataTable)
Connection.Open()
For Each row As DataRow In table.Rows
Select Case row.RowState
Case DataRowState.Added
ExecuteCommand(InsertCommand, row)
Case DataRowState.Deleted
ExecuteCommand(DeleteCommand, row)
Case DataRowState.Modified
ExecuteCommand(UpdateCommand, row)
End Select
row.AcceptChanges()
Next
Connection.Close()
End Sub

Private Sub ExecuteCommand(ByVal cmd As SqlClient.SqlCommand, ByVal row
As DataRow)
For Each p As SqlClient.SqlParameter In cmd.Parameters
p.Value = row(p.SourceColumn, p.SourceVersion)
Next
cmd.ExecuteNonQuery()
End Sub

End Class

Esto no es realmente lo que hace, hay muchos pequeños detalles que he pasado
por alto para que lo fundamental quede más claro, espero haberlo conseguido.

Si por fin he conseguido explicarme bien y quieres conocer esos detalles que
faltan sólo tienes que pedirlo.

"SqlRanger" escribió:

No deberías utilizar Remove porque Remove quita la fila del datatable sin
dejar rastro de ella. En su lugar deberías usar Delete que marca la fila
como eliminada pero no la quita del datatable. Cuando llamamos al método
Update del DatAdapter, el DataAdapter se recorre todas las filas del
DataTable, si la fila es una fila nueva (RowState = Added), ejecuta el
InserCommand, si está eliminada (RowState= Deleted) ejecuta el
DeleteCommand, si está modificada (RowState = Modified) ejecuta el
UpdateCommand y si no está modificada (RowState = Unchanged) no hace
nada.
Antes de ejecutar el comando correspondiente establece el valor de los
parámetos de dicho comando copiando el valor original o actual de la
columna
correspondiente. Los parámetros de los comandos tienen dos propiedades
SourceColumn y SourceVersion que determinan el nombre de la columna del
datatable y su versión (original o actual) respectivamente, cuyo valor
deberá copiarse al parámetro antes de su ejecución. Una vez que el
DataAdapter llama al comando correspondiente, llama al método
AcceptChanges
del datarow, y esto es lo que ocurre: si la fila era una fila eliminada
se
quita definitivamente del DataTable y si era nueva o modificada se copian
los valores actuales a los valores originales y se marca la fila como sin
cambios (RowState = Unchanged)


Me.Ds_prueba41.Tables("mitabla").Rows(1).Delete

Saludos desde Madrid:

Jesús López
MVP Visual Basic
Mentor Asociado Solid Quality Learning
www.solidqualitylearning.com

PD: Agradecería saber si esta respuesta te ha servido


"Adolfofb" escribió en el mensaje
news:
> Hola a todos:
>
> tengo un SqlDataAdapter creado con el asistente y un DataSet tipado.
>
> Si hago esto:
>
> Me.SqlDataAdapter1.Fill(Me.Ds_prueba41)
>
> Me.Ds_prueba41.Tables("mitabla").Rows.Remove(Me.Ds_prueba41.Tables("mitabla").Rows.Item(1))
>
> Me.SqlDataAdapter1.Update(Me.Ds_prueba41)
>
> Veo depurando el código que efectivamente SI borra el registro de la
> datatable pero al hacer el update no hace ningún cambio en la BD de
> Datos.
>
> Sin embargo si en vez de borrar un registro lo añado si que funciona
> bien.
> entiendo que no tengo que hacer nada con los parametros que´el
> asistente
> crea automaticamente llamados "@Original...".
>
> Pretendo borrar varios registros del dataset y luego hacer un único
> Update.
>
> Muchas gracias.



Respuesta Responder a este mensaje
#4 Adolfofb
13/01/2005 - 16:41 | Informe spam
Hola Jesús:

Creo que ahora si lo he entendido. Mi duda era quién le daba valor a esos
parémetros pero como tu me dices lo hace el propio DataAdapter antes de
ejecutarse.

Con respecto a SourceColumn y sourceversion entiendo que no tengo que
tocarlos para nada a no ser que quiera por ejemplo que los datos que se
envién a la BD sean los originales y no los actuales del datatable.

Si lo que quiero, por las pruebas que estoy haciendo, es que los datos
actuales del Datatable se envién a la BD simplemente uso un
dataadapter.update(dataset) y ya lo gestion él todo, ¿no?.

Gracias de nuevo y un saludo.

"SqlRanger" escribió:

Lamento no haberme explicado lo suficientemente claro :-(. Lo intentaré de
nuevo. Comentarios en línea

Saludos desde Madrid:

Jesús López
MVP Visual Basic
Mentor Asociado Solid Quality Learning
www.solidqualitylearning.com

PD: Agradecería saber si esta respuesta te ha servido


"Adolfofb" escribió en el mensaje
news:
> Estimado Jesús:
>
> Desconocía el tema del Delete, tiene lógica. Lo he probado simplemente
> cambiando el Remove por el Delete y funciona perfectamente.
> Lo que no acabo de comprender es el asunto de los parámetros que él crea
> automaticamente en los comandos de Delete, Insert y Update. Yo no les he
> dado
> valor ninguno y sin embargo ha funcionado.

Los comandos deben tener parámetros para que sirvan para todas las filas de
un DataTable. Es el propio DataAdapter, en su método Update, el que
establece el valor de los parámetros de los comandos antes de ejecutarlos.
Estos valores son los valores de las columnas del registro (DataRow) que se
esta actualizando (update, delete o insert).

> No he utilizado el SourceColumn y SourceVersion que indicas porque no te
> he
> entendido la utilidad, y por lo documentación que he estado leyendo no lo
> tengo muy claro.
>

SourceColumn indica el nombre de la columna cuyo valor deberá copiarse al
parámetro del comando antes de ejecutarse.
SourceVersion indica si se debe usar el valor original o el valor actual de
la columna.

> Muchas gracias por tu ayuda y un saludo desde Vigo.
>

Quizás sepa explicarme mejor con código que con palabras. Esto sería "muy
básicamente" lo que hace el método Update del DataAdapter:

Public Class SqlDataAdapter

'...

Public Sub Update(ByVal table As DataTable)
Connection.Open()
For Each row As DataRow In table.Rows
Select Case row.RowState
Case DataRowState.Added
ExecuteCommand(InsertCommand, row)
Case DataRowState.Deleted
ExecuteCommand(DeleteCommand, row)
Case DataRowState.Modified
ExecuteCommand(UpdateCommand, row)
End Select
row.AcceptChanges()
Next
Connection.Close()
End Sub

Private Sub ExecuteCommand(ByVal cmd As SqlClient.SqlCommand, ByVal row
As DataRow)
For Each p As SqlClient.SqlParameter In cmd.Parameters
p.Value = row(p.SourceColumn, p.SourceVersion)
Next
cmd.ExecuteNonQuery()
End Sub

End Class

Esto no es realmente lo que hace, hay muchos pequeños detalles que he pasado
por alto para que lo fundamental quede más claro, espero haberlo conseguido.

Si por fin he conseguido explicarme bien y quieres conocer esos detalles que
faltan sólo tienes que pedirlo.

> "SqlRanger" escribió:
>
>> No deberías utilizar Remove porque Remove quita la fila del datatable sin
>> dejar rastro de ella. En su lugar deberías usar Delete que marca la fila
>> como eliminada pero no la quita del datatable. Cuando llamamos al método
>> Update del DatAdapter, el DataAdapter se recorre todas las filas del
>> DataTable, si la fila es una fila nueva (RowState = Added), ejecuta el
>> InserCommand, si está eliminada (RowState= Deleted) ejecuta el
>> DeleteCommand, si está modificada (RowState = Modified) ejecuta el
>> UpdateCommand y si no está modificada (RowState = Unchanged) no hace
>> nada.
>> Antes de ejecutar el comando correspondiente establece el valor de los
>> parámetos de dicho comando copiando el valor original o actual de la
>> columna
>> correspondiente. Los parámetros de los comandos tienen dos propiedades
>> SourceColumn y SourceVersion que determinan el nombre de la columna del
>> datatable y su versión (original o actual) respectivamente, cuyo valor
>> deberá copiarse al parámetro antes de su ejecución. Una vez que el
>> DataAdapter llama al comando correspondiente, llama al método
>> AcceptChanges
>> del datarow, y esto es lo que ocurre: si la fila era una fila eliminada
>> se
>> quita definitivamente del DataTable y si era nueva o modificada se copian
>> los valores actuales a los valores originales y se marca la fila como sin
>> cambios (RowState = Unchanged)
>>
>>
>> Me.Ds_prueba41.Tables("mitabla").Rows(1).Delete
>>
>> Saludos desde Madrid:
>>
>> Jesús López
>> MVP Visual Basic
>> Mentor Asociado Solid Quality Learning
>> www.solidqualitylearning.com
>>
>> PD: Agradecería saber si esta respuesta te ha servido
>>
>>
>> "Adolfofb" escribió en el mensaje
>> news:
>> > Hola a todos:
>> >
>> > tengo un SqlDataAdapter creado con el asistente y un DataSet tipado.
>> >
>> > Si hago esto:
>> >
>> > Me.SqlDataAdapter1.Fill(Me.Ds_prueba41)
>> >
>> > Me.Ds_prueba41.Tables("mitabla").Rows.Remove(Me.Ds_prueba41.Tables("mitabla").Rows.Item(1))
>> >
>> > Me.SqlDataAdapter1.Update(Me.Ds_prueba41)
>> >
>> > Veo depurando el código que efectivamente SI borra el registro de la
>> > datatable pero al hacer el update no hace ningún cambio en la BD de
>> > Datos.
>> >
>> > Sin embargo si en vez de borrar un registro lo añado si que funciona
>> > bien.
>> > entiendo que no tengo que hacer nada con los parametros que´el
>> > asistente
>> > crea automaticamente llamados "@Original...".
>> >
>> > Pretendo borrar varios registros del dataset y luego hacer un único
>> > Update.
>> >
>> > Muchas gracias.
>>
>>
>>



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