- PR -

VB.NETで検索結果の有無によって処理を分ける方法

投稿者投稿内容
なり
常連さん
会議室デビュー日: 2006/06/19
投稿数: 32
投稿日時: 2006-06-19 13:36
はじめまして。nariと申します。
超初心者ゆえ、何か抜けている点がありましたらご指摘いただきますと幸いです。
また、コードが含まれますので、長文となりますこと、ご容赦ください。

現在、ASPX ファイル上のあるテキストボックスに入っている文字列を、SQLサーバーのプライマリキーの項目で検索し、検索結果の有無によって処理を分ける、といったプログラムを作成していますが、SQL Server からの応答をうまく取得できず、悩んでいます。

開発言語:VB.NET(Web Matrix を使用)
DBサーバ:SQL 2000 SP4

現在作成しているコードは以下です。

**コード*****
dim conn as new sqlconnection()
conn.ConnectionString = "data source=(local);Initial_ catalog=logs;Integrated Security=SSPI;"
conn.open()

dim cmd_select as New SqlCommand()
cmd_select.CommandText = "select count(*) from Table_
where ID_A=@ID_A"

dim ID_A0 as sqlparameter = cmd_Select.parameters.add("@ID_A",_ system.data.sqldbtype.varchar, 15)
ID_A0.value = ID_A.text

dim count as sqldatareader = cmd_select.ExecuteReader()

conn.close()

If count = 1 Then 処理1
Else 処理2
End If

これをコンパイルすると、以下のようなエラーが表示されます。

**エラー*****
error BC30452: 演算子 '=' は、型 'System.Data.SqlClient.SqlDataReader' および 'Integer' に対して定義されていません。

If count = 1 Then

何せ開発自体は初めてですので、このあたり(dim count as sqldatareader = cmd_select.ExecuteReader())を修正すべきなのかな、とは思うのですが、
どのように直したらよいか、2日ほど悩んでも解消できません。

何かご参考情報だけでもいただけますと幸いです。

お手数をおかけしますが、よろしくお願いいたします。

_________________
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-06-19 13:49
引用:

nariさんの書き込み (2006-06-19 13:36) より:

dim count as sqldatareader = cmd_select.ExecuteReader()
(snip)
If count = 1 Then


型を意識しましょう。

count は何型で定義していますか?
そして、右辺の 1 は何型になると思いますか?

# Count だけが取りたいのであれば、ExecuteScalar メソッドを使った方が良いでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2006-06-19 13:51
If count.HasRows = True Then

SqlDataReaderにcountって名前は微妙ですけど。。。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-06-19 13:51
引用:

nariさんの書き込み (2006-06-19 13:36) より:

dim count as sqldatareader = cmd_select.ExecuteReader()

conn.close()

If count = 1 Then 処理1



count の型の問題だと思います。
count を integer 型にして、キャストすれば宜しいかと思います。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2006-06-19 14:02
SELECT文がCount(*)だったんですね_| ̄|○
ExecuteScalar()メソッドを使用してください。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-06-19 14:11
引用:

R・田中一郎さんの書き込み (2006-06-19 13:51) より:

count を integer 型にして、キャストすれば宜しいかと思います。


DataReader 型自体とは互換性がないので、無理ですよ... orz

引用:

burton999さんの書き込み (2006-06-19 14:02) より:

SELECT文がCount(*)だったんですね_| ̄|○
ExecuteScalar()メソッドを使用してください。


みたいです。
スレッド タイトルだけを見ていると、HasRows が、適切なんでしょうけどね。
(実は、私も burton999 さんと同じことを書いて消しましたw)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
なり
常連さん
会議室デビュー日: 2006/06/19
投稿数: 32
投稿日時: 2006-06-19 14:32
じゃんぬねっとさん、burton999さん、R・田中一郎さん

早速のアドバイスありがとうございます!
アドバイスを元に、以下のように修正して、
やりたいことができるようになりました。

本当にありがとうございました!
型、という定義は理解できていたのですが、
クラス?(sqldetareader とか)で指定したものについて、
どんな型になるのかよく理解していませんでした。
もっと勉強をしたいと思います。


dim conn as new sqlconnection()
conn.ConnectionString = "data source=(local);Initial_ catalog=logs;Integrated Security=SSPI;"
conn.open()

dim cmd_select as New SqlCommand()
cmd_select.CommandText = "select count(*) from Table_
where ID_A=@ID_A"

dim ID_A0 as sqlparameter = cmd_Select.parameters.add("@ID_A",_ system.data.sqldbtype.varchar, 15)
ID_A0.value = ID_A.text

dim res1 as sqldatareader = cmd_select.ExecuteReader()

conn.close()

If res1.HasRowshas = True Then 処理1
Else 処理2
End If
たつ64
会議室デビュー日: 2005/08/02
投稿数: 16
お住まい・勤務地: 天下の台所?
投稿日時: 2006-06-19 16:42
本当にOKですか?
コンパイルエラーがなくなっただけなのでは?
「SELECT COUNT(*)」は必ず行を返したと思うのですが…。
# 例外発生以外で。
ということは必ず処理1が実行されます。

因みに、MSDN(オンライン)のExecuteScalarメソッドのコード例に
スレ主さんがやりたいことがほぼそのまま載ってます。
# COUNTを取得する方法です。

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