Crear un objeto de origen para un control ObjectDataSource

Actualización: noviembre 2007

El objeto de origen para un control ObjectDataSource recupera datos y realiza actualizaciones en el origen de datos subyacente según solicita el control ObjectDataSource. El objeto de origen para un control ObjectDataSource puede ser cualquier clase de la que el control ObjectDataSource pueda crear una instancia o que exponga métodos static públicos (Shared en Visual Basic) a los que el control ObjectDataSource pueda llamar.

Para ver un ejemplo de un objeto de origen y la página ASP.NET que incluye un control ObjectDataSource que utiliza el objeto de origen, vea Ejemplo de objeto de origen ObjectDataSource o Ejemplo de objeto de origen ObjectDataSource con establecimiento inflexible de tipos.

Crear objetos

El control ObjectDataSource crea una instancia del objeto de origen, llama al método especificado y desecha la instancia del objeto, todo ello dentro del ámbito de una única solicitud si el objeto tiene métodos de instancia en lugar de métodos static (Shared en Visual Basic). Por consiguiente, su objeto no debe tener un estado. Es decir, su objeto debe adquirir y liberar todos los recursos necesarios dentro de una única solicitud.

Puede controlar la creación del objeto de origen controlando el evento ObjectCreating del control ObjectDataSource. Puede crear una instancia del objeto de origen y establecer la propiedad ObjectInstance de la clase ObjectDataSourceEventArgs en esa instancia. El control ObjectDataSource utiliza la instancia que se creó en el evento ObjectCreating en lugar de crear su propia instancia.

Especificar un constructor de clase

Si el objeto de origen para un control ObjectDataSource expone métodos static públicos (Shared en Visual Basic) a los que se puede llamar para recuperar y modificar datos, un control ObjectDataSource llamará a esos métodos directamente. Si un control ObjectDataSource debe crear una instancia del objeto de origen para poder realizar llamadas a métodos, el objeto debe incluir un constructor público sin parámetros. El control ObjectDataSource llama a este constructor al crear una nueva instancia del objeto de origen.

Si el objeto de origen no contiene un constructor público sin parámetros, puede crear una instancia del objeto de origen que utilizará el control ObjectDataSource en el evento ObjectCreating, como se trató en "Crear objetos" con anterioridad en este tema.

Especificar métodos de objetos

El objeto de origen para un control ObjectDataSource puede contener cualquier número de métodos que se utilizan para seleccionar, insertar, actualizar o eliminar datos. El control ObjectDataSource llama a estos métodos, basándose en el nombre del método, según se identifica mediante la propiedad SelectMethod, InsertMethod, UpdateMethod o DeleteMethod del control ObjectDataSource y los nombres de los parámetros incluidos en la colección de parámetros relacionada para la acción seleccionada. Para obtener información detallada, vea Utilizar parámetros con el control ObjectDataSource.

El objeto de origen puede incluir también un método SelectCount opcional que identifica el control ObjectDataSource mediante la propiedad SelectCountMethod que devuelve el número total de objetos del origen de datos. El control ObjectDataSource llama al método SelectCount después de haberse llamado a un método Select para recuperar el número total de registros del origen de datos que se utilizan al paginar.

Trabajar con objetos con establecimiento inflexible de tipos

El objeto de origen puede devolver y recibir objetos con establecimiento inflexible de tipos basándose en los datos del origen de datos. El control ObjectDataSource identifica el tipo de estos objetos mediante la propiedad DataObjectTypeName. En este caso, en lugar de pasar uno o más parámetros a un método, se pasa un objeto que agrega todos los valores de parámetros. Para obtener más información acerca de cómo pasar un tipo de objeto concreto como un parámetro para un método de un objeto de origen, vea Utilizar parámetros con el control ObjectDataSource.

Cuando la propiedad ConflictDetection de un control ObjectDataSource se establece con el valor CompareAllValues y la propiedad OldValuesParameterFormatString se establece con un valor que distingue entre los parámetros para los valores originales y los parámetros para los valores actuales, ObjectDataSource realizará lo siguiente:

  • Llame al método Update desde el objeto de origen que toma los parámetros para los valores actuales y originales.

  • Llame al método Delete desde el objeto de origen que toma los parámetros para los valores originales.

Cuando se utiliza un objeto con establecimiento inflexible de tipos, el control ObjectDataSource llama al método Update desde el objeto de origen que toma un objeto con establecimiento inflexible de tipos que se llena con valores actuales y un objeto con establecimiento inflexible de tipos que se llena con valores originales. Sin embargo, cuando el control ObjectDataSource llama al método Delete y pasa un objeto con establecimiento inflexible de tipos, llama al método que toma un único objeto con establecimiento inflexible de tipos como parámetro, independientemente del valor de ConflictDetection o de OldValuesParameterFormatString. Si la propiedad ConflictDetection se establece en el valor OverwriteChanges, el objeto que se pasa al método Delete sólo se llena con los valores de las claves principales actuales (las demás propiedades del objeto son null). Si la propiedad ConflictDetection se establece en el valor CompareAllValues, el objeto que se pasa al método Delete se llena con los valores de las claves principales originales y con valores originales, para las demás propiedades del objeto.

Trabajar con diseñadores

Opcionalmente, puede aplicar al objeto de origen atributos que lo describan ante un diseñador, como la herramienta de desarrollo Web Microsoft Visual Web Developer, como un objeto de datos. Esto puede mejorar la experiencia del desarrollador que utilice el diseñador al poder identificar específicamente los métodos de su objeto que se utilizan para las operaciones de selección, inserción, actualización y eliminación.

Para identificar su objeto como un objeto de origen para un control ObjectDataSource, utilice el atributo DataObjectAttribute como se muestra en el ejemplo siguiente.

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

Para identificar un método como un método de objeto de datos, utilice el atributo DataObjectMethodAttribute. Cuando aplique el atributo DataObjectMethodAttribute, incluya uno de los valores de la enumeración DataObjectMethodType para identificar el tipo de método (seleccionar, insertar, actualizar o eliminar). En el ejemplo de código siguiente se utiliza el atributo DataObjectMethodAttribute para identificar un método como un método 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;
}

Vea también

Conceptos

Ejemplo de objeto de origen ObjectDataSource

Utilizar parámetros con el control ObjectDataSource

Otros recursos

ObjectDataSource (Control de servidor Web)