Newsgroup: it.comp.lang.delphi
Titolo: DELPHI 7 - ADO ADOStoredProc Con Parametri

Buongiorno e buona domenica a tutti.
Di norma non ho mai avuto problemi in passato ad utilizzare i componenti ADO che sono presenti in Delphi, solo che è la prima volta che mi ci mento con il componente in oggetto.
La società con cui mio cognato ha a che fare mi ha messo a disposizione una Stored Procedure con 2 parametri, uno in input ( un XML da passare ) ed uno in output ( un XML di ritorno con l'esito ).
Bene mi sono detto, nessun problema, metto nella form il componente interessato ( ADOStoredProc ), definisco i due parametri ed il gioco è fatto.
Magari, è da ieri che non c'è verso che funzioni.
Parto dicendo cosa mi ha indicato la società della SP.
"la stored procedure da chiamare è sp_OPE_CheckXMLAndInsert,  ha un parametro di input (@XmlData) di tipo nvarchar(MAX)"
Tramite il design ho definito i 2 parametri con :
1) XMLData - pdInput - ftString ( provato anche a mettere WideString )
2) XMLOut - pdOutput - ftString ( provato anche a mettere WideString )
 
da codice :
1) ADOStoredProc1.Parameters.ParamByName('XMLData').Value := 'xxxx';
2) ADOStoredProc1.ExecProc;
3) cOut := ADOStoredProc1.Parameters.ParamValues['XMLOut'];
 
L'errore che mi viene ritornato alla riga 2 è il seguente :
"L'oggetto Parameter non è stato definito correttamente. Le informazioni fornite sono incoerenti o incomplete."
 
Premetto che la connessione all'istanza del DB funziona correttamente.
 
In alternativa ho provato anche con il componente "CommanText" mettendo i dovuti parametri ma non cambia nulla, stesso errore ritoranto.
 
Avete per cortesia qualche dritta da darmi per cercare di far funzionare sta benedetta SP ?
 
Ciao e grazie 1000 per il prezioso supporto da Enrico Giudici c/o Anthelios

Ciao, Enrico!
Azzz...anche tu sfigato a usare ancora delphi che è diventato un prodotto pesantemente "penale":.... :D
 
Prima di tutto, condoglianze: a parte delphi stai usando quella latrina di SqlServer... :-((
 
Io inizierei a provare con un parametro in input di tipo blob.
Crei uno stream, vi scrivi dentro la robaccia XML, ne  imposti la position a zero e poi:
 
 
  DOStoredProc1.Parameters.ParamByName('XMLData').LoadFromStream(stream, ftmemo);
 
Prova e vedi se esplode.
 
A.


Ciao carissimo,
non puoi nenache immaginare la felicità nel sentirti oltre che la speranza di avere un tuo preziosissimo supporto.
Fino a quando mio cognato insiste nell'utilizzare il mio programma sarò sempre legato a Delphi, e poi sono un nostalgico di professione :-) come per te le "hostess" :-)
Nel pomeriggio ci provo e compatibilmente alle mie capacità ti faccio sapere.
Lo sai che sono vecchio vero ? E mio cognato si va ad impelagare con cose strane e poi ci devo pensare io.
Grazie 1000 come sempre da Enrico Giudici c/o Anthelios.


Ciao Alberto,
nonostante abbia cercato in rete esempi di utilizzo di uno stream per provare il tuo suggerimento e il fatto che le mie capacità sono a livello di una foca ( con tutto il rispetto per le foche ) non sono riuscito a verificare la tua teoria.
Nonostante questo scrivendo il seguente codice e togliendo a design time i parametri :
 
ADOStoredProc1.Parameters.Refresh;
showmessage(ADOStoredProc1.Parameters.Items[0].Name); // Ritorna @RETURN_VALUE
showmessage(ADOStoredProc1.Parameters.Items[1].Name); // Ritorna @XmlData
ADOStoredProc1.Parameters.ParamByName('@XmlData').LoadFromFile('C:\temp\xxx.xml',ftBlob);
 
mi ritorna il seguente errore :
 
Operand type clash : image is incompatible with nvarchar(max)
 
ho provato anche con il parametro ftMemo e l'errore è lo stesso.
 
Visto che ormai ero alla deriva senza una terra dove approdare e senza sapere quello che stavo facendo sono arrivato a scrivere :
 
ADOStoredProc1.Parameters.Refresh;
ADOStoredProc1.Parameters.ParamByName('@XmlData').LoadFromFile('C:\temp\xxx.xml',ftWideString);
ADOStoredProc1.ExecProc;
cOut := ADOStoredProc1.Parameters.ParamValues['@RETURN_VALUE'];
showmessage(cOut);
 
Et voilà, funziona, però :
 
1) cOut mi ritorna 0 ( zero ), e qui devo sentire il fornitore della SP e sperando che l'XML gli sia arrivato.
2) Su XML molto grandi riesco ad inserirli nel tipo WideString senza che venga troncato per limiti ?
 
Ciao ed un sentito grazie a te e a tutti quelli che hanno avuto il tempo di leggere questo thread.
Enrico Giudici c/o Anthelios.
 

 2) Su XML molto grandi riesco ad inserirli nel tipo WideString senza che venga troncato per limiti ? 
 
Un widestring accetta fino a 2 giga ma file xml enormi hanno poco senso: avremmo TUTTI problemi a gestire un XML già da 500 megabyte.
Anche nodepad++ per aprirlo impiegherebbe molto tempo.
 
A.

Comunque mi fa piacere che hai risolto. 
Risolto è una parola grossa, vediamo con il fornitore cosa riesco a fare.
 
In questo caso mi hanno chiesto di passare tramite la SP un XML che potrebbe anche essere "corposetto", mi conforta il fatto che con il tipo WideString si possa arrivare fino a 2 Gb.
 
Ciao e grazie infinite per tutto da Enrico c/o Anthelios