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

 

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

 

このサンプルは、DataTableから追加、変更、削除されたレコードを抽出して表示します。DataTableから追加、変更、削除されたレコードを抽出するには、DataTableSelect()メソッドを使用します。Select()メソッドの引数には、DataViewRowStateを指定します。

 

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

 

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

  DataTableにレコードを追加する方法

  DataTableのレコードを変更する方法

  DataTableのレコードを削除する方法

  DataTableから追加、変更、削除されたレコードを抽出する方法

 

サンプルのPage_Load()イベントでは、DataTableから追加、変更、削除されたレコードを抽出して表示します。行8-9では、得意先テーブルからレコードを抽出するSQLを生成しています。行10-13では、OleDbConnectionOleDbDataAdapterDataTableのインスタンスを生成しています。

 

15では、OleDbDataAdapterFill()メソッドで得意先テーブルをDataTableに取り込んでいます。行23-27では、DataTableに新規レコードを追加しています。行30-31では、DataTable1番目のレコードの得意先名を変更しています。行34-35では、DataTable2番目のレコードを削除しています。

 

  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.Rows.Add(dr)
 28:
 30:   dr = dt.Rows(0)
 31:   dr("CompanyName") &= "
"
 32:
 34:   dr = dt.Rows(1)
 35:   dr.Delete

:::
 47: End Sub

 

37-41では、DataViewRowStateAddedModifiedOriginalModifiedCurrentDeletedを設定しています。ここで設定したDataViewRowStateは、Select()メソッドで使用します。行42では、DataTableSelect()メソッドでレコードを抽出しています。Select()メソッドの引数には、filterExpressionsortrecordStatesを指定します。filterExpressionには、空白を指定していますのでDataTableのすべてのレコードが対象になります。sortには、空白を指定していますので並べ替えしません。recordStatesには、行37-41で設定したDataViewRowStateを指定しています。このDataViewRowStateには、AddedModifiedOriginalModifiedCurrentDeletedを設定していますのでDataTable上で追加、変更、削除されたレコードが抽出されます。ModifiedOriginalは、レコードの変更前のデータを取得することを意味します。ModifiedCurrentは、レコードの更新後のデータを取得することを意味します。Select()メソッドの戻り値としてDataRowのコレクションが返されます。

 

44-46For Each…Nextでは、arrRowsコレクションからDataRowを取得してSub DisplayRow()に渡します。DispayRow(()では、DataRowのすべてのカラム名とカラム値を表示します。

 

37:   Dim dvrs As DataViewRowState = _
 38:     DataViewRowState.ModifiedOriginal _
 39:     Or DataViewRowState.ModifiedCurrent _
 40:     Or DataViewRowState.Added _
 41:     Or DataViewRowState.Deleted
 42:   Dim arrRows As DataRow() = dt.Select("", "", dvrs)
 43:   Response.Write("<h2>DataTable.Select(DataViewRowState)</h2>")
 44:   For Each dr In arrRows
 45:     DisplayRow(dr)
 46:   Next

Sub DisplayRow()の行50では、DataRowTableプロパティからDataTableを取得しています。行52-69For Each…Nextでは、DataTableColumnsコレクションからDataColumnを取得しています。行54-56は、DataRowRowStateプロパティが追加(Added)のときに実行されます。Response.Write()メソッドでは、カラム名、カラム値を表示しています。カラム名が得意先名のときは、「(追加)」を表示します。カラム値は、DataRowItemプロパティから取得します。Itemプロパティの引数には、columnNameversionを指定します。columnNameには、カラム名を指定します。versionには、DataRowVersionを指定します。DataRowVersionとして、OriginalCurrentProposedなどを指定することができます。ここでは、Currentを指定してカレントの値を表示しています。

 

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は、DataRowRowStateプロパティが変更(Modified)のときに実行されます。Response.Write()メソッドでは、カラム名、カラム値を表示しています。カラムが変更されているときは、「(変更)」を表示します。カラム値を取得するには、DataRow()の引数にcolumnNameversionを指定します。ここでは、versionCurrentを指定して変更後の値を表示しています。カラムが変更されているか調べるには、OriginalCurrentの値を比較します。

 

If dr(columnName, DataRowVersion.Original) <> dr(columnName, DataRowVersion.Current) Then

  Response.Write(“変更有り”)

Else

  Response.Write(“変更無し”)

End If

 

62-64は、DataRowRowStateプロパティが削除(Deleted)のときに実行されます。Response.Write()メッドでは、カラム名とカラム値を表示しています。カラム値を取得するには、DataRow()の引数にcolumnNameversionを指定しています。ここでは、versionOriginalを指定して削除前の値を表示しています。

 

dr(columnName, DataRowVersion.Original) è 削除前の値

 

66-67は、DataRowRowStateプロパティが変更なし(UnModified)のときに実行されます。Response.Write()メソッドでは、カラム名とカラム値を表示しています。カラム値を取得するには、DataRow()の引数としてcolumnNameversionを指定します。ここでは、versionを省略していますので、DataRowVersion.Defaultが採用されます。

 

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.RowState = DataRowState.Added Then
 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.RowState = DataRowState.Modified Then
 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.RowState = DataRowState.Deleted Then
 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