DataTableのレコードを編集するサンプル

DataTableのレコードを編集するサンプル

 

このサンプルは、得意先テーブルをDataTableに取り込んでレコードを編集します。レコードを編集するには、DataRow()の引数にカラム名を指定して値を設定します。実行結果としてDataTable上で編集されたレコードを表示します。レコードが編集されたカラムには「(変更)」が表示されます。

 

このサンプルでは、以下のノウハウを習得することができます。

 

  得意先テーブルをDataTableに取り込む方法

  DataTableのレコードを編集する方法

  DataTableから変更されたレコードのみ抽出する方法

  DataTableSelect()メソッドの使い方

  DataRowAcceptChanges()RejectChanges()メソッドの使い方

  DataRowBeginEdit()CancelEdit()EndEdit()メソッドの使い方

 

サンプルのPage_Load()イベントでは、得意先テーブルをDataTableに取り込んでレコードを編集しています。行8-9では、得意先テーブルからレコードを抽出するSQLを生成しています。行10-13では、OleDbConnectionOleDbDataAdapterDataTableのインスタンスを生成しています。

 

15では、OleDbDataAdapterFill()メソッドで得意先テーブルをDataTableに取り込んでいます。行17では、DataTableRowsコレクションから先頭のDataRowを取得しています。行18では、DataRowの得意先名に「※」を付加して変更しています。

 

20-21では、DataViewRowStateModifiedOriginalModifiedCurrentを設定しています。ここで設定したDataViewRowStateは、DataTableSelect()メソッドで使用します。行22では、DataTableSelect()メソッドで変更したレコードを抽出してarrRowsコレクションに格納しています。Select()メソッドの引数には、filterExpressionsortrecordStatesを指定しています。filterExpressionには、空白を指定していますのですべてのレコードが対象になります。sortには、空白を指定していますので並べ替えされません。recordStatesには、行20-21で生成したDataViewRowStateを指定しています。このDataViewRowStateには、ModifiedOriginalModifiedCurrentが設定されていますので変更されたレコードの前後のデータが取得できます。

 

24-26For Each…NextarrRowsコレクションからDataRowを取り出してSub DisplayRow()に渡しています。DisplayRow()では、DataRowのすべてのカラム名とカラム値を表示します。カラムが変更されているときは「(変更)」を付加して表示します。

 

 

  7: Sub Page_Load()
  8:   Dim strSQL As String = "Select CustomerID, CompanyName, " & _
  9:     "ContactName, Phone From Customers"
 10:   Dim con As New OleDbConnection( _
 11:     ConfigurationSettings.AppSettings("conStringNw"))
 12:   Dim da As New OleDbDataAdapter(strSQL, con)
 13:   Dim dt As New DataTable("Customers")
 14:
 15:   da.Fill(dt)
 17:   Dim dr As DataRow = dt.Rows(0)
 18:   dr("CompanyName") &= "
"
 19:
 20:   Dim dvrs As DataViewRowState = DataViewRowState.ModifiedOriginal _
 21:     Or DataViewRowState.ModifiedCurrent
 22:   Dim arrRows As DataRow() = dt.Select("", "", dvrs)
 23:   Response.Write("<h2>DataTable.DataRow.Edit</h2>")
 24:   For Each dr In arrRows
 25:     DisplayRow(dr)
 26:   Next
 27: End Sub

 

Sub DisplayRow()では、DataRowのすべてのカラム名とカラム値を表示します。行30では、DataRowTableプロパティからDataTableを生成しています。行32-49For Each…Nextでは、DataTableColumnsコレクションからDataColumnを取り出しています。行38-40は、DataRowRowStateが変更(Modified)のとき実行されます。Response.Write()メソッドでは、カレントのカラム名とカラム値(変更後の値)を表示しています。カラムが変更されているときは、カラム値の右に「(変更)」を付加します。行50では、DataRowのすべてのカラムを表示した後にHTML<hr>タグを表示しています。

 

 

29: Sub DisplayRow(dr As DataRow)
 30:   Dim dt As DataTable = dr.Table
 31:   Dim dc As DataColumn
 32:   For Each dc In dt.Columns
 33:     If dr.RowState = DataRowState.Added Then
 37:     ElseIf dr.RowState = DataRowState.Modified Then
 38:       Response.Write(String.Format("<b>{0}</b>: {1} <b>{2}</b><br>", _
 39:         dc.ColumnName, dr(dc.ColumnName, DataRowVersion.Current), _
 40:         Iif(dr(dc.ColumnName, DataRowVersion.Original) <> dr(dc.ColumnName,

DataRowVersion.Current),"(変更)","")))
 41:     ElseIf dr.RowState = DataRowState.Deleted Then
 45:     Else
 48:     End If
 49:   Next
 50:   Response.Write("<hr>")
 51: End Sub

 

 

Tip

DataRowAcceptChanges()RejectChanges()メソッドの使い方

 

DataRowRowStateプロパティには、AddedDeletedModifiedUnchangedなどレコードの状態が格納されています。DataRowのカラムを変更したときは、RowStateUnchangedからModifiedに切り替わります。RowStateModifiedのときは、変更前後のデータが管理されています。

 

RowStateModifiedのとき、AcceptChanges()メソッドを実行すると変更後のデータが確定されてUnchangedに切り替わります。この状態では、変更前のデータが破棄されて変更後のデータのみ管理されます。

 

RowStateModifiedのとき、RejectChanges()メソッドを実行すると変更前の状態に復元されてUnchangedに切り替わります。この状態では、変更後のデータが破棄されて変更前のデータのみ管理されます。

 

このように、AcceptChanges()RejectChanges()メソッドを使用するとDataRowを変更した後に確定したり、元の状態に復元することができます。DataAdapterUpdate()メソッドを使用してDataTableをデータベースに反映するときは、内部的にAcceptChanges()メソッドが実行されます。つまり、Update()メソッド実行後、すべてのDataRowRowStateUnchangedになります。

 

3-4-2-8のサンプルでは、DataTableSelect()メソッドにDataViewStateを指定して変更されたDataRowを抽出しています。DataRowの得意先名を変更した後にAcceptChanges()RejectChanges()メソッドを実行しているためdt.Rows(1)dt.Rows(2)のレコードは表示されません。

 

DataRowAcceptChanges()RejectChanges()メソッドを使用したサンプル

 

 

 

Tip

DataRowBeginEdit()CancelEdit()EndEdit()メソッドの使い方

 

DataRowBeginEdit()メソッドを使用すると三世代の更新履歴(Original, CurrentProposed)を管理することができます。下図のサンプルを例にDataRowの更新履歴を管理する方法を解説します。行21-24では、BeginEdit()メソッドを使用してOriginalCurrentProposedの三世代のデータを表示しています。行22では、オリジナル(Original)の得意先名に「※」を追加しています。行23では、BeginEdit()メソッドを実行して三世代の履歴管理をするようにしています。行24では、カレント(Current)の得意先名に「※」を追加してプロポーズ(Proposed)のデータを作成しています。行25-28では、DataRowOriginalCurrentProposedのデータを表示しています。Currentの得意先名には「※」が1個追加されています。Proposedの得意先名には、「※」が2個追加されています。

 

31-35では、DataRowの得意先名を2回変更した後にEndEdit()メソッドを実行して確定しています。この場合、PoposedのデータがCurrentになります。つまり、Currentのデータを復元できなくなります。

 

42-46では、DataRowの得意先名を2回変更した後にCancelEdit()メソッドを実行して2回目の変更を破棄して1回目のデータを復元しています。1回目の変更に復元された状態でRejectChanges()メッドを実行するとOriginalの状態に復元されます。

 

DataRowAcceptChanges()RejectChanges()BeginEdit()CancelEdit()EndEdit()メッドを使用することによりDataRowの更新履歴を三世代まで管理してそれぞれの世代に復元することができます。

 

 

DataRowBeginEdit()CancelEdit()EndEdit()メソッドを使用したサンプル