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

図 DataTableのレコードを編集するサンプル
このサンプルは、得意先テーブルをDataTableに取り込んでレコードを編集します。レコードを編集するには、DataRow()の引数にカラム名を指定して値を設定します。実行結果としてDataTable上で編集されたレコードを表示します。レコードが編集されたカラムには「(変更)」が表示されます。
このサンプルでは、以下のノウハウを習得することができます。
▲ 得意先テーブルをDataTableに取り込む方法
▲ DataTableのレコードを編集する方法
▲ DataTableから変更されたレコードのみ抽出する方法
▲ DataTableのSelect()メソッドの使い方
▲ DataRowのAcceptChanges()、RejectChanges()メソッドの使い方
▲ DataRowのBeginEdit()、CancelEdit()、EndEdit()メソッドの使い方
サンプルのPage_Load()イベントでは、得意先テーブルをDataTableに取り込んでレコードを編集しています。行8-9では、得意先テーブルからレコードを抽出するSQLを生成しています。行10-13では、OleDbConnection、OleDbDataAdapter、DataTableのインスタンスを生成しています。
行15では、OleDbDataAdapterのFill()メソッドで得意先テーブルをDataTableに取り込んでいます。行17では、DataTableのRo
行20-21では、DataViewRo
行24-26のFor Each…NextでarrRo
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.Ro
18: dr("CompanyName") &= "※"
19:
20: Dim dvrs As DataViewRo
21: Or DataViewRo
22: Dim arrRo
23:
Response.Write("<h2>DataTable.DataRow.Edit</h2>")
24: For Each dr In arrRo
25: DisplayRow(dr)
26: Next
27: End Sub
Sub DisplayRow()では、DataRowのすべてのカラム名とカラム値を表示します。行30では、DataRowのTableプロパティからDataTableを生成しています。行32-49のFor Each…Nextでは、DataTableのColumnsコレクションからDataColumnを取り出しています。行38-40は、DataRowのRo
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.Ro
37: ElseIf dr.Ro
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.Ro
45: Else
48: End If
49: Next
50:
Response.Write("<hr>")
51: End Sub
Tip
|
DataRowのAcceptChanges()、RejectChanges()メソッドの使い方 DataRowのRo Ro Ro このように、AcceptChanges()、RejectChanges()メソッドを使用するとDataRowを変更した後に確定したり、元の状態に復元することができます。DataAdapterのUpdate()メソッドを使用してDataTableをデータベースに反映するときは、内部的にAcceptChanges()メソッドが実行されます。つまり、Update()メソッド実行後、すべてのDataRowのRo 図3-4-2-8のサンプルでは、DataTableのSelect()メソッドにDataVie
図 DataRowのAcceptChanges()、RejectChanges()メソッドを使用したサンプル |
Tip
|
DataRowのBeginEdit()、CancelEdit()、EndEdit()メソッドの使い方 DataRowのBeginEdit()メソッドを使用すると三世代の更新履歴(Original, Current、Proposed)を管理することができます。下図のサンプルを例にDataRowの更新履歴を管理する方法を解説します。行21-24では、BeginEdit()メソッドを使用してOriginal、Current、Proposedの三世代のデータを表示しています。行22では、オリジナル(Original)の得意先名に「※」を追加しています。行23では、BeginEdit()メソッドを実行して三世代の履歴管理をするようにしています。行24では、カレント(Current)の得意先名に「※」を追加してプロポーズ(Proposed)のデータを作成しています。行25-28では、DataRowのOriginal、Current、Proposedのデータを表示しています。Currentの得意先名には「※」が1個追加されています。Proposedの得意先名には、「※」が2個追加されています。 行31-35では、DataRowの得意先名を2回変更した後にEndEdit()メソッドを実行して確定しています。この場合、PoposedのデータがCurrentになります。つまり、Currentのデータを復元できなくなります。 行42-46では、DataRowの得意先名を2回変更した後にCancelEdit()メソッドを実行して2回目の変更を破棄して1回目のデータを復元しています。1回目の変更に復元された状態でRejectChanges()メッドを実行するとOriginalの状態に復元されます。 DataRowのAcceptChanges()、RejectChanges()、BeginEdit()、CancelEdit()、EndEdit()メッドを使用することによりDataRowの更新履歴を三世代まで管理してそれぞれの世代に復元することができます。
図 DataRowのBeginEdit()、CancelEdit()、EndEdit()メソッドを使用したサンプル |