● DataTableからレコードのステータスを指定して抽出するサンプル

図 DataTableからレコードのステータスを指定して抽出するサンプル
このサンプルは、DataTableから追加、変更、削除されたレコードを抽出して表示します。DataTableから追加、変更、削除されたレコードを抽出するには、DataTableのSelect()メソッドを使用します。Select()メソッドの引数には、DataViewRo
このサンプルでは、以下のノウハウを習得することができます。
▲ 得意先テーブルをDataTableに取り込む方法
▲ DataTableにレコードを追加する方法
▲ DataTableのレコードを変更する方法
▲ DataTableのレコードを削除する方法
▲ DataTableから追加、変更、削除されたレコードを抽出する方法
サンプルのPage_Load()イベントでは、DataTableから追加、変更、削除されたレコードを抽出して表示します。行8-9では、得意先テーブルからレコードを抽出するSQLを生成しています。行10-13では、OleDbConnection、OleDbDataAdapter、DataTableのインスタンスを生成しています。
行15では、OleDbDataAdapterのFill()メソッドで得意先テーブルをDataTableに取り込んでいます。行23-27では、DataTableに新規レコードを追加しています。行30-31では、DataTableの1番目のレコードの得意先名を変更しています。行34-35では、DataTableの2番目のレコードを削除しています。
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)
21:
23: Dim dr As DataRow = dt.NewRow()
24: dr("CompanyName") =
"フレンドリーソフト"
25: dr("ContactName") =
"葛西 秋雄"
26: dr("Phone") =
"(0480)99-9999"
27: dt.Ro
28:
30: dr = dt.Ro
31: dr("CompanyName") &=
"※"
32:
34: dr = dt.Ro
35: dr.Delete
:::
47: End Sub
行37-41では、DataViewRo
行44-46のFor Each…Nextでは、arrRo
37:
Dim dvrs As DataViewRo
38: DataViewRo
39: Or DataViewRo
40: Or DataViewRo
41: Or DataViewRo
42: Dim arrRo
43:
Response.Write("<h2>DataTable.Select(DataViewRo
44: For Each dr In arrRo
45: DisplayRow(dr)
46: Next
Sub DisplayRow()の行50では、DataRowのTableプロパティからDataTableを取得しています。行52-69のFor Each…Nextでは、DataTableのColumnsコレクションからDataColumnを取得しています。行54-56は、DataRowのRo
dt.Item(columnName, DataRowVersion.Original) è 変更前の値
dt.Item(columnName, DataRowVersion.Current) è 変更後の値(BeginEdit前)
dt.Item(columnName, DataRowVersion.Proposed) è 変更後の値(BeginEdit後)
Itemプロパティを省略して、次のように記述することもできます。
dt(columnName, DataRowVersion.Original)
dt(columnName, DataRowVersion.Current)
dt(columnName, DataRowVersion.Proposed)
行58-60は、DataRowのRo
If dr(columnName,
DataRowVersion.Original) <> dr(columnName, DataRowVersion.Current) Then
Response.Write(“変更有り”)
Else
Response.Write(“変更無し”)
End If
行62-64は、DataRowのRo
dr(columnName, DataRowVersion.Original) è 削除前の値
行66-67は、DataRowのRo
dt(dc.ColumnName)
dt(db.ColumnName, DataRowVersion.Default)
DataRowVersionを省略したとき、ProposedのデータがあればPoroposedを渡します。ProposedのデータがなければCurrentを渡します。
49: Sub DisplayRow(dr As DataRow)
50: Dim dt As DataTable = dr.Table
51: Dim dc As DataColumn
52: For Each dc In dt.Columns
53: If dr.Ro
54:
Response.Write(String.Format("<b>{0}</b>: {1}
<b>{2}</b><br>", _
55: dc.ColumnName,
dr(dc.ColumnName, DataRowVersion.Current), _
56:
Iif(dc.ColumnName="CompanyName","(追加)","")))
57: ElseIf dr.Ro
58:
Response.Write(String.Format("<b>{0}</b>: {1}
<b>{2}</b><br>", _
59:
dc.ColumnName, dr(dc.ColumnName, DataRowVersion.Current), _
60:
Iif(dr(dc.ColumnName, DataRowVersion.Original) <>
dr(dc.ColumnName,
DataRowVersion.Current),"(変更)","")))
61: ElseIf dr.Ro
62: Response.Write(String.Format("<b>{0}</b>:
{1} <b>{2}</b><br>", _
63:
dc.ColumnName, dr(dc.ColumnName, DataRowVersion.Original), _
64:
Iif(dc.ColumnName="CompanyName","(削除)","")))
65: Else
66:
Response.Write(String.Format("<b>{0}</b>:
{1}<br>", _
67:
dc.ColumnName, dr(dc.ColumnName)))
68: End If
69: Next
70:
Response.Write("<hr>")
71: End Sub