Foros del Web » Programación para mayores de 30 ;) » .NET »

OleDBCommandBuilder y concurrencia

Estas en el tema de OleDBCommandBuilder y concurrencia en el foro de .NET en Foros del Web. Hola a todos. Es posible decirle a un objeto OleDBCommandBuilder que al generar las instrucciones no lo haga bajo el modelo de concurrencia optimista, sino ...
  #1 (permalink)  
Antiguo 25/11/2005, 11:03
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 4 meses
Puntos: 9
OleDBCommandBuilder y concurrencia

Hola a todos.

Es posible decirle a un objeto OleDBCommandBuilder que al generar las instrucciones no lo haga bajo el modelo de concurrencia optimista, sino que lo haga por el metodo "el ultimo gana".
O sea, que el ultimo que actualiza el registro es con el valor que se queda, de forma que no devuelva error de concurrencia.

Gracias.
__________________
..:: moNTeZIon ::..
  #2 (permalink)  
Antiguo 25/11/2005, 18:15
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 4 meses
Puntos: 7
Hasta donde sé no puedes hacer eso, como dije, pon la sentencia SQL manualmente o utiliza procedimientos almacenados.

Comentario aparte, no entiendo por qué quieres deshabilitar eso, si por defecto tiene ese comportamiento, es para evitar inconsistencia en tus datos...

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #3 (permalink)  
Antiguo 28/11/2005, 01:24
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 4 meses
Puntos: 9
Quiero deshabilitarlo para ahorrarme un error que no estoy puediendo evitar. He especificado los comandos del adapter manualmente en vez de utilizar el commandbuilder, pero me sigue ocurriendo el error al modificar una fila que acaba de ser dada de alta.
No me gusta deshabilitarlo pero como va a ser un entornopara un solo usuario tampoco me afecta mucho.
Por qué me salta un error de concurrencia si los cambios los está haciendo el mismo usuario siempre?
Por mi perfecto si consigo que se grabe todo cada vez que se haga un cambio.
__________________
..:: moNTeZIon ::..

Última edición por moNTeZIon; 28/11/2005 a las 06:36
  #4 (permalink)  
Antiguo 28/11/2005, 06:43
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 4 meses
Puntos: 9
Voy a poner un poco de código, a ver si es que hago algo mal.

Este es el sub al que se llama cuando se gurdan los cambios:
Código:
Private Sub GuardarCambios_miDataSet()
    Me.BindingContext(miDataSet, "Urgencias").EndCurrentEdit()
    If miDataSet.HasChanges Then
      Try
        daUrgencias.Update(miDataSet, "Urgencias")
        miDataSet.Tables("Urgencias").AcceptChanges()
      Catch eX As Exception
        MessageBox.Show(eX.Message)
      End Try
    End If
  End Sub
Asi están creados los comandos del dataadapter:
Código:
daUrgencias.SelectCommand = New OleDbCommand("SELECT IdUrgencia, Fecha, Hora, Cliente, Operario, NoOrden, NoContrato, Poliza, HoraEntrada, HoraSalida, Incidencia, Solucion, HoraCierre, Presupuesto, Recambios, Importe, Estado, FranjaHoraria, Facturado, TipoUrgencia FROM Urgencias WHERE TipoUrgencia='" & TipoUrgenciaElegido & "' AND Year(Fecha)=" & AnyoElegido & " AND " & strCondicion & " ORDER BY IdUrgencia", miConn)

Dim objUrgencias As New UrgenciasDB
daUrgencias.InsertCommand = objUrgencias.DameComandosUrgencias("Insert")
daUrgencias.UpdateCommand = objUrgencias.DameComandosUrgencias("Update")
daUrgencias.DeleteCommand = objUrgencias.DameComandosUrgencias("Delete")
Esta es la funcion que devuelve los comandos:
Código:
Public Function DameComandosUrgencias(ByVal Tipo As String) As OleDbCommand
    Dim Conn As New OleDbConnection(Configuration.ConfigurationSettings.AppSettings.Item("ConnStr"))
    Dim miCM As New OleDbCommand
    miCM.Connection = Conn
    Select Case Tipo
      Case "Insert"
        miCM.CommandText = "INSERT INTO Urgencias (Fecha, Hora, Cliente, Operario, NoOrden, NoContrato, Poliza, HoraEntrada, HoraSalida, Incidencia, Solucion, HoraCierre, Presupuesto, Recambios, Importe, Estado, FranjaHoraria, Facturado, TipoUrgencia) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
        miCM.Parameters.Add("@p1", OleDbType.Date, 250, "Fecha")
        miCM.Parameters.Add("@p2", OleDbType.Date, 250, "Hora")
        miCM.Parameters.Add("@p3", OleDbType.Integer, 4, "Cliente")
        miCM.Parameters.Add("@p4", OleDbType.Char, 50, "Operario")
        miCM.Parameters.Add("@p5", OleDbType.Char, 50, "NoOrden")
        miCM.Parameters.Add("@p6", OleDbType.Char, 50, "NoContrato")
        miCM.Parameters.Add("@p7", OleDbType.Char, 50, "Poliza")
        miCM.Parameters.Add("@p8", OleDbType.Date, 250, "HoraEntrada")
        miCM.Parameters.Add("@p9", OleDbType.Date, 250, "HoraSalida")
        miCM.Parameters.Add("@p10", OleDbType.LongVarWChar, 8000, "Incidencia")
        miCM.Parameters.Add("@p11", OleDbType.LongVarWChar, 8000, "Solucion")
        miCM.Parameters.Add("@p12", OleDbType.Date, 250, "HoraCierre")
        miCM.Parameters.Add("@p13", OleDbType.Boolean, 2, "Presupuesto")
        miCM.Parameters.Add("@p14", OleDbType.LongVarWChar, 8000, "Recambios")
        miCM.Parameters.Add("@p15", OleDbType.Double, 8, "Importe")
        miCM.Parameters.Add("@p16", OleDbType.Char, 50, "Estado")
        miCM.Parameters.Add("@p17", OleDbType.Char, 50, "FranjaHoraria")
        miCM.Parameters.Add("@p18", OleDbType.Boolean, 2, "Facturado")
        miCM.Parameters.Add("@p19", OleDbType.Char, 50, "TipoUrgencia")
      Case "Update"
        miCM.CommandText = "UPDATE Urgencias SET Fecha=?, Hora=?, Cliente=?, Operario=?, NoOrden=?, NoContrato=?, Poliza=?, HoraEntrada=?, HoraSalida=?, Incidencia=?, Solucion=?, HoraCierre=?, Presupuesto=?, Recambios=?, Importe=?, Estado=?, FranjaHoraria=?, Facturado=?, TipoUrgencia=? WHERE IdUrgencia=?"
        miCM.Parameters.Add("@p1", OleDbType.Date, 250, "Fecha")
        miCM.Parameters.Add("@p2", OleDbType.Date, 250, "Hora")
        miCM.Parameters.Add("@p3", OleDbType.Integer, 4, "Cliente")
        miCM.Parameters.Add("@p4", OleDbType.Char, 50, "Operario")
        miCM.Parameters.Add("@p5", OleDbType.Char, 50, "NoOrden")
        miCM.Parameters.Add("@p6", OleDbType.Char, 50, "NoContrato")
        miCM.Parameters.Add("@p7", OleDbType.Char, 50, "Poliza")
        miCM.Parameters.Add("@p8", OleDbType.Date, 250, "HoraEntrada")
        miCM.Parameters.Add("@p9", OleDbType.Date, 250, "HoraSalida")
        miCM.Parameters.Add("@p10", OleDbType.LongVarWChar, 8000, "Incidencia")
        miCM.Parameters.Add("@p11", OleDbType.LongVarWChar, 8000, "Solucion")
        miCM.Parameters.Add("@p12", OleDbType.Date, 250, "HoraCierre")
        miCM.Parameters.Add("@p13", OleDbType.Boolean, 2, "Presupuesto")
        miCM.Parameters.Add("@p14", OleDbType.LongVarWChar, 8000, "Recambios")
        miCM.Parameters.Add("@p15", OleDbType.Double, 8, "Importe")
        miCM.Parameters.Add("@p16", OleDbType.Char, 50, "Estado")
        miCM.Parameters.Add("@p17", OleDbType.Char, 50, "FranjaHoraria")
        miCM.Parameters.Add("@p18", OleDbType.Boolean, 2, "Facturado")
        miCM.Parameters.Add("@p19", OleDbType.Char, 50, "TipoUrgencia")
        miCM.Parameters.Add("@p20", OleDbType.Integer, 4, "IdUrgencia")
        miCM.Parameters("@p20").SourceVersion = DataRowVersion.Original
      Case "Delete"
        miCM.CommandText = "DELETE * FROM Urgencias WHERE IdUrgencia=?"
        miCM.Parameters.Add("@p1", OleDbType.Integer, 4, "IdUrgencia")
        miCM.Parameters("@p1").SourceVersion = DataRowVersion.Original
    End Select
    Return miCM
  End Function
Espero que alguien pueda echarme una mano.
Matizo una vez más, que puedo hacer altas, modificaciones, eliminaciones, etc. El unico caso que me da problemas es cuando acabo de hacer una alta, guardo los cambios (Update y AcceptChanges), modifico el mismo registro, y vuelvo a guardar los cambios. En este punto me salta el error de concurrencia (Update afectó a 0 registros).

Muchas Gracias y un saludo.
__________________
..:: moNTeZIon ::..
  #5 (permalink)  
Antiguo 29/11/2005, 05:43
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 4 meses
Puntos: 9
Cuando hago nuevos registros en un dataset, por ejemplo a través del grid, una vez hago el dAdapter.Update(..., he de hacer algo más para que se actualicen los datos en el dataset?
El problema radica ahi, creo yo. Ya que al intentar modificar el mismo registro que acabo de crear, salta un error de concurrencia, y en cambio, modificando otros registros no.
He notado esto, porqué después de hacer el Update, recupero el campo IdUrgencia (autonumérico) y todavía no está en el dataset, en cambio si que está en la BD...

Al hacer el update, si no hay errores de ningun tipo, no deja el dataset "actualizado", digamos?? Que debo hacer para que se actualice realmente? , sin volver a cargar todos los registros, claro. Y así, consecuentemente, me permita las modificaciones de esos registros.
Por cierto, con AcceptChanges no basta. Me sigue dando el error.

Gracias a todos.
__________________
..:: moNTeZIon ::..

Última edición por moNTeZIon; 29/11/2005 a las 05:50
  #6 (permalink)  
Antiguo 29/11/2005, 22:15
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Y porque no mejor lo haces con acceso a datos de forma conectada.., personalmente no hago updates con dataset, todo lo hago con commands (executenonquery)

Salu2
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #7 (permalink)  
Antiguo 30/11/2005, 03:54
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 4 meses
Puntos: 9
OK Rootk, voy a intentarlo hacer así.
Pero para empezar, qué objeto utilizas como datasource del grid? lo sigo haciendo con un dataset?
Y qué es lo que haces, cada vez que se produce un cambió, ¿determinas el tipo de cambio y llamas al comando que ejecuta ese cambio? Lo miras a través del RowState del DataRow midificado o como?

Gracias man.
__________________
..:: moNTeZIon ::..
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:55.