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

Preguntas similare

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
Respuesta Responder a este mensaje
#2 Johny
06/04/2005 - 22:01 | Informe spam
Muchas gracias Angel pero solo algunas preguntas adicionales:

1. Ke significa esta parte With (Fk_EncuestaID Int './@Fk_EncuestaID',
cTexto, específicamente './@Fk_EncuestaID'???

2. Para el caso de INSERT es bastante simple por lo ke observo pero ke
sucede cuando kiero hacer un UPDATE o DELETE. El manejo es el mismo???

Lo ke pasa es ke tengo un proceso como les comente ke realiza múltiples
INSERT, UPDATE y DELETE al mismo tiempo y todo ese DataSet manipulado kiero
mandarlo a la BD para ke se ejecute con XML.


Espero me puedas ayudar

Saludos
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida