- - PR -
SQLで最大値を取得した際のDBNullエラーの回避法
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 エラー「存在しないデータを読み取ろうとしました」 などを試してきたのですが、上手く行きませんでした 判別方法を教えていただけたら助かります | ||||
|
投稿日時: 2007-11-14 14:49
書き込みから推理すると、多分Read()を読んでないとかそんな所じゃないですかね。
MSDNのRead()メソッドの解説に SqlDataReader の既定の位置は、先頭のレコードの前です。そのため、データへのアクセスを開始するには、Read を呼び出す必要があります。 とあります。 「Nullの時の判別方法」はエイジさんので間違ってませんよ。 | ||||
|
投稿日時: 2007-11-14 15:01
SQL側でも対応できますね。
| ||||
|
投稿日時: 2007-11-14 15:28
一郎さんのおっしゃる通りRead()を読んでいませんでした^^;
勝手にVB6.0で使っていたRecordsetと同じに考えていたのが間違いですね・・ おかげさまで上手く進めることができました こあらさんのおっしゃるSQL側での対応も実行して意図する結果を得る事ができました プログラマーになって4ヶ月目で勉強中なのですが、VBどころかSQLも奥が深い事を改めて知り、勉強不足で恥ずかしい限りです これからも精進して行こうと思いますので、また機会がありましたらご指導よろしくおねがいします |
1