Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-07-2008
xjre xjre is offline
Miembro
 
Registrado: feb 2008
Posts: 13
Poder: 0
xjre Va por buen camino
Smile Xml + Sql + Delphi

Buenas!

Estuve dandole muchas vueltas ya al asunto y revisando tanto el foro como google y no encontre solución a este problema.

El tema es asi: yo solía en su momento trabajando en otra plataforma (C#, muchos meses atras ya) mandar a un store de sql una tabla con datos en formato xml (DataSet.GetXml para los entendidos) que luego el store procesaria en un cursor y haría lo que correspondiera. Hasta hoy en día en Delphi lo "ate con alambre" y utilice tablas temporales de sql (cosa muy fea a mi gusto). Entonces decidí tratar de traducir eso que hacía a delphi, epro me encontre con el problema del parámetro tipo "text".

1) Delphi lo toma como memo (lógico), y por lo tanto cuando asigno el parametro debo hacerlo asi:

Código Delphi [-]
    SPAgrupar.Close;
    SPAgrupar.ParamByName('@Xml').AsMemo:= Xml;
    SPAgrupar.Open;

Siendo Xml la tabla transformada en xml con sus respectivos datos.
Al store le hago un open porque devuelve un select al final de todo el desmadre que hace. Ahora bien, cuando lo ejecuto, tira el famoso error de "error opening cursor handle". Me fijo con el analizador de sqñ qué me esta tirando el programa al ejecutar y me encuentro con esto:

Código Delphi [-]
     EXEC "GenerarGrupos;1" ''

que me llamó la atención porque no corresponde a lo normal que manda delphi cuando ejecuta un store (exec nombredelstore param1, param2, ...). Ademas al copiar esto y meterlo en el query analizer, me tira error ("no se reconoce el store GenerarGrupos;1").

2) Lo próximo que pensé fue mandarlo como .AsString y setear el parameter size del objeto store en 2147483647. Sin embargo, cuando pongo:


Código Delphi [-]
    SPAgrupar.Close;
    SPAgrupar.ParamByName('@Xml').AsString:= Xml;
    SPAgrupar.Open;

me lo termina truncando de todas formas. Si la tabla tiene pocas filas, larga el store de maravilla. Ahora bien, si la tabla es muy grande, me lo trunca y al ejecutar el store el sql encuentra algo asi como "error de lógica de xml: no cerraste el xml bobo".

Lo probé utilizando ADO y sucede lo mismo.

¿Alguien sabe como solucionar esto?

Gracias por la ayuda!

Saludos
Responder Con Cita
  #2  
Antiguo 06-07-2008
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
Yo lo utilizo con ADO y no tengo ningún problema

Como declaraste el parametro en el sp?
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #3  
Antiguo 10-07-2008
xjre xjre is offline
Miembro
 
Registrado: feb 2008
Posts: 13
Poder: 0
xjre Va por buen camino
Código SQL [-]
 
CREATE proc GenerarGrupos
(
  @Xml text
)
as
BEGIN
  /* ====================== Comandos para preparar el xml ====================*/
  set nocount on 
  declare @xmlDocumentId int
  declare @xmlDocumentHeader varchar(100)
  declare @pathName varchar(47)
  set textsize 2147483647
  set @xmlDocumentHeader = ''

  exec sp_xml_preparedocument @xmlDocumentId output, @Xml , @xmlDocumentHeader
  set @pathName = 'DataSet/Fila'

Esa es la declaración y las primeras líneas. No puedo creerlo, hace una semana que estoy con esto y todavia no le puedo dar pie con bola

Saludos
Responder Con Cita
  #4  
Antiguo 10-07-2008
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
A ver, si te funciona así:

Tu dices que si haces...

Código Delphi [-]
SPAgrupar.Close;
SPAgrupar.ParamByName('@Xml').AsString:= Xml;
SPAgrupar.Open;

Con tablas pequeñas, no tienes problema, pero con tablas grandes si... ¿Porque no lo intentas así, a ver que sucede?

Código Delphi [-]
SPAgrupar.Close;
SPAgrupar.ParamByName('@Xml').AsWideString := Xml;
SPAgrupar.Open;
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #5  
Antiguo 14-07-2008
xjre xjre is offline
Miembro
 
Registrado: feb 2008
Posts: 13
Poder: 0
xjre Va por buen camino
El AsString anda perfecto, ya lo había probado pero como decis surgen problemas con las tablas grandes. Me fijo con el AsWideString y posteo los resultados.

Gracias por la respuesta

Saludos
Responder Con Cita
  #6  
Antiguo 14-07-2008
xjre xjre is offline
Miembro
 
Registrado: feb 2008
Posts: 13
Poder: 0
xjre Va por buen camino
Es curioso porque ahora lo probe de 0 en otra situacion y anda perfecto, asi que por lo tanto el problema fue particular de la que describi arriba.

Utilice el .AsMemo y el analizador de consulas sigue tirandome el

EXEC "SaveNoEntregados;1" 1973, "xml"

con ese "1" que tanto me intriga pero en este caso funciona perfectamente.

Eventualmente si encuentro cuál era el error del otro caso lo postearé para que quede.

Si alguien lee este thread de casualidad y quiere saber algo sobre esto que uso porque le puede llegar a servir, PM y le explico lo que necesite


Saludos y gracias a los que respondieron.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Consulta Delphi 6, Delphi 2005 y Delphi 2006 Leviatan Varios 6 18-08-2007 16:02:08


La franja horaria es GMT +2. Ahora son las 19:04:37.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi