DOBON.NET DOBON.NETプログラミング掲示板過去ログ

SELECT SUM文で取得したSUMの値を、DataRowで取得するには。

環境/言語:[XP、VB.NET2003]
分類:[.NET]

こんにちは。
お忙しいところ、失礼致します。

以下、ご質問させて頂きます。

まず、SQLServerに、下記のような構造の、[顧客マスタ]が、あると、します。

---------------------------------------------------
[顧客マスタ]
顧客ID(数値型)
顧客名(テキスト型)
年齢(数値型)
---------------------------------------------------

中には、レコードが、3人分、入っております。

プロジェクトにおいては、
1つのフォームに、ボタンが2つ、テキストが2つ、あります。

年齢ボタン(btnNenrei)をクリックすると、[顧客マスタ]で、[顧客ID]が最も小さいレコードの、[年齢]が取得され、年齢テキスト(txtNenrei)に、表示されます。

また、年齢合計ボタン(btnNenreiGokei)をクリックすると、[顧客マスタ]に入っている3人分のレコードにおける[年齢]の合計値が取得され、年齢合計テキスト(txtNenreiGokei)に、表示されます。

まず、年齢ボタンのコードです。

---------------------------------------------------
Private Sub btnNenrei_Click(以下、略)

Dim cn As New SqlClient.SqlConnection(接続文字列)

Dim strSQL As String
Dim da As SqlClient.SqlDataAdapter

Dim ds As New DataSet
Dim dt As DataTable
Dim dr() As DataRow

Dim intNenrei As integer

strSQL = "SELECT * FROM [顧客マスタ] ORDER BY [顧客ID] ASC"
da = New SqlClient.SqlDataAdapter(strSQL, cn)
da.Fill(ds, "顧客マスタ")
dt = ds.Tables("顧客マスタ")
dr = dt.Select

intNenrei = Cint(dr(0)("年齢"))
txtNenrei.Text = Cstr(intNenrei)

da = Nothing
ds = Nothing
dt = Nothing
dr = Nothing

End Sub
---------------------------------------------

上記のコード中で、「dr(0)("年齢")」という表記は、エラーを起こさずに、通ります。

次に、年齢合計ボタンのコードです。

---------------------------------------------
Private Sub btnNenreiGokei_Click(以下、略)

Dim cn As New SqlClient.SqlConnection(接続文字列)

Dim strSQL As String
Dim da As SqlClient.SqlDataAdapter

Dim ds As New DataSet
Dim dt As DataTable
Dim dr() As DataRow

Dim intNenreiGokei As integer

strSQL = "SELECT SUM([年齢]) AS [年齢合計] FROM [顧客マスタ]"
da = New SqlClient.SqlDataAdapter(strSQL, cn)
da.Fill(ds, "顧客マスタ")
dt = ds.Tables("顧客マスタ")
dr = dt.Select

intNenreiGokei = Cint(dr(0)("年齢合計"))
txtNenreiGokei.Text = Cstr(intNenreiGokei)

da = Nothing
ds = Nothing
dt = Nothing
dr = Nothing

End Sub
---------------------------------------------

上記のコード中で、「dr(0)("年齢合計")」という表記は、値を取得しません。
また、dr(0)("年齢")という表記の場合、
列'年齢'は、テーブル[顧客マスタ]に、所属していない、と、エラーメッセージが、出てしまいます。

この、年齢合計の値を、取得して、intNenreiGokeiに代入したいのですが、
この場合、どのように記述したらよいか、分からない状態です。

お分かりになられる方がいらっしゃいましたら、
誠にお手数と存じますが、
ご教示頂きたく、存じます。

どうぞよろしくお願い致します。
■No31521に返信(ERIさんの記事)
> 上記のコード中で、「dr(0)("年齢合計")」という表記は、値を取得しません。
DB項目との不一致がないとすれば年齢にNullが入っているレコードは
ないでしょうか?1レコードでも入っていると結果はNullになってしまいます。
Sum(IsNull(年齢, 0))
とするか
Whereで年齢 is not null
とした方がよいかと思います。
■No31524に返信(shuさんの記事)
shu様、ありがとうございます^^。
確認、修正、してみます。

> ■No31521に返信(ERIさんの記事)
>>上記のコード中で、「dr(0)("年齢合計")」という表記は、値を取得しません。
> DB項目との不一致がないとすれば年齢にNullが入っているレコードは
> ないでしょうか?1レコードでも入っていると結果はNullになってしまいます。
> Sum(IsNull(年齢, 0))
> とするか
> Whereで年齢 is not null
> とした方がよいかと思います。
■No31524に返信(shuさんの記事)

お世話になります。
dr(0)("数量合計")という記述方法自体が、間違っていたわけではなく、
Nullレコードが入っていたために、dr(0)("数量合計")の値が、
DBNullになっていて、それを、Cintで型変換しようとしている部分で、
エラーが起きていました。
IsDBNull関数を使って、Nullでない時のみ、Cint変換、表示をするようにすることで、解決しました。
ご教示、ありがとうございました^^。

> ■No31521に返信(ERIさんの記事)
>>上記のコード中で、「dr(0)("年齢合計")」という表記は、値を取得しません。
> DB項目との不一致がないとすれば年齢にNullが入っているレコードは
> ないでしょうか?1レコードでも入っていると結果はNullになってしまいます。
> Sum(IsNull(年齢, 0))
> とするか
> Whereで年齢 is not null
> とした方がよいかと思います。
解決しました。
ありがとうございました^^。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板