Chequear datos de DataTable contra el origen

17/12/2004 - 00:12 por Enrique Vargas | Informe spam
Hola amigos, el asunto es el siguiente::

Creo una Datable le agrego las columnas y leo unos registros desde un
archivo XML, y así lleno el datable.

Lo siguiente q debo hacer es insertar esos registros(datatable) en la base
de datos, pero antes debo verificar cuales existen ya en la BD(q podra ser
el 95%).

Alguien ha hecho algo parecido,, a mi se me ocurre crear la TableMappings,
y asi poder llamar al update del DataAdapter, o cargar en una array los
datos existentes y chequearlos contra el datatable e ir eliminandolos y
despues ejecutar commands. Bueno alguna sugerencia o consejo.

Muchas Gracias.
 

Leer las respuestas

#1 SqlRanger
18/12/2004 - 11:57 | Informe spam
No dices que sistema de base de datos estás usando ni dices tampoco qué
harías en caso de que el registro ya esté en la base de datos. Así que voy a
suponer que el sistema de base de datos es SQL Server y que si el registro
ya está en la base de datos entonces habría que actualizarlo.

Lo que yo haría en este caso sería lo siguiente:
* Crear en diseño un dataset con tipo que incluya la tabla en cuestión
* Crear un procedimiento almacenado en SQL Server que actualice el
registro si existe y lo inserte si no existe
* Crear un SqlDataAdapter con sólo la propiedad InsertComand establecida
al procedimiento almacenado
* Cargar los datos del archivo xml en el dataset con tipo y llamar al
método Update del DataAdapter. No es necesario establecer TableMappings ya
que al Update del Adapter le pasamos el DataTable, no el DataSet.

Te voy a poner un ejemplo para la tabla Customers de la base de datos
Northwind que viene de ejemplo con SQL Server.

El archivo XML podría ser algo como esto:

<?xml version="1.0" encoding="utf-8"?>
<Customers>
<Customer>
<CustomerID>ALFKI</CustomerID>
<CompanyName>Alfreds Futterkiste</CompanyName>
</Customer>
<Customer>
<CustomerID>NUEVO</CustomerID>
<CompanyName>Nuevo cliente</CompanyName>
</Customer>
</Customers>

Crearía, en diseño, un dataset con tipo llamado Customers con la tabla
Customer y los campos CustomerID y CompanyName. El método que cargaría los
datos del archivo xml en el datset podría ser algo como:


' Carga los clientes del archivo XML en un dataset tipado llamado Customers
que devuelve
Public Function LoadCustomersFromXml(ByVal XmlFile As String) As
Customers
Dim xmlDoc As New XmlDocument
Dim Customers As New Customers
xmlDoc.Load(XmlFile)
For Each xmlCustomerElement As XmlElement In
xmlDoc.DocumentElement.ChildNodes
Dim CustomerRow As Customers.CustomerRow
CustomerRow = Customers.Customer.NewCustomerRow
CustomerRow.CompanyName xmlCustomerElement.SelectSingleNode("CompanyName").InnerText
CustomerRow.CustomerID xmlCustomerElement.SelectSingleNode("CustomerID").InnerText
Customers.Customer.AddCustomerRow(CustomerRow)
Next
Return Customers

End Function

Observa que todos los registros en el datatable Customer tienen como
RowState = New con lo que un DataAdapter ejecutaría en comando InsertCommand
para todos estos registros.

NOTA: no llamar a AcceptChanges, esto haría que todos los registros tuvieran
el RowState = Unchanged y un DataAdapter no actualizaría nada en la base de
datos.

Añadiría en diseño un SqlCommand correspondiente al procedimiento
almacenado:

create procedure spImportCustomer
@CustomerID nChar(5),
@CompanyName nVarChar(40)
as
update Customers
set CompanyName = @CompanyName
where CustomerID = @CustomerID

if @@RowCount = 0
insert into Customers(CustomerID, CompanyName)
values (@CustomerID, @CompanyName)

Para ello lo arrastaría desde el explorador de servidores hasta el
formulario o componente. Le cambiaría el nombre a "cmdImportCustomer". La
colección parameters hay que modificarla de la siguiente manera:

La Propiedad SourceColumn del parámetro @CustomerID hay que poner CustomerID
(El nombre de la columna en el datatable)
La Propiedad SourceColumn del parámetro @CompanyName hay que poner
CompanyName (El nombre de la columna en el datatable).

Luego se añade un SqlDataAdapter en diseño llamado daImportCustomers. Cuando
sale el asistente lo cancelamos. Entonces establecería las propiedades:

SelectCommand = ninguno
UpdateCommand = ninguno
DeleteCommand = ninguno
InsertCommand = cmdImportCustomer

Al final el método para importar los datos sería

Public Sub ImortCustomers()
Try
Dim Customers As Customers LoadCustomersFromXml("Customers.xml")
Me.daImportCustomers.Update(Customers.Customer)
MsgBox("Operación completada correctamente")
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub


Saludos:

Jesús López
MVP

"Enrique Vargas" escribió en el mensaje
news:
Hola amigos, el asunto es el siguiente::

Creo una Datable le agrego las columnas y leo unos registros desde un
archivo XML, y así lleno el datable.

Lo siguiente q debo hacer es insertar esos registros(datatable) en la base
de datos, pero antes debo verificar cuales existen ya en la BD(q podra ser
el 95%).

Alguien ha hecho algo parecido,, a mi se me ocurre crear la


TableMappings,
y asi poder llamar al update del DataAdapter, o cargar en una array los
datos existentes y chequearlos contra el datatable e ir eliminandolos y
despues ejecutar commands. Bueno alguna sugerencia o consejo.

Muchas Gracias.



Preguntas similares