Condividi tramite


Selezione dei dati tramite il controllo SqlDataSource

Aggiornamento: novembre 2007

È possibile utilizzare il controllo SqlDataSource per recuperare i dati da un database utilizzando piccole quantità di codice o nessun codice. Il controllo SqlDataSource può funzionare con qualsiasi database provvisto di un provider ADO.NET associato configurato nella sezione DbProviderFactories della configurazione, compresi i database Microsoft SQL Server, Oracle, ODBC o OLE DB, quale Microsoft Access. Il database utilizzato determinerà la sintassi delle istruzioni SQL fornite per la configurazione del SqlDataSource da utilizzare e la possibilità di utilizzare funzionalità più avanzate del database, come, ad esempio, le stored procedure. Il controllo origine dati, tuttavia, viene eseguito allo stesso modo per tutti i database.

Per recuperare i dati da un database tramite il controllo SqlDataSource, è necessario impostare almeno le seguenti proprietà:

  • ProviderName   Impostare sul nome del provider ADO.NET che rappresenta il database utilizzato. Se si utilizza Microsoft SQL Server, impostare la proprietà ProviderName su "System.Data.SqlClient"; se si utilizza un database Oracle, impostare la proprietà ProviderName su"System.Data.OracleClient" e così via.

  • ConnectionString   Impostare su una stringa di connessione adatta al database.

  • SelectCommand   Impostare su una query SQL o stored procedure che restituisca i dati del database. La query impostata per la proprietà SelectCommand è la stessa impostata per la proprietà CommandText di un oggetto IDbCommand ADO.NET quando si scrive il codice di accesso ai dati ADO.NET. L'effettiva sintassi della query SQL dipende dallo schema dei dati e dal database che si sta utilizzando.

Le sezioni seguenti illustrano le proprietà in modo dettagliato.

Specifica del nome di un provider

Impostare la proprietà ProviderName sul nome del provider ADO.NET associato al tipo di database in cui sono memorizzati i dati. L'elenco dei provider disponibili è registrato nella sezione DbProviderFactories del file di configurazione, nel file Machine.config o nel file Web.config. Per impostazione predefinita, il controllo SqlDataSource utilizza il provider ADO.NET System.Data.SqlClient, che corrisponde a Microsoft SQL Server. Pertanto, se ci si connette a un database SQL Server, non è necessario specificare esplicitamente un provider. Tuttavia, è anche possibile specificare i provider System.Data.OracleClient, System.Data.Odbc o System.Data.OleDb. Per ulteriori informazioni, vedere ADO.NET.

Nota:

Non impostare la proprietà ProviderName sul valore di un provider ADO non gestito, ad esempio SQLOLEDB o MSDAORA.

Specifica di una stringa di connessione

Impostare la proprietà ConnectionString su una stringa di connessione utilizzata per un database specifico. Tuttavia, per i siti di grandi dimensioni, non è semplice gestire una strategia di impostazione della proprietà ConnectionString di un controllo SqlDataSource su una specifica stringa di connessione. Inoltre, la stringa di connessione viene successivamente memorizzata in testo normale nella pagina ASP.NET. Per garantire una migliore gestione e protezione dell'applicazione Web, si consiglia di memorizzare le stringhe di connessione nell'elemento connectionStrings del file di configurazione dell'applicazione. Sarà quindi possibile aggiungere un riferimento alla stringa di connessione tramite un'espressione di connessione simile alla seguente:

<asp:SqlDataSource 
  ID="SqlDataSource1" 
   
  ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
   SelectCommand="SELECT * FROM [Categories]">
</asp:SqlDataSource>

Per garantire una maggiore protezione, è possibile crittografare i contenuti della sezione di configurazione <connectionStrings>. Per ulteriori informazioni, vedere Crittografia e decrittografia di sezioni di configurazione.

Impostazione del comando Select

È possibile specificare una query SQL che deve essere eseguita dal controllo SqlDataSource impostandone la proprietà SelectCommand. Nel seguente esempio viene illustrata una query SQL che recupera un gruppo di risultati costituito dai cognomi di tutti i dipendenti in una tabella Employees:

SELECT LastName FROM Employees;

Nel seguente esempio di codice vengono illustrate le modalità di impostazione delle proprietà ConnectionString e SelectCommand di un controllo SqlDataSource per la visualizzazione dei dati Employees in un controllo GridView:

<%@ Page language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >
      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>
<%@ Page language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >
      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >
      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>

Se il database utilizzato supporta le stored procedure, è possibile impostare la proprietà SelectCommand sul nome della stored procedure e la proprietà SelectCommandTypeStoredProcedure per indicare che la proprietà SelectCommand fa riferimento a una stored procedure. Nel seguente esempio viene illustrata una stored procedure semplice che è possibile creare in SQL Server:

CREATE PROCEDURE sp_GetAllEmployees AS
    SELECT * FROM Employees;
GO

Per configurare il controllo SqlDataSource per l'utilizzo della stored procedure, impostare il testo della SelectCommand su "sp_GetAllEmployees" e la proprietà SelectCommandType su StoredProcedure.

La maggior parte delle stored procedure utilizza parametri. Per ulteriori informazioni sull'utilizzo delle stored procedure con parametri, vedere Utilizzo dei parametri con il controllo SqlDataSource.

In fase di esecuzione, il controllo SqlDataSource sottopone il testo nella proprietà SelectCommand al database, il quale restituisce il risultato della query o della stored procedure al controllo SqlDataSource. Qualsiasi controllo Web associato al controllo origine dati visualizza il gruppo di risultati sulla pagina ASP.NET.

Passaggio di parametri alle istruzioni SQL

Spesso gli utenti interagiscono con i dati in base a parametri che possono essere risolti o valutati solo in fase di esecuzione. I dati visualizzati su una pagina Web ASP.NET, ad esempio, potrebbero rappresentare un report per una data specifica. Se l'utente seleziona una data differente, anche i dati nel report potrebbero cambiare. Se la data viene modificata esplicitamente dall'utente o a livello di programmazione dall'applicazione Web, la query SQL che viene sottoposta al database può risultare più flessibile e gestibile se è una query SQL con parametri, in cui gli elementi dell'istruzione SQL sono associati alle variabili dell'applicazione Web e valutati in fase di esecuzione.

Il controllo SqlDataSource supporta le query SQL con parametri associando i parametri aggiunti all'insieme SelectParameters con segnaposto nella query SelectCommand. I valori dei parametri possono essere letti da un altro controllo nella pagina, dallo stato sessione, dal profilo utente e da altri elementi. Per ulteriori informazioni, vedere Utilizzo dei parametri con il controllo SqlDataSource.

La sintassi utilizzata per i segnaposto può variare, a seconda del tipo di database. Se si utilizza SQL Server, il nome del parametro comincia con il carattere "@" e corrisponde al nome dell'oggetto Parameter nell'insieme SelectParameters. Se si utilizza un database ODBC o OLE DB, i parametri in un'istruzione con parametri non sono denominati e sono specificati con il carattere segnaposto "?".

Nel seguente esempio viene illustrato come una query SQL con parametri recupera tutti gli ordini nel database Northwind di SQL Server, in base all'ID del dipendente connesso.

SELECT * FROM Orders WHERE EmployeeID = @empid

In questo esempio, l'espressione @empid è il parametro valutato in fase di esecuzione.

Nel seguente esempio di codice viene illustrata una query SQL con parametri che richiede il valore del parametro da un altro controllo nella pagina:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >

      <p><asp:dropdownlist
          id="DropDownList1"
          
          autopostback="True">
          <asp:listitem selected="True">Sales Representative</asp:listitem>
          <asp:listitem>Sales Manager</asp:listitem>
          <asp:listitem>Vice President, Sales</asp:listitem>
      </asp:dropdownlist></p>

      <asp:sqldatasource
          id="SqlDataSource1"
          
          connectionstring="<%$ ConnectionStrings:MyNorthwind%>"
          selectcommand="SELECT LastName FROM Employees WHERE Title = @Title">
          <selectparameters>
              <asp:controlparameter name="Title" controlid="DropDownList1" propertyname="SelectedValue"/>
          </selectparameters>
      </asp:sqldatasource>

      <p><asp:listbox
          id="ListBox1"
          
          datasourceid="SqlDataSource1"
          datatextfield="LastName">
      </asp:listbox></p>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >

      <p><asp:dropdownlist
          id="DropDownList1"
          
          autopostback="True">
          <asp:listitem selected="True">Sales Representative</asp:listitem>
          <asp:listitem>Sales Manager</asp:listitem>
          <asp:listitem>Vice President, Sales</asp:listitem>
      </asp:dropdownlist></p>

      <asp:sqldatasource
          id="SqlDataSource1"
          
          connectionstring="<%$ ConnectionStrings:MyNorthwind%>"
          selectcommand="SELECT LastName FROM Employees WHERE Title = @Title">
          <selectparameters>
              <asp:controlparameter name="Title" controlid="DropDownList1" propertyname="SelectedValue"/>
          </selectparameters>
      </asp:sqldatasource>

      <p><asp:listbox
          id="ListBox1"
          
          datasourceid="SqlDataSource1"
          datatextfield="LastName">
      </asp:listbox></p>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >

      <p><asp:DropDownList
          id="DropDownList1"
          
          AutoPostBack="True">
          <asp:ListItem Selected="True">Sales Representative</asp:ListItem>
          <asp:ListItem>Sales Manager</asp:ListItem>
          <asp:ListItem>Vice President, Sales</asp:ListItem>
      </asp:DropDownList></p>

      <asp:SqlDataSource
          id="SqlDataSource1"
          
          ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
          SelectCommand="SELECT LastName FROM Employees WHERE Title = @Title">
          <SelectParameters>
              <asp:ControlParameter Name="Title" ControlId="DropDownList1" PropertyName="SelectedValue"/>
          </SelectParameters>
      </asp:SqlDataSource>

      <p><asp:ListBox
          id="ListBox1"
          
          DataSourceID="SqlDataSource1"
          DataTextField="LastName">
      </asp:ListBox></p>

    </form>
  </body>
</html>

Per ulteriori informazioni sull'utilizzo dei parametri con il controllo SqlDataSource, vedere Utilizzo dei parametri con il controllo SqlDataSource. Per informazioni generali sull'utilizzo dei parametri delle origini dati, vedere Utilizzo di parametri con controlli origine dati.

Impostazione delle modalità di restituzione dei dati

La proprietà DataSourceMode del controllo SqlDataSource determina la modalità di gestione dei dati mediante tale controllo. Per impostazione predefinita, la proprietà DataSourceMode è impostata su DataSet, il che significa che il gruppo di risultati restituito dal database viene memorizzato nella memoria del server dal controllo SqlDataSource. Quando il controllo SqlDataSource recupera i dati in modalità DataSet, i relativi controlli con associazione a dati, quali GridView e DetailsView, sono in grado di offrire capacità di visualizzazione di dati complessi, quali ordinamento e impaginazione automatici.

In alternativa, è possibile impostare la proprietà DataSourceMode su DataReader, il che significa che il gruppo di risultati non viene salvato nella memoria. Nelle situazioni in cui non è necessario salvare un gruppo di risultati nella memoria del server, utilizzare la modalità DataReader.

Nel seguente esempio di codice vengono illustrate le modalità di impostazione della proprietà DataSourceMode del controllo SqlDataSource su DataReader in un contesto in cui non è richiesta alcuna attività di ordinamento, impaginazione o filtro.

<%@ Page language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >
      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>
<%@ Page language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >
      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >
      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>

Aggiunta dell'elaborazione personalizzata tramite gli eventi di controllo SqlDataSource

Il controllo SqlDataSource espone gli eventi che è possibile gestire per eseguire il codice personalizzato prima e dopo l'esecuzione di un'operazione di recupero dati da parte del controllo.

Il controllo SqlDataSource genera l'evento Selecting prima di effettuare la chiamata al metodo Select per eseguire la query SQL impostata nella proprietà SelectCommand. È possibile gestire l'evento Selecting per esaminare la query SQL prima che sia eseguita e per convalidare i parametri contenuti nell'insieme SelectParameters, oppure per eseguire qualsiasi ulteriore attività prima del recupero dei dati. Ad esempio, se si utilizza una FormParameter con il controllo SqlDataSource, è possibile gestire l'evento Selecting per convalidare il valore del parametro prima di recuperare i dati. La FormParameter richiede il valore inserito in un elemento HTML e lo invia al database senza alcuna convalida. Se il valore non è accettabile, è possibile annullare la query impostando la proprietà Cancel dell'oggetto SqlDataSourceSelectingEventArgs su true.

Il controllo SqlDataSource genera l'eventoSelected al termine del recupero dei dati. È possibile gestire l'evento Selected per determinare se è stata generata un'eccezione durante l'operazione del database oppure esaminare qualsiasi valore restituito dall'operazione dei dati.

Visualizzazione dei dati

Per visualizzare i dati su una pagina ASP.NET, utilizzare un controllo con associazione a dati, ad esempio un controllo GridView, DetailsView o FormView oppure controlli quali ListBox o DropDownList. Il controllo con associazione a dati agisce come un consumer dei dati recuperati dal controllo SqlDataSource. Impostare la proprietà DataSourceID del controllo con associazione a dati sull'ID del controllo SqlDataSource. Quando viene eseguito il rendering della pagina, il controllo SqlDataSource recupera i dati e li mette a disposizione del controllo con associazione a dati il quale, a sua volta, li visualizza. Per ulteriori informazioni sui controlli con associazione a dati e sulle modalità di utilizzo degli stessi con i controlli origine dati per la visualizzazione dei dati, vedere Cenni preliminari sui controlli server Web ASP.NET con associazione a dati.

Nel seguente esempio di codice viene illustrato come visualizzare i risultati della query utilizzando un controlloGridView.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >

      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT FirstName, LastName, Title FROM Employees">
      </asp:SqlDataSource>

      <asp:GridView
          id="GridView1"
          
          DataSourceID="SqlDataSource1">
      </asp:GridView>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >

      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT FirstName, LastName, Title FROM Employees">
      </asp:SqlDataSource>

      <asp:GridView
          id="GridView1"
          
          DataSourceID="SqlDataSource1">
      </asp:GridView>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >

      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
          SelectCommand="SELECT FirstName, LastName, Title FROM Employees">
      </asp:SqlDataSource>

      <asp:GridView
          id="GridView1"
          
          DataSourceID="SqlDataSource1">
      </asp:GridView>

    </form>
  </body>
</html>

Vedere anche

Concetti

Cenni preliminari sul controllo server Web SqlDataSource