Stored procedures parte2

sabato 28 luglio 2007 - 18.39

_J_ Profilo | Senior Member

buon sabato a tutti!

anche oggi vi porrò un problema che mi assilla...
sto usando una stored p così fatta:

create PROCEDURE [dbo].[sel_cod_p] ( @cod_persona INT, @cognome VARCHAR(30), @primo_nome Varchar(30), @secondo_nome varchar(30), @sesso varchar(1))
AS
SELECT cittadino.cod_persona, cittadino.cognome, cittadino.primo_nome, cittadino.secondo_nome, cittadino.sesso, cittadino.data_ora_min_nascita,
cittadino.cod_istat_com_ita_nascita, a.nome_comune_ita AS nascita, a.provincia AS provincia_nascita, cittadino.cod_fiscale, cittadino.prima_cittadinanza, cittadino.seconda_cittadinanza, tabella_decod_condizione.nome_condizione, tabella_decod_residenza.nome_residenza, tabella_decod_vie_cittadine.nome_via, domicilio.num_civico, ruolo_in_nf_o_conviv.cod_nucleo_familiare, tabella_decod_parentele.nome_parentela
FROM cittadino
INNER JOIN abita_in ON cittadino.cod_persona = abita_in.cod_persona
INNER JOIN domicilio ON abita_in.cod_via = domicilio.cod_via
INNER JOIN ruolo_in_nf_o_conviv ON cittadino.cod_persona = ruolo_in_nf_o_conviv.cod_persona
INNER JOIN tabella_decod_condizione ON cittadino.cod_condizione = tabella_decod_condizione.cod_condizione
INNER JOIN tabella_decod_comuni_ita a ON cittadino.cod_istat_com_ita_nascita =a.cod_comune_ita
INNER JOIN tabella_decod_comuni_ita b ON cittadino.cod_istat_com_ita_prima_iscr =b.cod_comune_ita
INNER JOIN tabella_decod_parentele ON ruolo_in_nf_o_conviv.cod_parentela_con_is_o_cc = tabella_decod_parentele.cod_parentela
INNER JOIN nucleo_fam_e_convivenze ON ruolo_in_nf_o_conviv.cod_nucleo_familiare = nucleo_fam_e_convivenze.cod_nucleo_familiare
INNER JOIN tabella_decod_residenza ON tabella_decod_condizione.cod_residenza_correlata = tabella_decod_residenza.cod_residenza
INNER JOIN tabella_decod_vie_cittadine ON domicilio.cod_via = tabella_decod_vie_cittadine.cod_via
WHERE (cittadino.cod_persona=@cod_persona) OR (cittadino.cognome=@cognome) or (cittadino.primo_nome=@primo_nome) OR (cittadino.secondo_nome=@secondo_nome) OR (cittadino.sesso=@sesso)
RETURN


nella where ho delle condizioni parametriche separate da alcuni or,ma all'atto dell'esecuzione continua a chiedermi TUTTI i parametri sebbene avessi appunto usato la or e non la and (in teoria dovrebbe 'accontentarsi' di almeno uno dei parametri della where, mentre è con and che me li dovrebbe pretendere tutti...)
è giusta la mia conoscenza dell'or ed and?

_J_

"Chi fa domande rischia di sembrare stupido,
chi non ne fa rischia di restare stupido..."

"Conosco me stesso? No, non parlo con gli estranei..."

ghio Profilo | Newbie

>buon sabato a tutti!
>
>anche oggi vi porrò un problema che mi assilla...
>sto usando una stored p così fatta:
>
>create PROCEDURE [dbo].[sel_cod_p] ( @cod_persona INT, @cognome
>VARCHAR(30), @primo_nome Varchar(30), @secondo_nome varchar(30),
>@sesso varchar(1))
>AS
>SELECT cittadino.cod_persona, cittadino.cognome, cittadino.primo_nome,
>cittadino.secondo_nome, cittadino.sesso, cittadino.data_ora_min_nascita,
>cittadino.cod_istat_com_ita_nascita, a.nome_comune_ita AS nascita,
>a.provincia AS provincia_nascita, cittadino.cod_fiscale, cittadino.prima_cittadinanza,
>cittadino.seconda_cittadinanza, tabella_decod_condizione.nome_condizione,
>tabella_decod_residenza.nome_residenza, tabella_decod_vie_cittadine.nome_via,
>domicilio.num_civico, ruolo_in_nf_o_conviv.cod_nucleo_familiare,
>tabella_decod_parentele.nome_parentela
>FROM cittadino
>INNER JOIN abita_in ON cittadino.cod_persona = abita_in.cod_persona
>INNER JOIN domicilio ON abita_in.cod_via = domicilio.cod_via
>INNER JOIN ruolo_in_nf_o_conviv ON cittadino.cod_persona = ruolo_in_nf_o_conviv.cod_persona
>INNER JOIN tabella_decod_condizione ON cittadino.cod_condizione
>= tabella_decod_condizione.cod_condizione
>INNER JOIN tabella_decod_comuni_ita a ON cittadino.cod_istat_com_ita_nascita
>=a.cod_comune_ita
>INNER JOIN tabella_decod_comuni_ita b ON cittadino.cod_istat_com_ita_prima_iscr
>=b.cod_comune_ita
>INNER JOIN tabella_decod_parentele ON ruolo_in_nf_o_conviv.cod_parentela_con_is_o_cc
>= tabella_decod_parentele.cod_parentela
>INNER JOIN nucleo_fam_e_convivenze ON ruolo_in_nf_o_conviv.cod_nucleo_familiare
>= nucleo_fam_e_convivenze.cod_nucleo_familiare
>INNER JOIN tabella_decod_residenza ON tabella_decod_condizione.cod_residenza_correlata
>= tabella_decod_residenza.cod_residenza
>INNER JOIN tabella_decod_vie_cittadine ON domicilio.cod_via =
>tabella_decod_vie_cittadine.cod_via
>WHERE (cittadino.cod_persona=@cod_persona) OR (cittadino.cognome=@cognome)
>or (cittadino.primo_nome=@primo_nome) OR (cittadino.secondo_nome=@secondo_nome)
>OR (cittadino.sesso=@sesso)
>RETURN
>
>
>nella where ho delle condizioni parametriche separate da alcuni
>or,ma all'atto dell'esecuzione continua a chiedermi TUTTI i parametri
>sebbene avessi appunto usato la or e non la and (in teoria dovrebbe
>'accontentarsi' di almeno uno dei parametri della where, mentre
>è con and che me li dovrebbe pretendere tutti...)
>è giusta la mia conoscenza dell'or ed and?
>
>_J_
>
>"Chi fa domande rischia di sembrare stupido,
>chi non ne fa rischia di restare stupido..."
>
>"Conosco me stesso? No, non parlo con gli estranei..."
Questo succede perche la sp ha tutti quei parametri :

@cod_persona INT
@cognome VARCHAR(30)
@primo_nome Varchar(30)
@secondo_nome varchar(30)
@sesso varchar(1)

non conta in che modo le clausole interagiscono con la query se hai dei parametri in ingresso li devi fornire. Ti consiglierei di scegliere un altra strada se non vuoi fornire tutti quei parametri alla sp. Spero di essere stato chiaro, M

_J_ Profilo | Senior Member

>Questo succede perche la sp ha tutti quei parametri :
>
>@cod_persona INT
>@cognome VARCHAR(30)
>@primo_nome Varchar(30)
>@secondo_nome varchar(30)
>@sesso varchar(1)
>
>non conta in che modo le clausole interagiscono con la query
>se hai dei parametri in ingresso li devi fornire. Ti consiglierei
>di scegliere un altra strada se non vuoi fornire tutti quei parametri
>alla sp. Spero di essere stato chiaro, M

ciao ghio!
ma sono quelli che mi elencato i parametri in ingresso... ho forse dimenticato di fare qualcosa? tipo dichiararli in un certo modo...
oppure le sp non amano query con più di un parametro? (ho separato cod_persona dagli altri, nel senso che ho riscritto la stessa sp ma solo con cod_persona, e mi funziona..., mentre ne ho scritta un'altra identica con i restanti parametri e il problema che ti ho detto mi rimane...)
_J_

"Chi fa domande rischia di sembrare stupido,
chi non ne fa rischia di restare stupido..."

"Conosco me stesso? No, non parlo con gli estranei..."

ghio Profilo | Newbie

Forse ho capito male, tu cosa intendi per :"continua a chiedermi TUTTI i parametri"?
che vuole che gli passi tutti i parametri o che, se non corrispondono tutti i parametri della query non ti restituisce nessun record? Ciao, M

_J_ Profilo | Senior Member

ho delle textbox che forniscono i parametri, e con l'or dovrei riempire almeno una casella.. invece vuole che io le riempia tutte per darmi dei record, cosa che fa l'and e non l'or... almeno per come li conosco io
_J_

"Chi fa domande rischia di sembrare stupido,
chi non ne fa rischia di restare stupido..."

"Conosco me stesso? No, non parlo con gli estranei..."

ghio Profilo | Newbie


prima di tutto separiamo i due problemi:
la stored procedure (sp), quindi sql server e linguaggio sql;
le textbox, linguaggio esterno di programmazzione che va a richiamare un sp nel dbms tramite una connessione.

la sp è come un funzione ad esempio void sel_cod_p(int cod_persona, string cognome,....., tu dichiari una funzione nel dbms con un determinato numero di parametri. questo è quanto.
immagina la store procedure come una funzione che deve essere utilizzata da un altra persona. Chi la usa non si deve preoccupare di cosa avviene all'interno, deve solo sapere il nome della funzione, quali parametri passare e cos gli tornerà in dietro.
d'altro canto chi sviluppa la funzione non si deve interessare di come essa verrà utilizzata deve solo fare in modo che i parametri che vengono passati siano utili per portare a termine il "compito" che la funzione si prefige.
ok, detto questo, torniamo all'inizio, separiamo i due problemi: se ti chiedi perchè una sp non funziona non puoi cercare la soluzione utilizzando delle textbox de forniscono delle stringhe, che vengono elaborate da una qualche funzione per poi essere passate tramite un motore qualsiasi ad un db. il problema, se c'è va cercato nel db utilizzando il linguaggio sql. dopo aver fatto ciò puoi pensare di realizzare un programma "consumatore" della tua sp ed andare poi a fare il debug del programma se qualcosa non funziona. Quindi ti consiglio di metterti sul db e controllare da li se la sp funziona oppure no. Spero di essermi spiegato, ciao, M

_J_ Profilo | Senior Member

ok, mi guarderò il db e le relazioni e poi ti dirò, ok?
intanto grazie 1000 x la tua disponibilità
_J_

"Chi fa domande rischia di sembrare stupido,
chi non ne fa rischia di restare stupido..."

"Conosco me stesso? No, non parlo con gli estranei..."

_J_ Profilo | Senior Member

allora, quando provo la query mi va tutto bene...
quando immetto la query in una stored p (il cui nome è sel_altri) mi funziona anche qui, a patto che se decido ad esempio di immettere un solo parametro, gli altri li devo per forza settare a NULL se voglio dei risultati, sennò li imposta lui a default e non mi trova nulla...

però poi quando uso la stored nel mio programma (con parametri e adapter impostati a dovere) non mi restituisce nulla se a runtime decido ad esempio di riempire una sola txtbox e le altre le lascio vuote (ricordo che i parametri li prendo da opportune txtbox)...

cmq se ti può chiarire quello che voglio fare, ti ho allegato il codice, sempre se otrai e se vorrai darci un'occhiata..
in questo codice c'è prima il controllo delle txtbox, e se la txtbox1 non è vuota (fornisce la chiave primaria) allora usa la stored 'sel_cod_p' per la ricerca (questa stored funziona), invece se la txtbox1 è vuota, allora ricerca per altri parametri con la stored 'sel_altri' (che è quella problematica..)

ancora grazie in anticipo
_J_

"Chi fa domande rischia di sembrare stupido,
chi non ne fa rischia di restare stupido..."

"Conosco me stesso? No, non parlo con gli estranei..."

ghio Profilo | Newbie

>allora, quando provo la query mi va tutto bene...
>quando immetto la query in una stored p (il cui nome è sel_altri)
>mi funziona anche qui, a patto che se decido ad esempio di immettere
>un solo parametro, gli altri li devo per forza settare a NULL
>se voglio dei risultati, sennò li imposta lui a default e non
>mi trova nulla...
>
>però poi quando uso la stored nel mio programma (con parametri
>e adapter impostati a dovere) non mi restituisce nulla se a runtime
>decido ad esempio di riempire una sola txtbox e le altre le lascio
>vuote (ricordo che i parametri li prendo da opportune txtbox)...
>
>cmq se ti può chiarire quello che voglio fare, ti ho allegato
>il codice, sempre se otrai e se vorrai darci un'occhiata..
>in questo codice c'è prima il controllo delle txtbox, e se la
>txtbox1 non è vuota (fornisce la chiave primaria) allora usa
>la stored 'sel_cod_p' per la ricerca (questa stored funziona),
>invece se la txtbox1 è vuota, allora ricerca per altri parametri
>con la stored 'sel_altri' (che è quella problematica..)
>
>ancora grazie in anticipo
>_J_
>
>"Chi fa domande rischia di sembrare stupido,
>chi non ne fa rischia di restare stupido..."
>
>"Conosco me stesso? No, non parlo con gli estranei..."
credo che tu debba comunque passsare i parametri anche quando le textbox "sono vuote" passando un valore null. Ciao, M

_J_ Profilo | Senior Member

ci avevo pensato pure io anche se in realtà non ne sono convinto... mi sembra strano arrivare fino a questo punto, credevo che i null li passasse da sè...
adesso proverò io a passare il null mediante il dbnull...
intanto grazie
_J_

"Chi fa domande rischia di sembrare stupido,
chi non ne fa rischia di restare stupido..."

"Conosco me stesso? No, non parlo con gli estranei..."
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5