Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

DELPHI 7 - ADO ADOStoredProc Con Parametri

54 views
Skip to first unread message

Enrico Giudici

unread,
Nov 13, 2022, 9:12:01 AM11/13/22
to
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

Alberto Salvati

unread,
Nov 14, 2022, 5:12:48 AM11/14/22
to
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.

Enrico Giudici

unread,
Nov 14, 2022, 7:04:09 AM11/14/22
to
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.

Enrico Giudici

unread,
Nov 14, 2022, 5:37:11 PM11/14/22
to
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.

Alberto Salvati

unread,
Nov 15, 2022, 3:18:22 AM11/15/22
to
Siamo invecchiati tutti, Enrico...
Mo sono 54 e l'anno prossimo mia figlia dovrebbe prendere la laurea triennale....
Dove kaz finisce il tempo prp non so...
Comunque, invecchio ma non miglioro e sopratutto non cambio.... la mia priorità rimangono le hostess, ovvio, ma anche donne "non hostess" vanno bene...mica sono razzista... :-D

Bastava lasciare i parametri a designtime e assegnarne il tipo. Comunque mi fa piacere che hai risolto.

Qua il nome del parametro è sbagliato:
> cOut := ADOStoredProc1.Parameters.ParamValues['@RETURN_VALUE'];

cOut := ADOStoredProc1.Parameters.ParamValues['XMLOut'];
---------------------------------------------------------------------------------^^^^^^^^^^^


> 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.

Enrico Giudici

unread,
Nov 15, 2022, 8:49:42 AM11/15/22
to
Ciao Alberto,
anche per me mo so 60 tondi tondi e mi fermo qui per non tediare gli altri componenti del gruppo.

>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
0 new messages