Stored procedures

venerdì 27 luglio 2007 - 08.48

_J_ Profilo | Senior Member

da internet ho visto che la 'psicologia' di una stored procedure è del tutto simile ad una query, nel senso che anche qui valgono:

string mia_stored_p ="...";
SqlConnection miaConn = new SqlConnection(......);
SqlDataAdapter adatt = new SqlDataAdapter(mis_stored_p, miaConn);
adatt.SelectCommand.CommandType = CommandType.StoredProcedure;

DataSet ds = new DataSet();

i problemi sono:
1)
dove scrivo la stored procedure?anche qui devo fare una stringa (come una query)? posso prenderla da files esterni?

2)
dopo la dichiarazione del dataset ds devo usare il metodo fill(ds,"tabella")
ma 'tabella' chi è?
da db o la creo con datatable? e se la stored si riferisce a più tabelle che ci metto come parametro?

non mi sono chiari questi punti
_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..."

alx_81 Profilo | Guru

Ciao!
>da internet ho visto che la 'psicologia' di una stored procedure
>è del tutto simile ad una query, nel senso che anche qui valgono:
>
>string mia_stored_p ="...";
>SqlConnection miaConn = new SqlConnection(......);
>SqlDataAdapter adatt = new SqlDataAdapter(mis_stored_p, miaConn);
>adatt.SelectCommand.CommandType = CommandType.StoredProcedure;
>
>DataSet ds = new DataSet();
Esatto non cambia nulla, cambia il tipo e come chiami il comando, in più cambia come passi i parametri..
>
>i problemi sono:
>1)
>dove scrivo la stored procedure?anche qui devo fare una stringa
>(come una query)? posso prenderla da files esterni?
Allora, tu hai SQL Server Management Studio col tuo SQL Server 2005, giusto?
Bene, apri quello, ti connetti al server, clicki sul database col destro e selezioni New Query.. Da lì ti si apre una nuova finestra di query e utilizzi la seguente sintassi:

CREATE PROCEDURE
http://msdn2.microsoft.com/en-us/library/ms187926.aspx

una volta scritta la stored creala (F5). Alla fine ti trovi sotto il database alla voce Programmability-->Stored Procedures la tua <nomeproc>. A questo punto il codice si basa su quella..

>
>2)
>dopo la dichiarazione del dataset ds devo usare il metodo fill(ds,"tabella")
>ma 'tabella' chi è?
>da db o la creo con datatable? e se la stored si riferisce a
>più tabelle che ci metto come parametro?
ti viene creato un DataTable chiamato tabella nella collection delle tabelle del DataSet:
ds.tables[0] --> datatable creato.

Se la stored gestisce più query e tu devi tornarle tutte, forse è meglio spezzare la stored in più di una e fare le chiamate divise da codice.. Altrimenti, se la stored fa la select su una tabella piuttosto che su un'altra in base ad un parametro, lo definisci quando crei la stored. Da codice devi riempire la collection dei parameters del command.
Di più non posso dirti, dovrei sapere bene cosa fa la stored, cosa vuoi ottenere, ecc..


>
>non mi sono chiari questi punti
>_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..."

Alx81 =)

http://blogs.dotnethell.it/suxstellino

_J_ Profilo | Senior Member

innanzitutto scusami se non ho salutato nel mio post precedente, mi è sfuggito proprio

allora, io scrivo questo codice:

string sp = "sel_cod_p"; //è il nome della stored p , creata come hai detto tu(col manager)

SqlConnection oConn = new SqlConnection(ConfigurationManager.ConnectionStrings["dati_generali"].ConnectionString);
oConn.Open(); //apro la connessione...

SqlDataAdapter adattatore = new SqlDataAdapter(sp, oConn);
adattatore.SelectCommand.CommandType = CommandType.StoredProcedure;

adatt.SelectCommand.Parameters.Add(new SqlParameter("@cod_persona", SqlDbType.Int)); //un solo parametro
adatt.SelectCommand.Parameters["@cod_persona"].Value = Server.HtmlEncode(TextBox1.Text); //preso da qui

DataSet ds = new DataSet();
adatt.Fill(ds, "miatabella");
mioGridView.DataSource = ds.Tables["miatabella"].DefaultView;
mioGridView.DataBind();


dove la stored procedure è questa: //che poi è quella dei join di ieri, ma è una sola query (troppo lunga per essere querystring)

create PROCEDURE sel_cod_p ( @cod_persona INT)
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_istat_com_ita_prima_iscr,
b.nome_comune_ita AS prima_iscr,b.provincia AS provincia_iscrizione, cittadino.cod_padre,cittadino.cod_madre, cittadino.cod_fiscale, cittadino.prima_cittadinanza, cittadino.seconda_cittadinanza, tabella_decod_condizione.nome_condizione, tabella_decod_condizione.cod_residenza_correlata, tabella_decod_residenza.nome_residenza, tabella_decod_vie_cittadine.nome_via, domicilio.num_civico, domicilio.flag_domicilio_corrente, ruolo_in_nf_o_conviv.cod_nucleo_familiare, ruolo_in_nf_o_conviv.cod_parentela_con_is_o_cc, 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
RETURN

ma a runtime quando vado a scrivere nella textb1 nn ottengo nulla... non carica proprio il gridview, come se non leggesse il parametro e quindi non trovasse nulla... dove sbaglio?
_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..."

alx_81 Profilo | Guru

>innanzitutto scusami se non ho salutato nel mio post precedente,
>mi è sfuggito proprio
io saluto sempre, non era per farti notare il mancato saluto
non ti preoccupare che nemmeno me n'ero accordo
>
>ma a runtime quando vado a scrivere nella textb1 nn ottengo nulla...
>non carica proprio il gridview, come se non leggesse il parametro
>e quindi non trovasse nulla... dove sbaglio?
A mio avviso sbagli approccio..
non aspettarti risultati direttamente sul web se hai appena iniziato a scrivere le stored procedure..
ti consiglio di fare un bel debug.. partendo proprio dalla stored proc..
fai qualcosa tipo:
DECLARE @codpersona int SET @codpersona = <tuo_cod_persona> EXEC sel_cod_p @codpersona

se ti torna dati, il problema non sta nella stored.
se non torna dati.. sono quei JOIN .. potrebbe essere che qualche tabella non abbia record di relazione.. e allora non ottieni alcun risultato..
Quindi ti puoi spostare sul SQL Profiler (raggiungibile dal menu Tools del SSMS). Con questo tracci la chiamata che il codice fa verso il db.
Oppure vai direttamente sul debug del codice per vedere se tutti i parametri che passi (con le watch) sono corretti..
Credo che il miglior metodo per capire perchè le cose non vanno o per capire come gira il codice sia il debug..
Alx81 =)

http://blogs.dotnethell.it/suxstellino

_J_ Profilo | Senior Member

la query con tutti quei join è perfettamente funzionante, tant'è vero che ho scelto la strada delle stored p per evitare di scrivere delle querystring chilometriche... (e in effetti le stored le sto trovando comode...)

leggendo il codice che mi hai dato tu mi è venuto il dubbio che avessi scritto male qc variabile o qc nome nella stored, ma il problema era nell'aspx.cs dove in effetti richiamavo la stored nella querystring con il nome sbagliato (invece di 'sel_cod_p' ho messo 'sel_cod_' )

il debug su manager però l'ho fatto comunque, e mi funziona anche la stored

lo sai? non ti ringrazierò mai abbastanza per l'aiuto che mi stai dando e, credimi, per uno che inizia è davvero importante essere aiutati, perchè così non si cade nello sconforto e non si rinuncia...

grazie ancora!


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

alx_81 Profilo | Guru

>la query con tutti quei join è perfettamente funzionante, tant'è
>vero che ho scelto la strada delle stored p per evitare di scrivere
>delle querystring chilometriche... (e in effetti le stored le
>sto trovando comode...)
>leggendo il codice che mi hai dato tu mi è venuto il dubbio che
>avessi scritto male qc variabile o qc nome nella stored, ma il
>problema era nell'aspx.cs dove in effetti richiamavo la stored
>nella querystring con il nome sbagliato (invece di 'sel_cod_p'
>ho messo 'sel_cod_' )
>il debug su manager però l'ho fatto comunque, e mi funziona anche
>la stored
>
>lo sai? non ti ringrazierò mai abbastanza per l'aiuto che mi
>stai dando e, credimi, per uno che inizia è davvero importante
>essere aiutati, perchè così non si cade nello sconforto e non
>si rinuncia...
figurati..
però ricorda una cosa.. sbattici sempre la testa.. provaci, leggi msdn che ha dentro tante cose (forse smarrisce un po' all'inizio.. ma così ci fai la mano) e se non ci "salti fuori" scrivici che proviamo ad aiutarti!!
>
>grazie ancora!
è stato un piacere
Alx81 =)

http://blogs.dotnethell.it/suxstellino

_J_ Profilo | Senior Member

forse tu non immagini ma la testa ce la sto sbattendo parecchio... e alle volte mi fa parecchio male!

una curiosità: l'istruzione:

adattatore.SelectCommand........ a quanto ho capito la parte SelectCommand implica la presenza di una select ... l'ho visto anche per le normali query.
inoltre ci sono anche deletecommand, ecc... che presuppongono l'uso per le delete ecc..

devo per forza fare queste distinzioni tra selectcommand, deletecommand, ecc in base alle query/stored che scrivo?


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

alx_81 Profilo | Guru

>devo per forza fare queste distinzioni tra selectcommand, deletecommand,
>ecc in base alle query/stored che scrivo?
se tu lanci una stored procedure che inserisce o aggiorna, puoi usare la ExecuteNonQuery dell'oggetto SQLCommand.
se la sp ritorna dati, usi il DataAdapter con la fill per popolare un dataset, oppure l'ExecuteReader del command per riempire un datareader..
>
>
>_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..."

Alx81 =)

http://blogs.dotnethell.it/suxstellino

_J_ Profilo | Senior Member

ok, grazie per la 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..."
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5