El esquema del ejemplo a desarrollar seria algo así:
Este ejemplo lo haremos en dos partes, la primera será tan simple que generaremos un XML a partir de un DataSet con la tabla Categories como se muestra en el siguiente figura:
Para lograr esto crearemos un método el cual me llene el DataGrid con la tabla a mostrar:
Necesitaremos dos variables de ámbito global dentro de nuestro formulario:
Dim ds As New DataSet("Northwind")
Dim sql As String
El método que crearemos se llamara LlenaDataSet:
Sub LlenaDataSet()
Try
xCon = New SqlConnection(strCon)
xCon.Open()
sql = "Select CategoryId, CategoryName, Description from Categories"
Dim ad As New SqlDataAdapter(sql, xCon)
ad.Fill(ds, "Categorias")
dgCategorias.DataSource = ds.Tables("Categorias")
xCon.Close()
Catch ex As Exception
MsgBox("Sucedio un error...")
End Try
End Sub
En el load del formulario colocaremos lo siguiente:
LlenaDataSet()
dgCategorias.Columns(0).Visible = False
Finalmente para generar el XML tendremos lo siguiente:
Dim savefile As New SaveFileDialog
savefile.Filter = "Archivo Xml (*.xml)*.xml "
If savefile.ShowDialog = Windows.Forms.DialogResult.OK Then
ds.WriteXml(savefile.FileName)
End If
AL generar el XML debera tener la siguiente forma:
Ahora para la muestra o carga del archivo XML necesitaremos el siguiente formulario:
Para el botón mostrar colocaremos lo siguiente:
Dim OpenFile As New OpenFileDialog
If OpenFile.ShowDialog = Windows.Forms.DialogResult.OK Then
ds.ReadXml(OpenFile.FileName)
dgCategorias.DataSource = ds.Tables("Categorias")
End If
Ahora para la CategoryID = 1 modificaremos el nombre de la categoría de “Beverages” por “Others”, y en CategoryID = 4 haremos el cambio de “Dairy Products” por “Very Cheeses”
Luego tenemos que en el botón guardar colocaremos lo siguiente:
Try
xCon = New SqlConnection(strCon)
xCon.Open()
sql = "Select CategoryId, CategoryName, Description from Categories"
Dim ad As New SqlDataAdapter(sql, xCon)
Dim xBuilder As New SqlCommandBuilder(ad)
ad.Update(ds, "Categorias")
xCon.Close()
Catch ex As Exception
MsgBox("Sucedio un error...")
End Try
Pero al revisar los datos mostrados nos encontramos con que los registros se han insertado en vez de haberse modificado…..
Esto es debido que al cargar el archivo XML mediante el método ReadXML las filas se encuentran con el estado DataRowState.Added que estan marcadas como filas añadidas, esto lo podemos comprobar mediante el siguiente código:
Dim dr As DataRow
For Each dr In ds.Tables("Categorias").Rows
If dr.RowState = DataRowState.Added Then
MsgBox("Estado de la fila: " + dr.RowState)
End If
Next
Como se muestra en la siguiente imagen:
Para resetear las filas, es decir para que una vez cargadas mantenga el estado Unchanged, debemos ejecutar o simular que los cambios han sido aceptados, esto lo obtenemos con el método AcceptChanges, esto lo pondríamos después de cargar el archivo.
ds.ReadXml(OpenFile.FileName)
dgCategorias.DataSource = ds.Tables("Categorias")
ds.Tables("Categorias").AcceptChanges()
Ahora si volvamos a ejecutar el ejemplo, y veremos que los cambios serán afectados sobre los datos existentes.