Infracción de concurrencia

04/08/2004 - 12:27 por Carmen | Informe spam
Tengo una página con un datagrid y dos botones, uno para añadir filas al
grid y otro para borrar filas del grid.

Código Page_load:

Dim cadenaconexion As String = "..."
Dim Conexion As SqlConnection= New SqlConnection(cadenaconexion)
Dim CadenaSql As String ="SELECT * FROM FicherosContrato "
Dim adap As SqlDataAdapter = New SqlDataAdapter(CadenaSql, Conexion)
DS = New DataSet()
adap.Fill(DS, "FicherosContrato")

Código Botón de añadir:

Conexion.Open()
Dim fila as DataRow = DS.Tables("FicherosContrato").NewRow()
fila("...") = Relleno los valores de la fila
If DS.Tables("FicherosContrato").Rows.Count = 0 Then
DS.Tables("FicherosContrato").Rows.Add(fila)
Else
DS.Tables("FicherosContrato").Rows.InsertAt(fila,
DS.Tables("FicherosContrato").Rows.Count)
End If
adap.Update(DS, "FicherosContrato")
fila.AcceptChanges()
DS.Tables("FicherosContrato").AcceptChanges()
Conexion.Close()
dgr.DataSource = DS.Tables("FicherosContrato")
dgr.DataBind()

Código del botón de borrar:

Conexion.Open()
Dim fila as DataRow = DS.Tables("FicherosContrato").Rows(e.Item.ItemIndex)
fila.Delete()
adap.Update(DS, "FicherosContrato")
DS.Tables("FicherosContrato").AcceptChanges()
Conexion.Close()
dgr.DataSource = DS.Tables("FicherosContrato")
dgr.DataBind()

Si pulso el botón de añadir y a continuación el de borrar sobre la fila que
acabo de añadir me da un error de Infracción de concurrencia. Si voy a otra
página y vuelvo, ya puedo eliminar el registro recién añadido sin problemas.
¿Por qué me da este error de concurrencia? ¿Cómo puedo evitarlo? ¿Qué esto
haciendo mal?

Preguntas similare

Leer las respuestas

#1 Pablo O. Abbate
04/08/2004 - 13:06 | Informe spam
Hola Carmen,

Imagino que has omitido parte del código por cuestiones de brevedad. Pero
hasta donde puedo ver, te faltan los comandos de modificación en tu
DataAdapter.
Tu creas el nuevo adaptador programaticamente haciendo:
Dim CadenaSql As String ="SELECT * FROM FicherosContrato "
Dim adap As SqlDataAdapter = New SqlDataAdapter(CadenaSql, Conexion)


Pero esto solo te crea el comando select, los otros comandos (insert,
update, delete) no son creados.

Te digo esto porque, generalmente, el error de concurrencia se produce
cuando uno de los comandos de modificación no puede encontrar la fila que
debe modificar y devuelve 0 filas actualizadas. Esto se interpreta como que
alguien ha modificado el contenido de alguna(s) columna(s) de la fila en
cuestión y, por lo tanto, hay un problema de concurrencia.

Sería interesante que adjuntaras la porción de código que te genera los
comandos de dml para ver que puede estar mal.
¿Estás utilizando el CommandBuilder?

Pablo O. Abbate
MCDBA - MCAD - MCSD - MCT
www.auladat.es



"Carmen" escribió en el mensaje
news:%
Tengo una página con un datagrid y dos botones, uno para añadir filas al
grid y otro para borrar filas del grid.

Código Page_load:

Dim cadenaconexion As String = "..."
Dim Conexion As SqlConnection= New SqlConnection(cadenaconexion)
Dim CadenaSql As String ="SELECT * FROM FicherosContrato "
Dim adap As SqlDataAdapter = New SqlDataAdapter(CadenaSql, Conexion)
DS = New DataSet()
adap.Fill(DS, "FicherosContrato")

Código Botón de añadir:

Conexion.Open()
Dim fila as DataRow = DS.Tables("FicherosContrato").NewRow()
fila("...") = Relleno los valores de la fila
If DS.Tables("FicherosContrato").Rows.Count = 0 Then
DS.Tables("FicherosContrato").Rows.Add(fila)
Else
DS.Tables("FicherosContrato").Rows.InsertAt(fila,
DS.Tables("FicherosContrato").Rows.Count)
End If
adap.Update(DS, "FicherosContrato")
fila.AcceptChanges()
DS.Tables("FicherosContrato").AcceptChanges()
Conexion.Close()
dgr.DataSource = DS.Tables("FicherosContrato")
dgr.DataBind()

Código del botón de borrar:

Conexion.Open()
Dim fila as DataRow DS.Tables("FicherosContrato").Rows(e.Item.ItemIndex)
fila.Delete()
adap.Update(DS, "FicherosContrato")
DS.Tables("FicherosContrato").AcceptChanges()
Conexion.Close()
dgr.DataSource = DS.Tables("FicherosContrato")
dgr.DataBind()

Si pulso el botón de añadir y a continuación el de borrar sobre la fila


que
acabo de añadir me da un error de Infracción de concurrencia. Si voy a


otra
página y vuelvo, ya puedo eliminar el registro recién añadido sin


problemas.
¿Por qué me da este error de concurrencia? ¿Cómo puedo evitarlo? ¿Qué esto
haciendo mal?


Respuesta Responder a este mensaje
#2 Carmen
04/08/2004 - 13:43 | Informe spam
Efectivamente, me había comido código. El código de Page_Load queda como
sigue:

Dim cadenaconexion As String = "..."
Dim Conexion As SqlConnection= New SqlConnection(cadenaconexion)
Dim CadenaSql As String ="SELECT * FROM FicherosContrato "
Dim adap As SqlDataAdapter = New SqlDataAdapter(CadenaSql, Conexion)
adap.SelectCommand = New SqlCommand(CadenaSql, Conexion)
Dim CommandBuilder As SqlCommandBuilder = New SqlCommandBuilder(adap)
Dim DS As DataSet = New DataSet()
adap.Fill(DS, "FicherosContrato")

¿Necesito hacer algo más?

Muchas gracias

"Pablo O. Abbate" escribió en el mensaje
news:
Hola Carmen,

Imagino que has omitido parte del código por cuestiones de brevedad. Pero
hasta donde puedo ver, te faltan los comandos de modificación en tu
DataAdapter.
Tu creas el nuevo adaptador programaticamente haciendo:
> Dim CadenaSql As String ="SELECT * FROM FicherosContrato "
> Dim adap As SqlDataAdapter = New SqlDataAdapter(CadenaSql, Conexion)
Pero esto solo te crea el comando select, los otros comandos (insert,
update, delete) no son creados.

Te digo esto porque, generalmente, el error de concurrencia se produce
cuando uno de los comandos de modificación no puede encontrar la fila que
debe modificar y devuelve 0 filas actualizadas. Esto se interpreta como


que
alguien ha modificado el contenido de alguna(s) columna(s) de la fila en
cuestión y, por lo tanto, hay un problema de concurrencia.

Sería interesante que adjuntaras la porción de código que te genera los
comandos de dml para ver que puede estar mal.
¿Estás utilizando el CommandBuilder?

Pablo O. Abbate
MCDBA - MCAD - MCSD - MCT
www.auladat.es



"Carmen" escribió en el mensaje
news:%
> Tengo una página con un datagrid y dos botones, uno para añadir filas al
> grid y otro para borrar filas del grid.
>
> Código Page_load:
>
> Dim cadenaconexion As String = "..."
> Dim Conexion As SqlConnection= New SqlConnection(cadenaconexion)
> Dim CadenaSql As String ="SELECT * FROM FicherosContrato "
> Dim adap As SqlDataAdapter = New SqlDataAdapter(CadenaSql, Conexion)
> DS = New DataSet()
> adap.Fill(DS, "FicherosContrato")
>
> Código Botón de añadir:
>
> Conexion.Open()
> Dim fila as DataRow = DS.Tables("FicherosContrato").NewRow()
> fila("...") = Relleno los valores de la fila
> If DS.Tables("FicherosContrato").Rows.Count = 0 Then
> DS.Tables("FicherosContrato").Rows.Add(fila)
> Else
> DS.Tables("FicherosContrato").Rows.InsertAt(fila,
> DS.Tables("FicherosContrato").Rows.Count)
> End If
> adap.Update(DS, "FicherosContrato")
> fila.AcceptChanges()
> DS.Tables("FicherosContrato").AcceptChanges()
> Conexion.Close()
> dgr.DataSource = DS.Tables("FicherosContrato")
> dgr.DataBind()
>
> Código del botón de borrar:
>
> Conexion.Open()
> Dim fila as DataRow > DS.Tables("FicherosContrato").Rows(e.Item.ItemIndex)
> fila.Delete()
> adap.Update(DS, "FicherosContrato")
> DS.Tables("FicherosContrato").AcceptChanges()
> Conexion.Close()
> dgr.DataSource = DS.Tables("FicherosContrato")
> dgr.DataBind()
>
> Si pulso el botón de añadir y a continuación el de borrar sobre la fila
que
> acabo de añadir me da un error de Infracción de concurrencia. Si voy a
otra
> página y vuelvo, ya puedo eliminar el registro recién añadido sin
problemas.
> ¿Por qué me da este error de concurrencia? ¿Cómo puedo evitarlo? ¿Qué


esto
> haciendo mal?
>
>


Respuesta Responder a este mensaje
#3 Pablo O. Abbate
04/08/2004 - 15:04 | Informe spam
Bueno, en realidad falta una cosa más:

adap.DeleteCommand = cb.GetDeleteCommand()
adap.InsertCommand = cb.GetInsertCommand()
adap.UpdateCommand = cb.GetUpdateCommand()

Porque si no haces esto nunca tendrás contenido en los comandos del
adaptador y no se enviarán los cambios al servidor, sino que se disparará
una excepción.
No obstante, esta forma de trabajar tiene un pequeño inconveniente y es que
no refleja los cambios de vuelta al terminar la ejecución del comando. Si
tienes campos que asignen valores por default o autoincrementen su valor,
del lado del servidor, no verás su contenido hasta que realices nuevamente
un select de las mismas filas del lado del cliente.
Lo más recomendable es utilizar el asistente para que te cree
automáticamente el dataadapter y así que agregue un select para refrescar
los cambios ocurridos del lado del servidor en cada comando insert o update.

Necesito un dato más: ¿Este adap.Fill(DS, "FicherosContrato") se realiza
siempre en el Load o está dentro de una condición If not IsPostBack...?

Verifica que siempre se realice el fill de tu dataset, no solo cuando se
cargue por primera vez el formulario.
Es posible que cuando presiones el primer botón, se realice un PostBack y tu
dataset esté vacío y, en cambio, al recargar el formulario desde otro se
ejecute correctamente el Fill porque no se trata de un PostBack.

Cuentame que descubriste.
Saludos,

Pablo O. Abbate
MCDBA - MCAD - MCSD - MCT
www.auladat.es





"Carmen" escribió en el mensaje
news:%
Efectivamente, me había comido código. El código de Page_Load queda como
sigue:

Dim cadenaconexion As String = "..."
Dim Conexion As SqlConnection= New SqlConnection(cadenaconexion)
Dim CadenaSql As String ="SELECT * FROM FicherosContrato "
Dim adap As SqlDataAdapter = New SqlDataAdapter(CadenaSql, Conexion)
adap.SelectCommand = New SqlCommand(CadenaSql, Conexion)
Dim CommandBuilder As SqlCommandBuilder = New SqlCommandBuilder(adap)
Dim DS As DataSet = New DataSet()
adap.Fill(DS, "FicherosContrato")

¿Necesito hacer algo más?

Muchas gracias

"Pablo O. Abbate" escribió en el mensaje
news:
> Hola Carmen,
>
> Imagino que has omitido parte del código por cuestiones de brevedad.


Pero
> hasta donde puedo ver, te faltan los comandos de modificación en tu
> DataAdapter.
> Tu creas el nuevo adaptador programaticamente haciendo:
> > Dim CadenaSql As String ="SELECT * FROM FicherosContrato "
> > Dim adap As SqlDataAdapter = New SqlDataAdapter(CadenaSql, Conexion)
> Pero esto solo te crea el comando select, los otros comandos (insert,
> update, delete) no son creados.
>
> Te digo esto porque, generalmente, el error de concurrencia se produce
> cuando uno de los comandos de modificación no puede encontrar la fila


que
> debe modificar y devuelve 0 filas actualizadas. Esto se interpreta como
que
> alguien ha modificado el contenido de alguna(s) columna(s) de la fila en
> cuestión y, por lo tanto, hay un problema de concurrencia.
>
> Sería interesante que adjuntaras la porción de código que te genera los
> comandos de dml para ver que puede estar mal.
> ¿Estás utilizando el CommandBuilder?
>
> Pablo O. Abbate
> MCDBA - MCAD - MCSD - MCT
> www.auladat.es
>
>
>
> "Carmen" escribió en el mensaje
> news:%
> > Tengo una página con un datagrid y dos botones, uno para añadir filas


al
> > grid y otro para borrar filas del grid.
> >
> > Código Page_load:
> >
> > Dim cadenaconexion As String = "..."
> > Dim Conexion As SqlConnection= New SqlConnection(cadenaconexion)
> > Dim CadenaSql As String ="SELECT * FROM FicherosContrato "
> > Dim adap As SqlDataAdapter = New SqlDataAdapter(CadenaSql, Conexion)
> > DS = New DataSet()
> > adap.Fill(DS, "FicherosContrato")
> >
> > Código Botón de añadir:
> >
> > Conexion.Open()
> > Dim fila as DataRow = DS.Tables("FicherosContrato").NewRow()
> > fila("...") = Relleno los valores de la fila
> > If DS.Tables("FicherosContrato").Rows.Count = 0 Then
> > DS.Tables("FicherosContrato").Rows.Add(fila)
> > Else
> > DS.Tables("FicherosContrato").Rows.InsertAt(fila,
> > DS.Tables("FicherosContrato").Rows.Count)
> > End If
> > adap.Update(DS, "FicherosContrato")
> > fila.AcceptChanges()
> > DS.Tables("FicherosContrato").AcceptChanges()
> > Conexion.Close()
> > dgr.DataSource = DS.Tables("FicherosContrato")
> > dgr.DataBind()
> >
> > Código del botón de borrar:
> >
> > Conexion.Open()
> > Dim fila as DataRow > > DS.Tables("FicherosContrato").Rows(e.Item.ItemIndex)
> > fila.Delete()
> > adap.Update(DS, "FicherosContrato")
> > DS.Tables("FicherosContrato").AcceptChanges()
> > Conexion.Close()
> > dgr.DataSource = DS.Tables("FicherosContrato")
> > dgr.DataBind()
> >
> > Si pulso el botón de añadir y a continuación el de borrar sobre la


fila
> que
> > acabo de añadir me da un error de Infracción de concurrencia. Si voy a
> otra
> > página y vuelvo, ya puedo eliminar el registro recién añadido sin
> problemas.
> > ¿Por qué me da este error de concurrencia? ¿Cómo puedo evitarlo? ¿Qué
esto
> > haciendo mal?
> >
> >
>
>


Respuesta Responder a este mensaje
#4 Carmen
05/08/2004 - 09:00 | Informe spam
Muchas gracias. Has sido de mucha ayuda.
En la tabla de la base de datos hay un campo autoincremento. El problema lo
he solucionado haciendo un Fill después de insertar en registro. En esta
página sólo se pueden añadir o eliminar registros, no se pueden modificar.

Lo dicho, muchas gracias.

"Pablo O. Abbate" escribió en el mensaje
news:
Bueno, en realidad falta una cosa más:

adap.DeleteCommand = cb.GetDeleteCommand()
adap.InsertCommand = cb.GetInsertCommand()
adap.UpdateCommand = cb.GetUpdateCommand()

Porque si no haces esto nunca tendrás contenido en los comandos del
adaptador y no se enviarán los cambios al servidor, sino que se disparará
una excepción.
No obstante, esta forma de trabajar tiene un pequeño inconveniente y es


que
no refleja los cambios de vuelta al terminar la ejecución del comando. Si
tienes campos que asignen valores por default o autoincrementen su valor,
del lado del servidor, no verás su contenido hasta que realices nuevamente
un select de las mismas filas del lado del cliente.
Lo más recomendable es utilizar el asistente para que te cree
automáticamente el dataadapter y así que agregue un select para refrescar
los cambios ocurridos del lado del servidor en cada comando insert o


update.

Necesito un dato más: ¿Este adap.Fill(DS, "FicherosContrato") se realiza
siempre en el Load o está dentro de una condición If not IsPostBack...?

Verifica que siempre se realice el fill de tu dataset, no solo cuando se
cargue por primera vez el formulario.
Es posible que cuando presiones el primer botón, se realice un PostBack y


tu
dataset esté vacío y, en cambio, al recargar el formulario desde otro se
ejecute correctamente el Fill porque no se trata de un PostBack.

Cuentame que descubriste.
Saludos,

Pablo O. Abbate
MCDBA - MCAD - MCSD - MCT
www.auladat.es





"Carmen" escribió en el mensaje
news:%
> Efectivamente, me había comido código. El código de Page_Load queda como
> sigue:
>
> Dim cadenaconexion As String = "..."
> Dim Conexion As SqlConnection= New SqlConnection(cadenaconexion)
> Dim CadenaSql As String ="SELECT * FROM FicherosContrato "
> Dim adap As SqlDataAdapter = New SqlDataAdapter(CadenaSql, Conexion)
> adap.SelectCommand = New SqlCommand(CadenaSql, Conexion)
> Dim CommandBuilder As SqlCommandBuilder = New SqlCommandBuilder(adap)
> Dim DS As DataSet = New DataSet()
> adap.Fill(DS, "FicherosContrato")
>
> ¿Necesito hacer algo más?
>
> Muchas gracias
>
> "Pablo O. Abbate" escribió en el


mensaje
> news:
> > Hola Carmen,
> >
> > Imagino que has omitido parte del código por cuestiones de brevedad.
Pero
> > hasta donde puedo ver, te faltan los comandos de modificación en tu
> > DataAdapter.
> > Tu creas el nuevo adaptador programaticamente haciendo:
> > > Dim CadenaSql As String ="SELECT * FROM FicherosContrato "
> > > Dim adap As SqlDataAdapter = New SqlDataAdapter(CadenaSql, Conexion)
> > Pero esto solo te crea el comando select, los otros comandos (insert,
> > update, delete) no son creados.
> >
> > Te digo esto porque, generalmente, el error de concurrencia se produce
> > cuando uno de los comandos de modificación no puede encontrar la fila
que
> > debe modificar y devuelve 0 filas actualizadas. Esto se interpreta


como
> que
> > alguien ha modificado el contenido de alguna(s) columna(s) de la fila


en
> > cuestión y, por lo tanto, hay un problema de concurrencia.
> >
> > Sería interesante que adjuntaras la porción de código que te genera


los
> > comandos de dml para ver que puede estar mal.
> > ¿Estás utilizando el CommandBuilder?
> >
> > Pablo O. Abbate
> > MCDBA - MCAD - MCSD - MCT
> > www.auladat.es
> >
> >
> >
> > "Carmen" escribió en el mensaje
> > news:%
> > > Tengo una página con un datagrid y dos botones, uno para añadir


filas
al
> > > grid y otro para borrar filas del grid.
> > >
> > > Código Page_load:
> > >
> > > Dim cadenaconexion As String = "..."
> > > Dim Conexion As SqlConnection= New SqlConnection(cadenaconexion)
> > > Dim CadenaSql As String ="SELECT * FROM FicherosContrato "
> > > Dim adap As SqlDataAdapter = New SqlDataAdapter(CadenaSql, Conexion)
> > > DS = New DataSet()
> > > adap.Fill(DS, "FicherosContrato")
> > >
> > > Código Botón de añadir:
> > >
> > > Conexion.Open()
> > > Dim fila as DataRow = DS.Tables("FicherosContrato").NewRow()
> > > fila("...") = Relleno los valores de la fila
> > > If DS.Tables("FicherosContrato").Rows.Count = 0 Then
> > > DS.Tables("FicherosContrato").Rows.Add(fila)
> > > Else
> > > DS.Tables("FicherosContrato").Rows.InsertAt(fila,
> > > DS.Tables("FicherosContrato").Rows.Count)
> > > End If
> > > adap.Update(DS, "FicherosContrato")
> > > fila.AcceptChanges()
> > > DS.Tables("FicherosContrato").AcceptChanges()
> > > Conexion.Close()
> > > dgr.DataSource = DS.Tables("FicherosContrato")
> > > dgr.DataBind()
> > >
> > > Código del botón de borrar:
> > >
> > > Conexion.Open()
> > > Dim fila as DataRow > > > DS.Tables("FicherosContrato").Rows(e.Item.ItemIndex)
> > > fila.Delete()
> > > adap.Update(DS, "FicherosContrato")
> > > DS.Tables("FicherosContrato").AcceptChanges()
> > > Conexion.Close()
> > > dgr.DataSource = DS.Tables("FicherosContrato")
> > > dgr.DataBind()
> > >
> > > Si pulso el botón de añadir y a continuación el de borrar sobre la
fila
> > que
> > > acabo de añadir me da un error de Infracción de concurrencia. Si voy


a
> > otra
> > > página y vuelvo, ya puedo eliminar el registro recién añadido sin
> > problemas.
> > > ¿Por qué me da este error de concurrencia? ¿Cómo puedo evitarlo?


¿Qué
> esto
> > > haciendo mal?
> > >
> > >
> >
> >
>
>


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