Dim Cn As OleDb.OleDbConnection
Dim dA As OleDb.OleDbDataAdapter
Dim dS As DataSet = New DataSet
Dim foundRow As DataRow
Dim findData As String
Cn = New OleDb.OleDbConnection( _
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source= DATA.mdb;")
dA = New OleDb.OleDbDataAdapter("SELECT * FROM table1 ", Cn)
dA.Fill(dS, "tableA")
foundRow = dS.Tables("table1").Select(" field1=2 ")(0)
findData=foundRow("field2")
こうやってフィールというかItem名がfield1のところでデータが2のRowを探し同じRow内のfield2からデータを取り出します。
目的のレコードが見つかったときは良いのですが、もしそのレコードがなければエラーが出ます。また、そのレコードがNull でもエラーが出ます。
それを回避するために IsDbNull(foundRow("field2"))や
If foundRow Is Nothing Then などを使ってもやはりエラーを避けることができません。
またTry では Resume Next が使えないので今は仮にOn Error GoTo ErrorHandler
でエラー処理にとばしてエラー番号から次の処理をしています。
エラーをださずに、レコードが見つからないときやレコードの内容がNULLでも処理する方法はないでしょうか?
この方法はテーブルをメモリーに全て読み込んでからの処理でしょうから、レコードという概念がもう間違っているのかもしれませんが、エラーを出さずに次の処理に進む方法を教えてください。
foundRow = dS.Tables("table1").Select(" field1=2 ")(0)
if データ=Null then なになに
if レコード無し then なになに
といった感じで次の処理につなげていきたいのです。
VB6のときは Recordset.AbsolutePosition = adPosEOFとして、レコード範囲外の時の処理をしていたのですが、それがVB.NETではわかりません。上のやり方では配列のなかにすべてのデータを読み込んだようなものなのでしょうから、当然処理の仕方も違うのでしょうね。