DataAdapter の実装
一連の .NET Framework データ プロバイダ インターフェイスを実装する場合は、System.Data.Common.DbDataAdapter クラスによって実装の大部分が処理されるため、DataAdapter では最小限のコーディングだけが必要となります。
DbDataAdapter を使用するには
IDbConnection、IDbCommand、IDataReader などを実装します。DbDataAdapter 実装では、DbDataAdapter クラスによってこれらのコンポーネントが利用されます。
DbDataAdapter と IDbDataAdapter から継承するクラスを作成します。次に例を示します。
Public Class TemplateDataAdapter Inherits DbDataAdapter Implements IDbDataAdapter End Class [C#] public class TemplateDataAdapter : DbDataAdapter, IDbDataAdapter { }
IDbDataAdapter インターフェイスを実装し、"厳密な型指定機能" を備えたプロパティとメソッドを実装します。これにより、IDbCommand などのインターフェイスを使用せずに直接作成されたオブジェクトを、.NET Framework データ プロバイダのユーザーが参照できます。
厳密に型指定された TemplateCommand を返す SelectCommand プロパティの例を次に示します。TemplateDataAdapter が IDbDataAdapter としてキャストされた場合、TemplateDataAdapter.SelectCommand プロパティは IDbCommand を返します。
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; } }
プロバイダ固有のバージョンの RowUpdatedEventArgs と RowUpdatingEventArgs、および関連付けられているイベント ハンドラの型 (スケルトン コード) を実装します。オーバーロードされたイベントの型によって、厳密な型指定機能が実現します。これにより、イベント オブジェクト自体と適切なプロパティ (Command プロパティなど) の両方を厳密に型指定した方法で公開できます。次に例を示します。
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; } } }
DbDataAdapter の抽象メソッドを実装します。次に例を示します。
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); } }
DbDataAdapter 派生クラスでのイベントの実装を、次の例に示すように完了します。イベントは TemplateDataAdapter クラスの一部であり、デリゲートは名前空間の一部です。
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);
次に示すトピックでは、DataAdapter オブジェクト実装のサンプル コードが示されています。
Visual Basic 実装のサンプルについては、次のファイルを参照してください。
C# 実装のサンプルについては、次のファイルを参照してください。