Esporta (0) Stampa
Espandi tutto
1 di 2 hanno valutato il contenuto utile: - Valuta questo argomento

Modifica dei dati tramite il controllo SqlDataSource

È possibile utilizzare il controllo SqlDataSource per modificare i dati di un database. Il modo più comune per utilizzare il controllo SqlDataSource negli scenari di aggiornamento consiste nel recuperare i dati e visualizzarli mediante un controllo Web server con associazione a dati come, ad esempio, GridView, DetailsView o un controllo FormView. Configurare il controllo con associazione a dati e SqlDataSource per aggiornare i dati. La maggior parte dei controlli con associazione a dati possono essere configurati per supportare le operazioni di inserimento, aggiornamento ed eliminazione, e trasferiscono i valori da aggiornare al controllo origine dati. Il controllo origine dati invia quindi i valori aggiornati al database utilizzando un'istruzione SQL o una stored procedure.

Il controllo SqlDataSource è progettato per aggiornare i dati un record alla volta. Per eseguire gli aggiornamenti in batch, è necessario scrivere la logica ciclica in modo esplicito nell'applicazione ASP.NET.

Nozioni fondamentali

Per modificare i dati di un database utilizzando il controllo SqlDataSource, è necessario impostare almeno le seguenti proprietà:

  • ProviderName   Impostato sul nome del provider ADO.NET che rappresenta il database in uso.

  • ConnectionString   Impostato su una stringa di connessione che funziona con il database.

  • Proprietà del comando SqlDataSource Impostate sulle istruzioni SQL che modificano i dati nel database.

Nelle sezioni seguenti, le proprietà vengono illustrate in modo dettagliato.

Nome del provider

Impostare la proprietà ProviderName sul nome del provider ADO.NET per il tipo di database in cui sono memorizzati i dati, che può includere quanto segue:

  • Se si utilizza Microsoft SQL Server, impostare la proprietà ProviderName su "System.Data.SqlClient". Se non viene specificato un altro provider, questo sarà il provider predefinito.

  • Se si utilizza un database Oracle, impostare la proprietà ProviderName su "System.Data.OracleClient".

  • Se si utilizza un'origine dati OLE DB, impostare la proprietà ProviderName su "System.Data.OleDb".

  • Se si utilizza un'origine dati ODBC, impostare la proprietà ProviderName su "System.Data.Odbc".

Stringa di connessione

Impostare la proprietà ConnectionString per connettersi a un determinato database. Si consiglia di memorizzare le stringhe di connessione nell'elemento ConnectionStrings del file di configurazione dell'applicazione. È possibile quindi fare riferimento alle stringhe di connessione memorizzate utilizzando la sintassi <%$ ConnectionStrings:connectionStringName %> nel codice del controllo. La stringa di connessione deve essere valida per il ProviderName specificato.

Commands

Il controllo SqlDataSource dispone di tre proprietà comando che possono contenere istruzioni SQL che modificano i dati: le proprietà InsertCommand, UpdateCommand e DeleteCommand. È possibile impostare le proprietà comando su un'istruzione SQL o sul nome di una stored procedure, se queste ultime sono supportate dall'origine dati. L'effettiva sintassi dell'istruzione SQL dipende dallo schema dei dati e dal database in uso. L'istruzione può includere parametri se questi sono supportati dall'origine dati.

NoteNota

L'istruzione impostata per la proprietà del comando è uguale a quella impostata per la proprietà CommandText di un oggetto IDbCommand ADO.NET durante la scrittura del codice di modifica dati ADO.NET.

L'istruzione SQL nella proprietà UpdateCommand viene eseguita ogni volta che viene chiamato il metodo Update. Il metodo Update è chiamato in modo implicito dai controlli associati a dati quando l'utente fa clic sul pulsante Aggiorna in un controllo GridView, FormView o DetailsView. È anche possibile chiamare il metodo in modo esplicito dal codice. I metodi Insert e Delete del controllo SqlDataSource funzionano in modo simile.

Nell'esempio di codice riportato di seguito viene illustrato come utilizzare un controllo SqlDataSource per inserire, aggiornare e eliminare record mediante un controllo FormView. Nell'esempio viene illustrata la connessione al database Northwind di SQL Server.


<%@ Page language="C#" %>

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

  void EmployeesGridView_OnSelectedIndexChanged(Object sender, EventArgs e)
  {
    EmployeeDetailsSqlDataSource.SelectParameters["EmpID"].DefaultValue = 
      EmployeesGridView.SelectedValue.ToString();
    EmployeeFormView.DataBind();
  }

  void EmployeeFormView_ItemUpdated(Object sender, FormViewUpdatedEventArgs e)
  {
    EmployeesGridView.DataBind();
  }
  
  void EmployeeFormView_ItemDeleted(Object sender, FormViewDeletedEventArgs e)
  {
    EmployeesGridView.DataBind();
  }

  void EmployeeDetailsSqlDataSource_OnInserted(Object sender, SqlDataSourceStatusEventArgs e)
  {
    System.Data.Common.DbCommand command = e.Command;    
    
    EmployeeDetailsSqlDataSource.SelectParameters["EmpID"].DefaultValue = 
      command.Parameters["@EmpID"].Value.ToString();

    EmployeesGridView.DataBind();
    EmployeeFormView.DataBind();
  }

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>FormView Example</title>
</head>
<body>
    <form id="form1" runat="server">
        
      <h3>FormView Example</h3>

        <table cellspacing="10">
            
          <tr>
            <td>
              <asp:GridView ID="EmployeesGridView" 
                DataSourceID="EmployeesSqlDataSource" 
                AutoGenerateColumns="false"
                DataKeyNames="EmployeeID" 
                OnSelectedIndexChanged="EmployeesGridView_OnSelectedIndexChanged"
                RunAt="Server">
                
                <HeaderStyle backcolor="Navy"
                  forecolor="White" />
                
                <Columns>
                
                  <asp:ButtonField Text="Details..."
                    HeaderText="Show<BR>Details"
                    CommandName="Select"/>  
                
                  <asp:BoundField DataField="EmployeeID" HeaderText="Employee ID"/>
                  <asp:BoundField DataField="LastName"   HeaderText="Last Name"/>                        
                  <asp:BoundField DataField="FirstName"  HeaderText="First Name"/>
                    
                </Columns>
                
              </asp:GridView>
            
            </td>
                
            <td valign="top">
                
              <asp:FormView ID="EmployeeFormView"
                DataSourceID="EmployeeDetailsSqlDataSource"
                DataKeyNames="EmployeeID"     
                Gridlines="Both" 
                OnItemUpdated="EmployeeFormView_ItemUpdated"
                OnItemDeleted="EmployeeFormView_ItemDeleted"      
                RunAt="server">
                
                <HeaderStyle backcolor="Navy"
                  forecolor="White"/>
                  
                <RowStyle backcolor="White"/>         
                
                <EditRowStyle backcolor="LightCyan"/>
                                    
                <ItemTemplate>
                  <table>
                    <tr><td align="right"><b>Employee ID:</b></td><td><%# Eval("EmployeeID") %></td></tr>
                    <tr><td align="right"><b>First Name:</b></td> <td><%# Eval("FirstName") %></td></tr>
                    <tr><td align="right"><b>Last Name:</b></td>  <td><%# Eval("LastName") %></td></tr>
                    <tr>
                      <td colspan="2">
                        <asp:LinkButton ID="EditButton"
                                        Text="Edit"
                                        CommandName="Edit"
                                        RunAt="server"/>
                        &nbsp;
                        <asp:LinkButton ID="NewButton"
                                        Text="New"
                                        CommandName="New"
                                        RunAt="server"/>
                        &nbsp;
                        <asp:LinkButton ID="DeleteButton"
                                        Text="Delete"
                                        CommandName="Delete"
                                        RunAt="server"/>
                      </td>
                    </tr>
                  </table>                 
                </ItemTemplate>

                <EditItemTemplate>
                  <table>
                    <tr><td align="right"><b>Employee ID:</b></td><td><%# Eval("EmployeeID") %></td></tr>

                    <tr><td align="right"><b>First Name:</b></td>
                        <td><asp:TextBox ID="EditFirstNameTextBox" 
                                         Text='<%# Bind("FirstName") %>' 
                                         RunAt="Server" /></td></tr>

                    <tr><td align="right"><b>Last Name:</b></td>
                        <td><asp:TextBox ID="EditLastNameTextBox" 
                                         Text='<%# Bind("LastName") %>' 
                                         RunAt="Server" /></td></tr>
                    <tr>
                      <td colspan="2">
                        <asp:LinkButton ID="UpdateButton"
                                        Text="Update"
                                        CommandName="Update"
                                        RunAt="server"/>
                        &nbsp;
                        <asp:LinkButton ID="CancelUpdateButton"
                                        Text="Cancel"
                                        CommandName="Cancel"
                                        RunAt="server"/>
                      </td>
                    </tr>
                  </table>                 
                </EditItemTemplate>

                <InsertItemTemplate>
                  <table>
                    <tr><td align="right"><b>First Name:</b></td>
                        <td><asp:TextBox ID="InsertFirstNameTextBox" 
                                         Text='<%# Bind("FirstName") %>' 
                                         RunAt="Server" /></td></tr>

                    <tr><td align="right"><b>Last Name:</b></td>
                        <td><asp:TextBox ID="InsertLastNameTextBox" 
                                         Text='<%# Bind("LastName") %>' 
                                         RunAt="Server" /></td></tr>

                    <tr>
                      <td colspan="2">
                        <asp:LinkButton ID="InsertButton"
                                        Text="Insert"
                                        CommandName="Insert"
                                        RunAt="server"/>
                        &nbsp;
                        <asp:LinkButton ID="CancelInsertButton"
                                        Text="Cancel"
                                        CommandName="Cancel"
                                        RunAt="server"/>
                      </td>
                    </tr>
                  </table>                 
                </InsertItemTemplate>
                    
              </asp:FormView>

            </td>
                
          </tr>
            
        </table>
            
        <asp:sqlDataSource ID="EmployeesSqlDataSource"  
          selectCommand="SELECT EmployeeID, FirstName, LastName FROM Employees" 
          connectionstring="<%$ ConnectionStrings:NorthwindConnection %>" 
          RunAt="server">
        </asp:sqlDataSource>
 
        <asp:sqlDataSource ID="EmployeeDetailsSqlDataSource" 
          SelectCommand="SELECT EmployeeID, LastName, FirstName FROM Employees WHERE EmployeeID = @EmpID"

          InsertCommand="INSERT INTO Employees(LastName, FirstName) VALUES (@LastName, @FirstName); 
                         SELECT @EmpID = SCOPE_IDENTITY()"
          UpdateCommand="UPDATE Employees SET LastName=@LastName, FirstName=@FirstName 
                           WHERE EmployeeID=@EmployeeID"
          DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"

          ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
          OnInserted="EmployeeDetailsSqlDataSource_OnInserted"
          RunAt="server">
          
          <SelectParameters>
            <asp:Parameter Name="EmpID" Type="Int32" DefaultValue="0" />
          </SelectParameters>
          
          <InsertParameters>
            <asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" />
          </InsertParameters>

        </asp:sqlDataSource>
  
      </form>
  </body>
</html>


Il comando può essere il nome di una stored procedure, se queste sono supportate dal database in uso. Se si utilizzano le stored procedure per aggiornare i dati, è necessario impostare la proprietà UpdateCommandType su StoredProcedure.

Parametri

I parametri consentono di inviare all'origine dati i valori per le operazioni di inserimento, aggiornamento ed eliminazione. I nomi e i valori dei parametri sono basati sui campi dati associati a un controllo, oppure su oggetti parametro definiti in modo esplicito. I parametri di un controllo associato a dati comprendono sia i valori per l'operazione sui dati sia i valori chiave per identificare una riga specifica, come definito dalla proprietà DataKeyNames del controllo associato.

È possibile creare definizioni Parameter esplicite per stabilire il tipo, l'ordine e la direzione dei parametri oppure creare parametri aggiuntivi diversi da quelli che si basano sui campi associati a un controllo. Un esempio di questa situazione è un parametro di output che restituisce un valore generato automaticamente dall'origine dati come, ad esempio, una chiave primaria con incremento automatico o un indicatore di data e ora.

NoteNota

È particolarmente importante specificare i parametri in modo esplicito quando si utilizzano i provider System.Data.OleDb e System.Data.Odbc, poiché questi non supportano i parametri denominati nelle istruzioni SQL ma specificano un parametro utilizzando il segnaposto "?". In questi casi, è necessario definire i parametri nell'ordine specificato nell'istruzione SQL associata.

Per ulteriori informazioni ed esempi sulle modalità di utilizzo dei parametri, vedere Utilizzo dei parametri con il controllo SqlDataSource e Come un controllo origine dati crea parametri per campi associati a dati.

Eventi

Il controllo SqlDataSource genera eventi che possono essere gestiti per eseguire il codice prima e dopo che il controllo esegua un'operazione di inserimento, aggiornamento o eliminazione.

Il controllo SqlDataSource genera gli eventi Inserting, Updating o Deleting prima di eseguire l'istruzione SQL per la proprietà comando corrispondente. È possibile aggiungere un gestore per questi eventi in grado di modificare, ordinare o convalidare i parametri per un'istruzione prima che questa venga eseguita, oppure per annullare il comando. Ad esempio, se si utilizza QueryStringParameter con il controllo SqlDataSource, è possibile gestire l'evento Updating per convalidare il valore del parametro prima di eseguire un aggiornamento. Per impostazione predefinita, QueryStringParameter recupera il valore di una variabile di stringa di query e lo invia al database senza convalida. Se il valore non è accettabile, è possibile annullare l'aggiornamento impostando la proprietà Cancel dell'oggetto SqlDataSourceCommandEventArgs dell'evento su true.

Il controllo SqlDataSource genera gli eventi Inserted, Updated o Deleted al termine dell'operazione di database. È possibile gestire questi eventi per determinare se è stata generata un'eccezione durante l'operazione di database, per sapere quanti record sono stati interessati dall'operazione o per esaminare i valori di output restituiti dall'operazione di database.

Nell'esempio di codice riportato di seguito vengono utilizzati ad esempio gli eventi Updating e Updated per eseguire UpdateCommand nell'ambito di una transazione.

<%@Page  Language="C#" %>
<%@Import Namespace="System.Data" %>
<%@Import Namespace="System.Data.Common" %>
<%@Import Namespace="System.Data.SqlClient" %>
<%@Import Namespace="System.Diagnostics" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

 private void On_Click(Object source, EventArgs e) {    
    SqlDataSource1.Update();
 }

 private void OnSqlUpdating(Object source, SqlDataSourceCommandEventArgs e) {
    DbCommand command = e.Command;
    DbConnection cx  = command.Connection;    
    cx.Open();    
    DbTransaction tx = cx.BeginTransaction();
    command.Transaction = tx;
 }

 private void OnSqlUpdated(Object source, SqlDataSourceStatusEventArgs e) {
    DbCommand command = e.Command;
    DbTransaction tx = command.Transaction;
    
    // In this code example the OtherProcessSucceeded variable represents
    // the outcome of some other process that occurs whenever the data is 
    // updated, and must succeed for the data change to be committed. For 
    // simplicity, we set this value to true. 
    bool OtherProcessSucceeded = true;
    
    if (OtherProcessSucceeded) {
        tx.Commit();
        Label2.Text="The record was updated successfully!";
    }
    else {
        tx.Rollback();
        Label2.Text="The record was not updated.";
    }
 }

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">
      <asp:SqlDataSource
          id="SqlDataSource1"
          runat="server"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT EmployeeID, LastName, Address FROM Employees"
          UpdateCommand="UPDATE Employees SET Address=@Address WHERE EmployeeID=@EmployeeID"
          OnUpdating="OnSqlUpdating"
          OnUpdated ="OnSqlUpdated">
          <UpdateParameters>
              <asp:ControlParameter Name="Address" ControlId="TextBox1" PropertyName="Text"/>
              <asp:ControlParameter Name="EmployeeID" ControlId="DropDownList1" PropertyName="SelectedValue"/>
          </UpdateParameters>
      </asp:SqlDataSource>

      <asp:DropDownList
          id="DropDownList1"
          runat="server"
          DataTextField="LastName"
          DataValueField="EmployeeID"
          DataSourceID="SqlDataSource1">
      </asp:DropDownList>

      <br />
      <asp:Label id="Label1" runat="server" Text="Enter a new address for the selected user."
        AssociatedControlID="TextBox1" />
      <asp:TextBox id="TextBox1" runat="server" />
      <asp:Button id="Submit" runat="server" Text="Submit" OnClick="On_Click" />

      <br /><asp:Label id="Label2" runat="server" Text="" />

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

<%@Page  Language="VJ#" %>
<%@Import Namespace="System.Data" %>
<%@Import Namespace="System.Data.Common" %>
<%@Import Namespace="System.Diagnostics" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

     private void On_Click(Object source, System.EventArgs e)
    {
        try {
            SqlDataSource1.Update();
        }
        catch (System.Exception except) {
            // Handle Exception
        }
    
        Label2.set_Text("The record was updated successfully!");
    } //On_Click

    private void OnSqlUpdate(Object source, SqlDataSourceCommandEventArgs e)
    {
        // Log the command in the Event Log on the Web server.
        String logInfo = e.get_Command().get_CommandText() 
            + " is being submitted to the database.";
        
        IEnumerator ie = e.get_Command().get_Parameters().GetEnumerator();
        while (ie.MoveNext()) {
            DbParameter param = ((DbParameter)(ie.get_Current()));
            logInfo = logInfo + " " + param.get_ParameterName()+ "=" 
            + param.get_Value();
        }

        EventLog log = new EventLog();
        log.set_Log("Application");
        log.set_Source("ASP.NET Example");
        log.WriteEntry(logInfo);
    } //OnSqlUpdate    

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">
      <asp:SqlDataSource
          id="SqlDataSource1"
          runat="server"
          ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
          SelectCommand="SELECT EmployeeID, LastName, Address FROM Employees"
          UpdateCommand="UPDATE Employees SET Address=@Address WHERE EmployeeID=@EmployeeID"
          OnUpdating="OnSqlUpdate">
          <UpdateParameters>
              <asp:ControlParameter Name="Address" ControlId="TextBox1" PropertyName="Text"/>
              <asp:ControlParameter Name="EmployeeID" ControlId="DropDownList1" PropertyName="SelectedValue"/>
          </UpdateParameters>
      </asp:SqlDataSource>

      <asp:DropDownList
          id="DropDownList1"
          runat="server"
          DataTextField="LastName"
          DataValueField="EmployeeID"
          DataSourceID="SqlDataSource1">
      </asp:DropDownList>

      <br />
      <asp:Label id="Label1" runat="server" Text="Enter a new address for the selected user."
        AssociatedControlID="TextBox1" />
      <asp:TextBox id="TextBox1" runat="server" />
      <asp:Button id="Submit" runat="server" Text="Submit" OnClick="On_Click" />

      <br /><asp:Label id="Label2" runat="server" Text="" />

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

Rilevazione di conflitti

Il controllo SqlDataSource consente di eseguire operazioni di aggiornamento o eliminazione tramite l'utilizzo della concorrenza ottimistica. La concorrenza ottimistica è una strategia di database che impedisce la perdita delle modifiche in un'origine dati in scenari in cui più utenti elaborano i dati contemporaneamente. Il controllo SqlDataSource utilizza la proprietà ConflictDetection per determinare quale livello di controllo della concorrenza ottimistica applicare alle operazioni di aggiornamento ed eliminazione.

Per impostazione predefinita, la proprietà ConflictDetection è impostata su System.Web.UI.ConflictOptions.OverwriteChanges, il che significa che gli aggiornamenti sovrascrivono qualsiasi valore esistente nel record senza determinare se questo è stato modificato da un'altra origine. Questo scenario è talvolta denominato "last writer wins" (il valore salvato per ultimo sovrascrive i precedenti).

È possibile impostare la proprietà ConflictDetection su System.Web.UI.ConflictOptions.CompareAllValues per garantire che il controllo SqlDataSource includa tutti i valori originali durante il comando di aggiornamento o eliminazione. In questo modo, è possibile scrivere un'istruzione SQL in modo da non effettuare l'aggiornamento nel caso in cui i dati presenti nel database non corrispondano ai dati letti inizialmente dal database. Per un esempio, vedere Utilizzo della concorrenza ottimistica. È possibile gestire l'evento Updated per verificare quanti record sono interessati da un aggiornamento. Se nessun record viene aggiornato, si è verificata una violazione di concorrenza.

Vedere anche

Il documento è risultato utile?
(1500 caratteri rimanenti)
Grazie per i commenti inviati.

Aggiunte alla community

AGGIUNGI
Microsoft sta conducendo un sondaggio in linea per comprendere l'opinione degli utenti in merito al sito Web di MSDN. Se si sceglie di partecipare, quando si lascia il sito Web di MSDN verrà visualizzato il sondaggio in linea.

Si desidera partecipare?
Mostra:
© 2014 Microsoft. Tutti i diritti riservati.