Implementar DataAdapter
Si va a implementar todo el conjunto de interfaces del proveedor de datos de .NET Framework, la implementación de DataAdapter requiere una programación mínima, ya que la clase System.Data.Common.DbDataAdapter proporciona la mayor parte de la implementación.
Para utilizar DbDataAdapter
Proporcione implementaciones de IDbConnection, IDbCommand, IDataReader, etc. La clase DbDataAdapter aprovecha estos componentes en su implementación.
Cree una clase que se herede de DbDataAdapter e IDbDataAdapter. Por ejemplo:
Public Class TemplateDataAdapter Inherits DbDataAdapter Implements IDbDataAdapter End Class [C#] public class TemplateDataAdapter : DbDataAdapter, IDbDataAdapter { }
Implemente la interfaz IDbDataAdapter, y proporcione implementaciones de propiedades y métodos que suministren un "establecimiento inflexible de tipos ". Esto permite a los usuarios de su proveedor de datos de .NET Framework hacer referencia directamente a los objetos que usted proporciona, en lugar de hacerlo mediante interfaces como IDbCommand.
En el siguiente ejemplo se muestra una propiedad SelectCommand que devuelve un TemplateCommand con establecimiento inflexible de tipos. La propiedad TemplateDataAdapter.SelectCommand devolverá un objeto IDbCommand cuando TemplateDataAdapter se convierta en IDbDataAdapter.
Private m_selectCommand As TemplateCommand Property IDbDataAdapterSelectCommand As IDbCommand Implements IDbDataAdapter.SelectCommand Get Return m_selectCommand End Get Set m_selectCommand = CType(value, TemplateCommand) End Set End Property Public Property SelectCommand As TemplateCommand Get Return m_selectCommand End Get Set m_selectCommand = value End Set End Property [C#] private TemplateCommand m_selectCommand; public TemplateCommand SelectCommand { get { return m_selectCommand; } set { m_selectCommand = value; } } IDbCommand IDbDataAdapter.SelectCommand { get { return m_selectCommand; } set { m_selectCommand = (TemplateCommand)value; } }
Implemente versiones específicas del proveedor de RowUpdatedEventArgs y RowUpdatingEventArgs, así como los tipos de controlador de eventos asociados (esto es código estándar). También existen tipos de eventos sobrecargados para proporcionar establecimiento inflexible de tipos, lo que permite exponer con establecimiento inflexible de tipos tanto el objeto de evento propiamente dicho como las propiedades adecuadas (como la propiedad Command). Por ejemplo:
Public Class TemplateRowUpdatingEventArgs Inherits RowUpdatingEventArgs Public Sub New(row As DataRow, command As IDbCommand, statementType As StatementType, tableMapping As DataTableMapping) MyBase.New(row, command, statementType, tableMapping) End Sub ' Hide the inherited implementation of the command property. Public Shadows Property Command As TemplateCommand Get Return CType(MyBase.Command, TemplateCommand) End Get Set MyBase.Command = value End Set End Property End Class Public Class TemplateRowUpdatedEventArgs Inherits RowUpdatedEventArgs Public Sub New(row As DataRow, command As IDbCommand, statementType As StatementType, tableMapping As DataTableMapping) MyBase.New(row, command, statementType, tableMapping) End Sub ' Hide the inherited implementation of the command property. Public Shadows ReadOnly Property Command As TemplateCommand Get Return CType(MyBase.Command, TemplateCommand) End Get End Property End Class [C#] public class TemplateRowUpdatingEventArgs : RowUpdatingEventArgs { public TemplateRowUpdatingEventArgs(DataRow row, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) : base(row, command, statementType, tableMapping) { } // Hide the inherited implementation of the command property. new public TemplateCommand Command { get { return (TemplateCommand)base.Command; } set { base.Command = value; } } } public class TemplateRowUpdatedEventArgs : RowUpdatedEventArgs { public TemplateRowUpdatedEventArgs(DataRow row, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) : base(row, command, statementType, tableMapping) { } // Hide the inherited implementation of the command property. new public TemplateCommand Command { get { return (TemplateCommand)base.Command; } } }
Implemente los métodos abstractos de DbDataAdapter. Por ejemplo:
Protected Overrides Function CreateRowUpdatedEvent(dataRow As DataRow, command As IDbCommand, statementType As StatementType, tableMapping As DataTableMapping) As RowUpdatedEventArgs Return New TemplateRowUpdatedEventArgs(dataRow, command, statementType, tableMapping) End Function Protected Overrides Function CreateRowUpdatingEvent(dataRow As DataRow, command As IDbCommand, statementType As StatementType, tableMapping As DataTableMapping) As RowUpdatingEventArgs Return New TemplateRowUpdatingEventArgs(dataRow, command, statementType, tableMapping) End Function Protected Overrides Sub OnRowUpdating(value As RowUpdatingEventArgs) Dim handler As TemplateRowUpdatingEventHandler = CType(Events(EventRowUpdating), TemplateRowUpdatingEventHandler) If Not handler Is Nothing And value.GetType() Is Type.GetType("TemplateRowUpdatingEventArgs") Then handler(Me, CType(value, TemplateRowUpdatingEventArgs)) End If End Sub Protected Overrides Sub OnRowUpdated(value As RowUpdatedEventArgs) Dim handler As TemplateRowUpdatedEventHandler = CType(Events(EventRowUpdated), TemplateRowUpdatedEventHandler) If Not handler Is Nothing And value.GetType() Is Type.GetType("TemplateRowUpdatedEventArgs") Then handler(Me, CType(value, TemplateRowUpdatedEventArgs)) End If End Sub [C#] override protected RowUpdatedEventArgs CreateRowUpdatedEvent(DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) { return new TemplateRowUpdatedEventArgs(dataRow, command, statementType, tableMapping); } override protected RowUpdatingEventArgs CreateRowUpdatingEvent(DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) { return new TemplateRowUpdatingEventArgs(dataRow, command, statementType, tableMapping); } override protected void OnRowUpdating(RowUpdatingEventArgs value) { TemplateRowUpdatingEventHandler handler = (TemplateRowUpdatingEventHandler) Events[EventRowUpdating]; if ((null != handler) && (value is TemplateRowUpdatingEventArgs)) { handler(this, (TemplateRowUpdatingEventArgs) value); } } override protected void OnRowUpdated(RowUpdatedEventArgs value) { TemplateRowUpdatedEventHandler handler = (TemplateRowUpdatedEventHandler) Events[EventRowUpdated]; if ((null != handler) && (value is TemplateRowUpdatedEventArgs)) { handler(this, (TemplateRowUpdatedEventArgs) value); } }
Termine de implementar eventos en la clase derivada DbDataAdapter como en el siguiente ejemplo. Tenga en cuenta que los eventos forman parte de la clase TemplateDataAdapter y que los delegados forman parte del espacio de nombres.
Public Event RowUpdating As TemplateRowUpdatingEventHandler Public Event RowUpdated As TemplateRowUpdatedEventHandler Public Delegate Sub TemplateRowUpdatingEventHandler(sender As Object, e As TemplateRowUpdatingEventArgs) Public Delegate Sub TemplateRowUpdatedEventHandler(sender As Object, e As TemplateRowUpdatedEventArgs) [C#] public event TemplateRowUpdatingEventHandler RowUpdating { add { Events.AddHandler(EventRowUpdating, value); } remove { Events.RemoveHandler(EventRowUpdating, value); } } public event TemplateRowUpdatedEventHandler RowUpdated { add { Events.AddHandler(EventRowUpdated, value); } remove { Events.RemoveHandler(EventRowUpdated, value); } } public delegate void TemplateRowUpdatingEventHandler(object sender, TemplateRowUpdatingEventArgs e); public delegate void TemplateRowUpdatedEventHandler(object sender, TemplateRowUpdatedEventArgs e);
Los temas siguientes contienen código de ejemplo para una implementación de un objeto DataAdapter.
Para una implementación de Visual Basic de ejemplo:
Para una implementación de C# de ejemplo:
Vea también
Implementar un proveedor de datos de .NET Framework | Ejemplo de proveedores de datos de .NET Framework