3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(VB.Net)DataTableで特定の列の最大値を含む行を取得したい。(DataTable.Select)

例えばDataGridViewでDataTableをデータソースに設定し、新規行を作ったときに、ID列を自動採番するときに、今のID列の最大値を取得してそれ+1の値を新規にIDにしたいときがあると思います。

このときに新規IDを得るための最大値を取得する方法です。

このようなときは DataTable.Select() メソッドが有用です。

最近までこのメソッドを知りませんでしたが、これを使うとSQLのWHERE的な感じで任意のレコードを検索することができるみたいで便利です。

で、本題の最大値を取得する方法ですが下記のようなコードでできます。

'DetaTableを作成し、テストデータ作成

Private dtbl As New DataTable()

dtbl.Columns.Add(New DataColumn("ID", Type.GetType("System.Int32")))

dtbl.Columns.Add(New DataColumn("Name", Type.GetType("System.String")))

Dim row1 As DataRow = dtbl.NewRow()

row1.Item("ID") = 1

row1.Item("Name") = "1行目"

dtbl.Rows.Add(row1)

Dim row2 As DataRow = dtbl.NewRow()

row2.Item("ID") = 100

row2.Item("Name") = "2行目"

dtbl.Rows.Add(row2)

Dim row3 As DataRow = dtbl.NewRow()

row3.Item("ID") = 10

row3.Item("Name") = "3行目"

dtbl.Rows.Add(row3)

 

'DataTable.Selectで値の最大値の行を取得

Dim tmpDatarow() As DataRow = dtbl.Select("ID = MAX(ID) ", "")

Dim MaxValue As Integer = tmpDatarow(0).Item("ID")

ちなみに、DataTable.Select メソッドの第二引数にソートする列を指定することできるようです。

ソートの方向はSQLと同じように ASC,DESCで指定できます。

dtbl.Select("ID = MAX(ID) ", "ID2 DESC")

dtbl.Select("ID = MAX(ID) ", "ID2 ASC")

このソートの条件で、複数の列をソートする場合は列名をカンマで区切って複数指定すればいいだけみたいです。ということがこちらに書かれてました。

複数の条件を指定するときもSQLと同じように ANDやOR が使えるようです。

dtbl.Select("ID=MAX(ID) OR Name='1行目'", "ID ASC")

ただ、DBとDataTableがDataSetでつながっており、多数のクライアントからDB使うときはDataTableの最大値より、SQLでDBの最大値を取得しないと整合性的に問題が出るので注意が必要です。

ここらへんは@IT データセット内の特定列の最大値取得方法に意見が出されてます。

参考:

@IT 第6回 データセットを使ったレコードの更新と削除(■Selectメソッドによるレコードの検索)

MSDN:DataTable.Select メソッド