Creazione di un oggetto di origine del controllo ObjectDataSource

Aggiornamento: novembre 2007

L'oggetto di origine per un controllo ObjectDataSource recupera i dati ed esegue gli aggiornamenti nell'origine dati sottostante come richiesto dal controllo ObjectDataSource. L'oggetto di origine per un controllo ObjectDataSource può essere costituito da qualsiasi classe di cui il controllo ObjectDataSource può creare un'istanza o che espone metodi static (Shared in Microsoft Visual Basic) pubblici che il controllo ObjectDataSource può chiamare.

Per un esempio di un oggetto di origine e della pagina ASP.NET che include un controllo ObjectDataSource che utilizza tale oggetto, vedere Esempio di oggetto di origine ObjectDataSource o Esempio di oggetto di origine fortemente tipizzato ObjectDataSource.

Creazione di oggetti

Il controllo ObjectDataSource creerà un'istanza dell'oggetto di origine, chiamerà il metodo specificato ed eliminerà l'istanza dell'oggetto nell'ambito di una singola richiesta, se l'oggetto dispone di metodi di istanza anziché di metodi static (Shared in Visual Basic). È pertanto necessario che l'oggetto sia senza stato. e cioè deve acquisire e rilasciare tutte le risorse richieste all'interno di una singola richiesta.

È possibile controllare la modalità di creazione dell'oggetto di origine gestendo l'evento ObjectCreating del controllo ObjectDataSource. È inoltre possibile creare un'istanza dell'oggetto di origine e quindi impostare la proprietà ObjectInstance della classe ObjectDataSourceEventArgs su tale istanza. Il controllo ObjectDataSource utilizzerà l'istanza creata nell'evento ObjectCreating invece di creare un'istanza propria.

Specifica di un costruttore di classi

Se l'oggetto di origine per un controllo ObjectDataSource espone metodi static (Shared in Visual Basic) pubblici che possono essere chiamati per recuperare e modificare dati, un controllo ObjectDataSource chiamerà tali metodi direttamente. Se un controllo ObjectDataSource deve creare un'istanza dell'oggetto di origine per effettuare chiamate di metodi, l'oggetto deve includere un costruttore pubblico privo di parametri. Il controllo ObjectDataSource chiamerà questo costruttore durante la creazione di una nuova istanza dell'oggetto di origine.

Se l'oggetto di origine non contiene un costruttore pubblico privo di parametri, è possibile creare un'istanza dell'oggetto di origine che verrà utilizzata dal controllo ObjectDataSource nell'evento ObjectCreating, come descritto nella sezione "Creazione di oggetti" più indietro in questo argomento.

Specifica di metodi con oggetti

L'oggetto di origine per un controllo ObjectDataSource può contenere qualsiasi numero di metodi che vengono utilizzati per selezionare, inserire, aggiornare o eliminare dati. Questi metodi vengono chiamati dal controllo ObjectDataSource in base al nome del metodo, come identificato dalla proprietà SelectMethod, InsertMethod, UpdateMethod o DeleteMethod del controllo ObjectDataSource e ai nomi dei parametri presenti nel relativo insieme di parametri per l'azione selezionata. Per informazioni dettagliate, vedere Utilizzo dei parametri con il controllo ObjectDataSource.

L'oggetto di origine può anche includere un metodo SelectCount facoltativo, identificato dal controllo ObjectDataSource che utilizza la proprietà SelectCountMethod. Tale metodo restituisce il numero totale di oggetti nell'origine dati. Il controllo ObjectDataSource chiamerà il metodo SelectCount in seguito alla chiamata di un metodo Select per il recupero del numero totale di record nell'origine dati da utilizzare durante il paging.

Nota:

È consigliabile implementare un metodo SelectCount se l'oggetto supporta il paging. In questo modo, verrà ridotto il numero di record che un controllo con associazione a dati, ad esempio il controllo GridView, deve richiedere per recuperare una pagina di dati. Se il conteggio totale delle righe è fornito dall'oggetto dei dati di origine, un controllo con associazione a dati richiederà una sola pagina di righe alla volta per ogni pagina. Se il conteggio totale delle righe non è fornito, un controllo con associazione a dati deve richiedere tutte le righe dall'origine dati (a partire dalla prima riga della pagina di dati richiesta) e ignorare tutte le righe che non si trovano nella pagina corrente.

Utilizzo degli oggetti fortemente tipizzati

L'oggetto di origine può restituire e ricevere oggetti fortemente tipizzati in base ai dati dell'origine dati. Il controllo ObjectDataSource identifica il tipo degli oggetti utilizzando la proprietà DataObjectTypeName. In questo scenario, invece di passare uno o più parametri a un metodo, viene passato un oggetto che aggrega tutti i valori di parametri. Per ulteriori informazioni sul passaggio di un tipo di oggetto specifico come parametro per un metodo con oggetto di origine, vedere Utilizzo dei parametri con il controllo ObjectDataSource.

Quando la proprietà ConflictDetection di un controllo ObjectDataSource è impostata sul valore CompareAllValues e la proprietà OldValuesParameterFormatString è impostata su un valore che distingue i parametri dei valori originali dai parametri dei valori correnti, il controllo ObjectDataSource effettuerà le seguenti operazioni:

  • Chiamerà il metodo Update dall'oggetto di origine che accetta parametri sia per i valori correnti che per quelli originali.

  • Chiamerà il metodo Delete dall'oggetto di origine che accetta parametri per i valori originali.

Quando utilizza un oggetto fortemente tipizzato, il controllo ObjectDataSource chiamerà il metodo Update dall'oggetto di origine che accetta sia un oggetto fortemente tipizzato popolato con i valori correnti che un oggetto fortemente tipizzato popolato con i valori originali. Tuttavia, quando il controllo ObjectDataSource chiama il metodo Delete e passa un oggetto fortemente tipizzato, effettua la chiamata del metodo che accetta un singolo oggetto fortemente tipizzato come parametro, a prescindere dall'impostazione di ConflictDetection o di OldValuesParameterFormatString. Se la proprietà ConflictDetection è impostata sul valore OverwriteChanges, l'oggetto che viene passato al metodo Delete viene popolato solo con i valori correnti della chiave primaria, mentre le altre proprietà dell'oggetto sono null. Se la proprietà ConflictDetection è impostata sul valore CompareAllValues, l'oggetto che viene passato al metodo Delete viene popolato con i valori originali della chiave primaria e con i valori originali per le restanti proprietà dell'oggetto.

Utilizzo delle finestre di progettazione

Facoltativamente, all'oggetto di origine è possibile applicare attributi che lo descrivono come un oggetto dati in una finestra di progettazione, quale lo strumento di sviluppo Web Microsoft Visual Web Developer, migliorando in questo modo il lavoro degli sviluppatori che utilizzano la finestra di progettazione grazie all'identificazione dei metodi dell'oggetto utilizzati per le operazioni di selezione, inserimento, aggiornamento ed eliminazione.

Per specificare l'oggetto come oggetto di origine per un controllo ObjectDataSource, utilizzare l'attributo DataObjectAttribute come illustrato nell'esempio riportato di seguito.

<DataObject(True)> _
Public Class NorthwindEmployee 
[DataObject(true)]
public class NorthwindEmployee

Per identificare un metodo come un metodo con oggetto dati, utilizzare l'attributo DataObjectMethodAttribute. Quando si applica l'attributo DataObjectMethodAttribute, includere uno dei valori di enumerazione DataObjectMethodType per identificare il tipo di metodo (select, insert, update o delete). Nell'esempio di codice riportato di seguito viene utilizzato l'attributo DataObjectMethodAttribute per identificare un metodo come Delete.

<DataObjectMethod(DataObjectMethodType.Delete)> _
Public Shared Function DeleteEmployee(EmployeeID As Integer) As Boolean

  If Not _initialized Then Initialize()

  Dim conn As SqlConnection  = New SqlConnection(_connectionString)
  Dim cmd  As SqlCommand     = New SqlCommand("DELETE FROM Employees WHERE EmployeeID = @EmployeeID", conn)  
  cmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = EmployeeID

  Try
    conn.Open()

    If cmd.ExecuteNonQuery() <> 0 Then _
      Return False
  Catch e As SqlException
    ' Handle exception.
  Finally
    conn.Close()
  End Try

  Return True
End Function
[DataObjectMethod(DataObjectMethodType.Delete)]
public static bool DeleteEmployee(int EmployeeID)
{
  if (!_initialized) { Initialize(); }

  SqlConnection conn = new SqlConnection(_connectionString);
  SqlCommand    cmd  = new SqlCommand("DELETE FROM Employees WHERE EmployeeID = @EmployeeID", conn);  
  cmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = EmployeeID;

  try
  {
    conn.Open();

    if (cmd.ExecuteNonQuery() == 0)
      return false;
  }
  catch (SqlException e)
  {
    // Handle exception.
  }
  finally
  {
    conn.Close();
  }

  return true;
}

Vedere anche

Concetti

Esempio di oggetto di origine ObjectDataSource

Utilizzo dei parametri con il controllo ObjectDataSource

Riferimenti

Cenni preliminari sul controllo server Web ObjectDataSource