Para evitar esto, el adatador de datos contiene una propiedad para gestionar estos tipos de inconvenientes de concurrencia, con el cual se le puede indicar al adaptador realizar los cambios asi encuentre errores de concurrencia, esta propiedad es:
ContinueUpdateOnError
El cual acepta valores boleanos para indicarles como comportarser ante los errores de concurrencia y con el método:
GetErrors
Tendremos aquellas filas que generaron errores o aquellas que no se grabaron por presentar errores.
En el siguiente ejercicio veremos como manejar estos casos.
Veamos primero creamos un formualrio simple con un datagriq y un boton.
las variables que necesitamos son las siguientes:
Dim sql As String
Dim ds As New DataSet
Dim ad As SqlDataAdapter
Dentro del formulario en el evento load escribimos lo siguiente:
Try
xCon = New SqlConnection(strCon)
xCon.Open()
'Agregue los comandos necesarios:
sql = "Select CustomerID, CompanyName," + _
"ContactName, Address " + _
"from customers"
ad = New SqlDataAdapter(sql, xCon)
Dim xBuilder As New SqlCommandBuilder(ad)
ad.Fill(ds, "Clientes")
Me.dgClientes.DataSource = ds.Tables("Clientes")
xCon.Close()
Catch ex As Exception
MsgBox("Sucedio un error...")
End Try
Al ejecutar hasta aqui el formulario tendremos lo siguiente:
Figura 1
Dentro del boton colocaremos lo siguiente:Try
If ds.HasChanges Then
ad.Update(ds, "Clientes")
MsgBox("Cambios realizados", MsgBoxStyle.Information, "Aviso Sistemas")
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Aviso Sistemas")
End Try
Para el primer caso agregaremos una letra al final de cada compañía para ver como es el comportamiento para ALFKI, ANATR y ANTON
Figura 2
Antes de realizar la grabación para generar un error de concurrencia, debemos realizar la siguiente modificación en la base de datos:
UPDATE CUSTOMERS SET COMPANYNAME='Alfreds FutterkistesBB'
WHERE CUSTOMERID = 'ALFKI'
Esto indica que no se realizo ningun cambio, basta que alteremos uno de los registros por base a uno de los que queremos modificar…. Y nos saldra el siguiente error al realizar la modificación:
Figura 3
Bien, como evitar esto???? , y seguir con el procesamiento asi existan errores de concurrencia?, para eso tenemos los métodos anterios que hemos explicado, en el boton de procesamiento modificaremos según las siguientes lineas:
Try
'Preguntamos si existe algun cambio
If ds.HasChanges Then
'Si existen errores continuaremos
ad.ContinueUpdateOnError = True
ad.Update(ds, "Clientes")
'Obtenemos las filas que generaron errores
Dim rows As DataRow() = ds.Tables("Clientes").GetErrors
'Verificamos que existan filas con errores
If rows.Length.ToString > 0 Then
Dim s As String = ""
'Recorremos las filas con errores
For Each r As DataRow In rows
s += "Codigo: " + r("CustomerID") + _
" - Compañia: " + r("CompanyName") + vbCrLf
Next
MsgBox("Error al realizar los cambios." + vbCrLf + _
"Filas no afectadas:" + vbCrLf + s, _
MsgBoxStyle.Exclamation, "Aviso Sistemas")
Else
MsgBox("Cambios realizados", MsgBoxStyle.Information, "Aviso Sistemas")
End If
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Aviso Sistemas")
End Try
Antes de realizar el procesamiento, añadiremos una X a los 5 primeros registros:
Figura 5
Luego por base cambiaremos a los 3 ultimos como se muesta a continuacion, añadiendole al final los carateres BB:
UPDATE CUSTOMERS SET COMPANYNAME='Antonio Moreno TaqueríasBB'
WHERE CUSTOMERID = 'ANTON'
UPDATE CUSTOMERS SET COMPANYNAME='Around the HornBB'
WHERE CUSTOMERID = 'AROUT'
UPDATE CUSTOMERS SET COMPANYNAME='Berglunds snabbköpBB'
WHERE CUSTOMERID = 'BERGS'
Y al realizar la grabación, quedaran afectadas solo las 2 primeras y las 3 restantes son las que presentaron errores de concurrencia:
UPDATE CUSTOMERS SET COMPANYNAME='Antonio Moreno TaqueríasBB'
WHERE CUSTOMERID = 'ANTON'
UPDATE CUSTOMERS SET COMPANYNAME='Around the HornBB'
WHERE CUSTOMERID = 'AROUT'
UPDATE CUSTOMERS SET COMPANYNAME='Berglunds snabbköpBB'
WHERE CUSTOMERID = 'BERGS'
Y al realizar la grabación, quedaran afectadas solo las 2 primeras y las 3 restantes son las que presentaron errores de concurrencia:
Figura 6
Figura 7
Espero les sirva de ayuda...saludossss.
No hay comentarios:
Publicar un comentario