XML en la BD

05/04/2005 - 21:51 por Johny | Informe spam
Tengo una duda que espero me puedan resolver:

Lo ke pasa es ke estuve revisando como funciona el método Update del
DataAdapter y noté que por cada registro hace un roundtrip al servidor y eso
para mis fines no es óptimo ya que tengo una ventana ke hace un mantenimiento
cuyo resultado pueden ser: 100 inserts, 40 updates y 30 deletes por ejm.

Entonces estuve viendo ke existe la forma de enviar a la BD toda la info en
un solo viaje o kisas menos utilizando XML especificamente el OPENXML de
SQLServer

Lo ke kisiera es ke me comenten como es este manejo ke tengo ke hacer para
lograr dicha funcionalidad (tanto en mi código VB.Net como en SQLServer)

Espero me puedan ayudar

Saludos
 

Leer las respuestas

#1 Angel J. Hernández M.
06/04/2005 - 21:41 | Informe spam
Saludos...

Puedes enviar toda la información en un solo viaje con un XML, en esto
tienes razón. Sin embargo la única limitante es la cantidad de texto
(longitud) XML que quieras pasar a SQL Server. En mi caso siempre paso el
texto como un nVarChar y solo pueden ser 4000 carácteres (esto porque es
Unicode) pues bien puedes usar también VarChar (no Unicode) el cual te
permite pasar hasta 8000 carácteres. La manera como lo harías es la
siguiente, desde tu aplicación VB.NET generas y armas el XML que le pasarás
al SP (SQL Server). Necesitas una conexión y un objeto SQLCommand, cargas la
colección de parámetros con el XML que generaste en la aplicación y despues
ejecutas el SP (Stored Procedure). En mi caso yo lo uso cuando quiero tocar
más de dos tablas, un escenario sería, encabezado - detalle. Con este
enfoque toda la lógica de datos (actualización) residiría en la BD lo cual
es lo recomendable. A continuación te muestro un ejemplo de como luciría tu
SP.

Create Procedure pa_InsertaRegistro
@ContenidoXML nVarChar(4000)
As
Declare @handledoc Int,
@campoid Int

Set xAct_Abort On

Exec sp_Xml_PrepareDocument @handledoc OUT, @ContenidoXML

If (@handledoc = 0) Begin

Insert Into Encabezado(cPregunta)
(Select cPregunta
From OpenXML(@handledoc, '/Contenido/Encabezado', 2)
With (cPregunta nVarChar(100)))

Select @campoid = @@Identity

Set @ContenidoXML = replace(@ContenidoXML, '%1',
Rtrim(Ltrim(Str(@campoid))))

Exec sp_Xml_PrepareDocument @handledoc OUT, @EncuestaXML

Insert Into Detalle(Fk_FacturaID, cTexto)
(Select Fk_EncuestaID, cTexto
From OpenXML(@handledoc, '/Contenido/Detalle/Parametro', 2)
With (Fk_EncuestaID Int './@Fk_EncuestaID', cTexto
nVarChar(30) './@cTexto'))

Commit Tran
End

Exec sp_Xml_RemoveDocument @handledoc

Go


Acá en un el parámetro (Texto) pasamos tanto el encabezado como el detalle.
La clave principal del encabezado es un Identity, una vez que lo inserto lo
recupero a partir de @@Identity. En el detalle tenemos un valor (%1) este lo
reemplazamos por el valor que se obtuvo al insertarse el encabezado. Después
insertamos el detalle. Este es un ejemplo que espero te pueda servir.

Saludos,


Angel J. Hernández M.
MCP - MCAD - MCSD - MCDBA
http://groups.msn.com/desarrolladoresmiranda




"Johny" wrote in message
news:
Tengo una duda que espero me puedan resolver:

Lo ke pasa es ke estuve revisando como funciona el método Update del
DataAdapter y noté que por cada registro hace un roundtrip al servidor y
eso
para mis fines no es óptimo ya que tengo una ventana ke hace un
mantenimiento
cuyo resultado pueden ser: 100 inserts, 40 updates y 30 deletes por ejm.

Entonces estuve viendo ke existe la forma de enviar a la BD toda la info
en
un solo viaje o kisas menos utilizando XML especificamente el OPENXML de
SQLServer

Lo ke kisiera es ke me comenten como es este manejo ke tengo ke hacer para
lograr dicha funcionalidad (tanto en mi código VB.Net como en SQLServer)

Espero me puedan ayudar

Saludos

Preguntas similares