- PR -

SQLで最大値を取得した際のDBNullエラーの回避法

1
投稿者投稿内容
エイジ
常連さん
会議室デビュー日: 2007/11/14
投稿数: 38
お住まい・勤務地: 兵庫
投稿日時: 2007-11-14 14:29
開発環境:Visual Studio2005
DB:SQL Server2005
言語:Visual Basic2005

Private Function mintGetMaxCD(ByVal vintMasterIndex As Integer) As Integer
  Dim cn As New SqlClient.SqlConnection("Data Source=・・・・.mdf;Integrated Security=True;User Instance=True")
  Dim cmd As SqlClient.SqlCommand = cn.CreateCommand
  Dim dr As SqlClient.SqlDataReader
  Dim strSQL As String = ""

  strSQL = "SELECT MAX(S_CD) AS MAX_CD FROM M_SAIHU"

  cmd.CommandText = strSQL

  cn.Open()

  dr = cmd.ExecuteReader

  'データが無ければCD=0で返す
  If dr.Read() = False Then
    mintGetMaxCD = 0
  Else
    mintGetMaxCD = dr.Item("MAX_CD")
  End If

  cn.Close()
End Function

上記のコードを実行した際データベースのテーブルが空でも
MAX値を求めている為、レコードが1つ返って来て
dr.Read()はTrueのままdr.Item("MAX_CD")の部分で
「型DBNullから型Integerへの変換は無効です」
とエラーが起きます

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1013462735
それはこちらで質問させてもらって理解しました

こちらの方が言うようにTryでエラーをcatchする方法で実現できるとは思うのですが
dr.Item("MAX_CD")がNullの時の判別方法を教えてもらないでしょうか?

今まで試した方法
1:If IsDBNull(dr.Item("MAX_CD")) = False Then
  エラー「存在しないデータを読み取ろうとしました」
2:If dr.Item("MAX_CD") Is DBNull.Value Then
  エラー「存在しないデータを読み取ろうとしました」
3:If TypeOf dr.Item("MAX_CD") Is DBNull Then
  エラー「存在しないデータを読み取ろうとしました」

などを試してきたのですが、上手く行きませんでした
判別方法を教えていただけたら助かります
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2007-11-14 14:49
書き込みから推理すると、多分Read()を読んでないとかそんな所じゃないですかね。
MSDNのRead()メソッドの解説に

SqlDataReader の既定の位置は、先頭のレコードの前です。そのため、データへのアクセスを開始するには、Read を呼び出す必要があります。

とあります。
「Nullの時の判別方法」はエイジさんので間違ってませんよ。
こあら
大ベテラン
会議室デビュー日: 2007/06/26
投稿数: 157
投稿日時: 2007-11-14 15:01
SQL側でも対応できますね。

コード:
 strSQL = "SELECT ISNULL(MAX(S_CD),0) AS MAX_CD FROM M_SAIHU"


エイジ
常連さん
会議室デビュー日: 2007/11/14
投稿数: 38
お住まい・勤務地: 兵庫
投稿日時: 2007-11-14 15:28
一郎さんのおっしゃる通りRead()を読んでいませんでした^^;
勝手にVB6.0で使っていたRecordsetと同じに考えていたのが間違いですね・・

おかげさまで上手く進めることができました

こあらさんのおっしゃるSQL側での対応も実行して意図する結果を得る事ができました

プログラマーになって4ヶ月目で勉強中なのですが、VBどころかSQLも奥が深い事を改めて知り、勉強不足で恥ずかしい限りです

これからも精進して行こうと思いますので、また機会がありましたらご指導よろしくおねがいします
1

スキルアップ/キャリアアップ(JOB@IT)