74 messaggi dal 23 maggio 2005
Ciao a tutti!
Sto approfondendo la mia conoscenza sulle stored procedure.Potete
aiutarmi a capire bene come recuperare i parametri di output?
Ho una stored procedure che utilizzo per popolare un DataGrid.
Più precisamente utilizzo il metodo di una classe che usa la stored procedure e mi restituisce un DataReader.
Nella stored ho messo anche delle righe di codice per recuperare il numero di record restituiti dalla query :

SET @query = 'SELECT @RC = Count(*) FROM Prodotti'
EXEC sp_executesql @query, N'@RC int OUTPUT', @RC = @RecordCount OUTPUT

RETURN

Il valore di @RC mi serve per impostare il VirtualItemCount del
DataGrid che a sua volta mi serve per impostare il PageButtonCount.
Quando chiamo il metodo per popolare il Datagrid automaticamente mi viene settato anche il valore del VirtualItemCount o devo impostarlo da codice?
3.121 messaggi dal 29 ottobre 2001
Contributi | Blog
Per utilizzare i paremtri di output ti basta utilizzare questo codice in asp.net:

conn.Open();
SqlCommand com=new SqlCommand();
com.CommandType=CommandType.StoredProcedure;
com.CommandText="TuaStoredProcedure";
com.Connection=conn;
SqlParameter par=new SqlParameter("@RC",SqlDbType.Int);
par.Direction=ParameterDirection.Output;
com.Parameters.Add(par);
DataReader dr=com.ExecuteReader(); // <- per esempio
int quanti=Convert.ToInt32(par.Value.ToString());

Nella SP devi dichiarare naturalmente il parametro @RC come output:
Create Procedure TuaStoredProcedure
(
@rc int ouput,
....
)
as
SELECT @RC = Count(*) FROM Prodotti
....
go

Per il VirtualItemCount, devi assegnarlo tu, visto che il datagrid si baserà su di esso per creare il numero di pagine, ma come datasource dovrai dare TU i dati paginati. In questo tutorial cerco di spiegare il suo utilizzo: http://www.aspitalia.com/articoli/asp.net/paginazione.aspx

Ora non so che procedura usi tu per la paginazione e mi fermo qui
Ciao
74 messaggi dal 23 maggio 2005
Grazie per il chiarimento! Ho anche letto il tuo tutorial e mi è chiaro il modo di procedere però il mio approccio è diverso e credo meno semplice.Innanzitutto nel progetto che sto sviluppando ho creato delle classi ognuna delle quali gestisce i dati di un database e nelle
varie pagine asp richiamo i metodi delle varie classi di volta in volta necessari.Nel caso del DataGrid cui ho fatto riferimento, per la paginazione richiamo un metodo passandogli come parametri PageSize e CurrentPageIndex:

dgProdotti.DataSource = prodotto.GetAllProducts(dgProdotti.PageSize, dgProdotti.CurrentPageIndex);

Lo stesso metodo lo richiamo anche nel PageIndexChanged e così posso saltare ad una qualsiasi pagina del DataGrid.
Il metodo che richiamo mi restituisce un DataReader e utilizza una stored procedure che mi restituisce anche il numero di record da visualizzare come parametro di output.
Il metodo è:

public SqlDataReader GetAllProducts(int size, int index)
{
SqlConnection con = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
SqlCommand cmd = new SqlCommand("Prova3",con);
cmd.CommandType = CommandType.StoredProcedure;

SqlParameter parameterSize = new SqlParameter("@pageSize",SqlDbType.Int);
parameterSize.Value = size;
cmd.Parameters.Add(parameterSize);

SqlParameter parameterIndex = new SqlParameter("@currentIndex",SqlDbType.Int);
parameterIndex.Value = index;
cmd.Parameters.Add(parameterIndex);

SqlParameter parameterConta = new SqlParameter("@RecordCount",SqlDbType.Int);
parameterConta.Direction = ParameterDirection.Output;
cmd.Parameters.Add(parameterConta);

con.Open();

SqlDataReader result = cmd.ExecuteReader(CommandBehavior.CloseConnection);


return result;


}


In questa maniera mi funziona.Però nella pagina asp dove il metodo viene richiamato per poter visualizzare tutte le pagine del DataGrid
devo impostare il VirtualItemCount ad un valore preciso.
Come posso fare a renderlo dinamico e sfruttare la stored procedure ?
Ciao
3.121 messaggi dal 29 ottobre 2001
Contributi | Blog
Il tuo problema è poter passare il valore del numero dei record preso dalla SP, al codice che poi popolerà il datagrid.

Io la funzione la riscriverei così:

public SqlDataReader GetAllProducts(int size, int index, ref int total) {
SqlConnection con = new
SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]); SqlCommand cmd = new SqlCommand("Prova3",con);
cmd.CommandType = CommandType.StoredProcedure;

SqlParameter parameterSize = new
SqlParameter("@pageSize",SqlDbType.Int);
parameterSize.Value = size;
cmd.Parameters.Add(parameterSize);

SqlParameter parameterIndex = new
SqlParameter("@currentIndex",SqlDbType.Int);
parameterIndex.Value = index;
cmd.Parameters.Add(parameterIndex);

SqlParameter parameterConta = new
SqlParameter("@RecordCount",SqlDbType.Int);
parameterConta.Direction = ParameterDirection.Output;
cmd.Parameters.Add(parameterConta);

con.Open();

SqlDataReader result =
cmd.ExecuteReader(CommandBehavior.CloseConnection);

total=Convert.ToInt32(parameterConta.Value.ToString());

return result;
}

Per richiamare questa funzione, dovrai scrivere:

int total=0;
dgProdotti.DataSource = prodotto.GetAllProducts(dgProdotti.PageSize, dgProdotti.CurrentPageIndex, ref total);
dgProdotti.VirtualItemCount=total
dgProdotti.DataBind();

Ciao
74 messaggi dal 23 maggio 2005
Grazie!  Ho imparato una cosa nuova!
Però qualcosa non va!
Mi viene visualizzata solo la prima pagina dei risultati
senza i bottoni per andare ad altre pagine.
Ho inserito una label nella pagina per visualizzare il valore che viene assegnato al VirtualItemCount ed è 0.Perchè?
Ciao
3.121 messaggi dal 29 ottobre 2001
Contributi | Blog
Daniela62 <Daniela62> ha scritto:
Ho inserito una label nella pagina per visualizzare il valore che viene assegnato al VirtualItemCount ed è 0.Perchè?
Ciao

In questo caso devi verificare se quel parametro ritorna effettivamente il numero di record totali.

Fai delle prove anche con dei banali response.write per sapere se ritorna il numero di record corretto, per esempio:

con.Open();

SqlDataReader result =
cmd.ExecuteReader(CommandBehavior.CloseConnection);

total=Convert.ToInt32(parameterConta.Value.ToString());
Response.Write(parameterConta.Value.ToString());
return result;

Se ritorna "0", saliamo di un livello e andiamo nella SP. Qui con il query analyzer di sql server controlla se in @rc ritorni effettivamente il numero di record totali (basta anche un print @rc nel codice della SP).
Ciao
74 messaggi dal 23 maggio 2005
Ho inserito print @rc nel codice della SP.Quando la eseguo dov'è che "printa"?
Mi scioglieresti un dilemma che ho da tempo?
Quando eseguo una query con il query analyzer mi viene richiesto di
immettere i parametri.Per i parametri di input tutto ok,ma quando devo immettere il valore dei parametri di output cosa scrivo?
In questo caso che valore di RC immetto? <DEFAULT> no!
<NULL> ?
Dopo mi viene visualizzato il foglio dati con il recordset dei risultati ma dove vado a leggere il valore di RC?
Ciao
3.121 messaggi dal 29 ottobre 2001
Contributi | Blog
Daniela62 ha scritto:
Ho inserito print @rc nel codice della SP.Quando la eseguo dov'è che "printa"?
Mi scioglieresti un dilemma che ho da tempo?

Nel query analyzer, dove compare la tabella dei risultati, in fondo c'è un tab "Messaggi" o qualcosa di simile. I print vanno a finire lì.

Quando eseguo una query con il query analyzer mi viene richiesto di
immettere i parametri.Per i parametri di input tutto ok,ma quando devo immettere il valore dei parametri di output cosa scrivo?
In questo caso che valore di RC immetto? <DEFAULT> no!
<NULL> ?

Metti semplicemente 0 (zero).

Dopo mi viene visualizzato il foglio dati con il recordset dei risultati ma dove vado a leggere il valore di RC?
Ciao

Vedi il tab "Messaggi" citato sopra.

Ciao

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.