例えば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 データセット内の特定列の最大値取得方法に意見が出されてます。
参考: