Configurare un SqlDataSource

Un DataSource è un controllo Asp.Net utilizzato per interfacciare una fonte dati come un data base o un file Xml a uno o più controlli Asp.Net con interfaccia utente, come una griglia o un menu a tendina.

Il DataSource quindi legge i dati e li rende disponibili ai controlli visuali; tramite questi controlli l'utente può anche effettuare la modifica dei dati, che viene effettuata sempre a livello di Data Source. 

Esistono diversi tipi di DataSource, in questo articolo descrivo il controllo SqlDataSource il quale consente l'accesso a un data base che può essere Sql Server ma anche Oracle, MySql, e altri.

Definire un SqlDataSource

Per creare un SqlDataSource trascinare il controllo dalla toolbox alla pagina aspx. Per configurarlo usare lo smart task menu.

Specificare una stringa di connessione qualora sia già definita nel file web.config altrimenti crearne una nuova.

Per definire la stringa di connessione nel web.config:

<configuration>
	<connectionStrings>
		<add name="Grid_List_DB" providerName="System.Data.SqlClient" connectionString="Server=localhost; User ID=sergio; Password=dream_theater; Database=Grid_List_Demo_DB;" />
	</connectionStrings>
</configuration>

Specificare i campi o creare una query Sql.

Filtrare i dati

Per filtrare i dati cliccare su Where. In questo modo è possibile specificare filtri statici nella query Sql oppure filtri che dipendono dai valori passati ad esempio in querystring o da altri controlli presenti nella pagina.

In questo esempio si filtra il campo Title in base al contenuto di una textbox chiamata txtFiltra:

Modificare i dati

Se il DataSource sarà associato a controlli usati solo per la lettura dei dati, come una Combo Box o una tabella allora è sufficiente specificare la query di selezione. Invece per DataSource nei quali è prevista anche la modifica dei dati bisogna cliccare sul pulsante Advanced.

In questo modo si generano in automatico le query di Update, Insert e Delete nel DataSource. Se ad esempio non è previsto l'inserimento dei dati è meglio cancellare via codice la query di Insert e la parte relativa a InsertParameters.

Ecco un esempio di SqlDataSource all'interno di una pagina .aspx. Naturalmente non produce alcun output html, a fare questo ci pensano i controlli come GridView, ListView ecc. associati a questo DataSource. Ne parlerò negli articoli successivi.

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
	ConnectionString="<%$ ConnectionStrings:Grid_List_DB %>" 
	DeleteCommand="DELETE FROM [Categorie] WHERE [ID] = @ID" 
	InsertCommand="INSERT INTO [Categorie] ([ID], [Name], [Link], [Published], [Order], [Picture], [Keywords]) VALUES (@ID, @Name, @Link, @Published, @Order, @Picture, @Keywords)"
	SelectCommand="SELECT [Categorie] ([ID], [Name], [Link], [Published], [Order], [Picture], [Keywords] FROM [Categorie]" 
	UpdateCommand="UPDATE [Categorie] SET [Name] = @Name, [Link] = @Link, [Published] = @Published, [Order] = @Order, [Picture] = @Picture, [Keywords] = @Keywords WHERE [ID] = @ID">
	
	<DeleteParameters>
		<asp:Parameter Name="ID" Type="Int16" />
	</DeleteParameters>
	<InsertParameters>
		<asp:Parameter Name="ID" Type="Int16" />
		<asp:Parameter Name="Name" Type="String" />
		<asp:Parameter Name="Link" Type="String" />
		<asp:Parameter Name="Published" Type="Boolean" />
		<asp:Parameter Name="Order" Type="Byte" />
		<asp:Parameter Name="Picture" Type="String" />
		<asp:Parameter Name="Keywords" Type="String" />
	</InsertParameters>
	<UpdateParameters>
		<asp:Parameter Name="Name" Type="String" />
		<asp:Parameter Name="Link" Type="String" />
		<asp:Parameter Name="Published" Type="Boolean" />
		<asp:Parameter Name="Order" Type="Byte" />
		<asp:Parameter Name="Picture" Type="String" />
		<asp:Parameter Name="Keywords" Type="String" />
		<asp:Parameter Name="ID" Type="Int16" />
	</UpdateParameters>
</asp:SqlDataSource>

Concurrency

I dati visualizzati da un controllo che si appoggia su un DataSource sono asincroni, ovvero offline. Questo significa che quando un utente cerca di fare una modifica è possibile che i dati che sta visualizzando sono già stati modificati da un altro utente.

Ci sono due modi per gestire questa situazione:

  1. Fare in modo che se i dati che l'utente sta cercando di modificare non sono aggiornati, venga mostrato un avviso per dire che la modifica in quel momento non è possibile. Poi si aggiorna la visualizzazione dei dati e si chiede all'utente di riprovare. Questo metodo si chiama Optmistic Concurrency.
  2. Lasciare che l'aggiornamento vada sempre a buon fine, quindi l'ultimo utente ad effettuare l'aggiornamento ha la meglio.

E' possibile fare questa scelta nel DataSource, ma il primo caso va gestito via codice.

Autore: Sergio Roberto Boarina