none
foundRow でデータがNULL値または見つからないときの処理方法? RRS feed

  • 質問

  • 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ではわかりません。上のやり方では配列のなかにすべてのデータを読み込んだようなものなのでしょうから、当然処理の仕方も違うのでしょうね。

     


     

    2007年6月29日 3:04

すべての返信

  • selectメソッドが返すのはDataRowの配列ですので、まずそのように修正し、そのCountプロパティで判断できると思います。たぶん、selectは見つからなかった場合、nullではなく空のDataRowの配列を返しているんじゃないかと思います。それで、Nothingにならないのではないでしょうか?
    2007年6月29日 4:10
    モデレータ