277 messaggi dal 20 maggio 2001
Considerando quanto segue:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;


public partial class connessione : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        SqlConnectionStringBuilder conn = new SqlConnectionStringBuilder();
        conn.DataSource = "localhost\\SQLExpress";
        conn.InitialCatalog = "Daniele";
        conn.IntegratedSecurity = true;
        try
        {
            SqlConnection connessione = new SqlConnection(conn.ConnectionString);
            SqlCommand reader = new SqlCommand("SELECT * FROM Products", connessione);
            
            connessione.Open();
            SqlDataReader lettura = reader.ExecuteReader();
            ListBox1.DataSource = lettura;
            ListBox1.DataTextField = "Nome";
            ListBox1.DataValueField = "Cognome";
            ListBox1.DataBind();
            Response.Write("Elementi restituiti: " + ListBox1.Items.Count.ToString());
            
           
           
           
            
            
        }


        catch(HttpException errore)
        {
            Response.Write(errore.ToString());
        }
      
        
    }
}


Esiste un'altro metodo per verificare il numero dei record restituiti dalla query? io ho utilizzato:

Response.Write("Elementi restituiti: " + ListBox1.Items.Count.ToString());


poiché non saprei come utilizzare la query "SELECT COUNT(*) FROM Products" all'interno del codice che ho scritto, avete qualche suggerimento da darmi oppure la mia scelta è corretta?
72 messaggi dal 04 agosto 2008
Ciao Daniele,
l'SqlDataReader non contiene informazioni sul numero di righe per cui devi leggerlo tutto per sapere quante ne contiene (e se lo leggi e' un problema perche' poi non puoi fare il bind con la ListBox) o verificarlo sull'oggetto che ne legge il contenuto se ce l'hai. Tu ce l'hai (gli items della ListBox) e quindi concettualmente, dal mio punto di vista, l'approccio e' corretto.
Comunque se vuoi eseguire la count sulla tabella, devi semplicemente fare un'altra chiamata al DB del tipo:
SqlCommand reader2 = new SqlCommand("SELECT count(*) FROM Products", connessione);
int conteggio = (int)reader2.ExecuteScalar();

In teoria ci sarebbero problemi di transazione (se qualcuno inserisce un record tra la prima e la seconda chiamata, il count non e' corretto) ma non credo sia questo il caso.
Mi permetto di ricordarti di chiudere le connessioni http://forum.aspitalia.com/forum/post/283569/Try-Catch.aspx
Ciao
Salvo
277 messaggi dal 20 maggio 2001
Bene bene, come pensavo quindi. Avevo già valutato la possibilità di aprire una seconda connessione e lanciare un nuovo comando, nello specifico quello che mi hai suggerito anche te per ottenere il numero delle righe restituite, ma non sapevo se fosse una best pratice o meno. P.S. Grazie per i consigli sul rilascio delle risorse con la chiusura della connessione al db! :)
277 messaggi dal 20 maggio 2001
Rieccomi!
Ho provato ad inserire, come consigliato,

finally
{
connessione.Close()
connessione.Dispose()
}


dopo il blocco catch, ma nel momento in cui scrivo "connessione", l'intellisense non mi propone i metodi "Close()" e "Dispose()", cosa invece che avviene all'interno del blocco "Try", cosa sbaglio?
72 messaggi dal 04 agosto 2008
Ciao,
in prima approssimazione, dovresti dichiarare connessione fuori dal blocco try:
SqlConnection connessione;
try
{
connessione = new SqlConnection(conn.ConnectionString);


io personalmente eviterei la chiamata a Close e lascerei solo quella a Dispose (che comunque chiude la connessione) e la farei precedere da un check per evitare che connessione sia null:
finally
{
if (connessione != null)
   connessione.Dispose();
}


Compreso il meccanismo, potresti risparmiare codice sostituendo il blocco try, catch, finally con uno using:
using(SqlConnection connessione = new SqlConnection(conn.ConnectionString))
{
...
}


che si occupa autonomamente di gestire in sicurezza la connessione.
Ciao
s
277 messaggi dal 20 maggio 2001
giuffrixyz ha scritto:
Ciao,
in prima approssimazione, dovresti dichiarare connessione fuori dal blocco try:
SqlConnection connessione;
try
{
connessione = new SqlConnection(conn.ConnectionString);


io personalmente eviterei la chiamata a Close e lascerei solo quella a Dispose (che comunque chiude la connessione) e la farei precedere da un check per evitare che connessione sia null:
finally
{
if (connessione != null)
   connessione.Dispose();
}


Compreso il meccanismo, potresti risparmiare codice sostituendo il blocco try, catch, finally con uno using:
using(SqlConnection connessione = new SqlConnection(conn.ConnectionString))
{
...
}


che si occupa autonomamente di gestire in sicurezza la connessione.
Ciao
s

Mi sono documentato sull'utilizzo della direttiva "using", e sembra essere più conveniente, o quantomeno, fa risparmiare qualche riga di codice, ovvero il Close() e il Dispose(), visto e considerato che si occupa autonomamente di interrompere il flusso e d'invocare il Dispose() automaticamente sull'oggetto quando l'esecuzione del codice è stata completata. Mi faresti la gentilezza di suggerirmi come adattare tale metodo al mio codice? Grazie in anticipo!

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.