- PR -

VB.NET SQL の検索結果をテキストボックスに表示したい

投稿者投稿内容
なり
常連さん
会議室デビュー日: 2006/06/19
投稿数: 32
投稿日時: 2006-07-11 16:42
お久しぶりです。nariと申します。
別の仕事が忙しくなってしまい、しばらくASP.NETが停滞していましたが、
多少余裕ができてきたので、再度取り掛かりました。

そしてまた・・・初歩的なところでつまずいていると思います。
なにとぞアドバイスをいただきたく。

--環境--
OS:Windows Server 2003
.NET framework 1.1
言語:VB.NET(WebMatrix)
--やりたい事--
SQL サーバー上には、次のようなテーブルがあります。
テーブル名:Logs
テーブル構造:
ID:Char(15)(重複なし)
Status:Chare(10)
LastModefy:datetime

aspx上に、テキストボックスを3つ(ID)(Status)(modefy)と、ボタン(search)がひとつあります。
(ID)に、任意の文字を入力し、(search)をクリックすると、(status)と(date)に検索結果を表示したいと考えています。
検索結果が無い場合などのエラー処理については今回はとりあえず無視してください。

--書いてみたコード--
dim conn as new sqlconnection()
conn.connectionstring = "data source=localhost;Initial Catalog=logs;Integrated Security=SSPI;"

dim cmd_Search as new sqlcommand()
cmd_search.CommandText = "select status,LastModefy from Logs where ID=@ID"
cmd_search2.connection = conn5

dim ID2 as sqlparameter = cmd_Search.parameters.add("@ID", system.data.sqldbtype.varchar, 15)
ID2.value = ID.text

Dim reader As SqlDataReader
conn5.open()
reader = cmd_search2.ExecuteReader()
Status.text = reader.getstring(status)
Modefy.text = reader.getstring(LastModefy)

conn5.close()

--実行時のエラー--
コンパイル エラー メッセージ: BC30311: 型 'System.Web.UI.WebControls.TextBox' の値を 'Integer' に変換できません。


ほぼ間違いなく、データ型の問題(何度ここでつまずいているやら・・・)かと思いますが、検索結果をテキストやプルダウンで表示させる方法について、ググってもみたのですが、目当てのものを見つけることができませんでした。

なにとぞ、アドバイスいただけますよう、お願いします。
Yam
大ベテラン
会議室デビュー日: 2003/09/13
投稿数: 179
お住まい・勤務地: だんじり祭りの地
投稿日時: 2006-07-11 18:01
検索結果をテキストやプルダウンで表示させる以前の問題だと思われますが...。
トリアーエズどの行でエラーが発生しているか分かりますか?

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

nariさんの書き込み (2006-07-11 16:42) より:

コンパイル エラー メッセージ: BC30311: 型 'System.Web.UI.WebControls.TextBox' の値を 'Integer' に変換できません。


コンパイル エラーは、実際にどこで起きていますか?
提示されたソース上には該当箇所がないように思えますが...

# それと、件名と質問が一致していません...
# 実行時の例外ならともかく 「コンパイル エラー」ですから。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
なり
常連さん
会議室デビュー日: 2006/06/19
投稿数: 32
投稿日時: 2006-07-12 09:26
Yamさん、じゃんぬねっとさん
返信ありがとうございます。
ちょっとコードにミスがありました。。(実際はもっと長いコードから抜粋して一部修正していましたので、修正ミスが・・)

>Yamさん
おそらく、間違えているのはこのあたりかと。
reader = cmd_search.ExecuteReader()
tanto.text = reader.getstring(tanto)
Modefy.text = reader.getstring(LastModefy)

>じゃんぬねっとさん
上記のコードだけで実行して、同じコンパイルエラーが出てしまいます。

コンパイル エラー メッセージ: BC30311: 型 'System.Web.UI.WebControls.TextBox' の値を 'Integer' に変換できません。

ソース エラー:
行 21: conn.open()
行 22: reader = cmd_search.ExecuteReader()
行 23: tanto.text = reader.getstring(tanto)
行 24: Modefy.text = reader.getstring(LastModefy)
行 25:

そもそも、tanto.text = reader.getstring(SQLのカラム名)という指定でよいものなのか?という疑問点があり、質問させていただいてもいます。
SQLのカラム名とテキストボックスの名前が同じことに起因?

----コード
Sub cmd_Search_Click(sender As Object, e As EventArgs)

dim conn as new sqlconnection()
conn.connectionstring = "data source=localhost;Initial Catalog=logs;Integrated Security=SSPI;"

dim cmd_Search as new sqlcommand()
cmd_search.CommandText = "select tanto,LastModefy from Logs where ID=@ID"
cmd_search.connection = conn

dim ID2 as sqlparameter = cmd_Search.parameters.add("@ID", system.data.sqldbtype.varchar, 15)
ID2.value = ID.text

Dim reader As SqlDataReader
conn.open()
reader = cmd_search.ExecuteReader()
tanto.text = reader.getstring(tanto)
Modefy.text = reader.getstring(LastModefy)

conn.close()

End Sub
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-07-12 09:45
引用:

nariさんの書き込み (2006-07-12 09:26) より:

そもそも、tanto.text = reader.getstring(SQLのカラム名)という指定でよいものなのか?という疑問点があり、質問させていただいてもいます。
SQLのカラム名とテキストボックスの名前が同じことに起因?


試しにテキストボックスをもう一つダミーで作って、そっちに渡してみては?(^ー^
Yam
大ベテラン
会議室デビュー日: 2003/09/13
投稿数: 179
お住まい・勤務地: だんじり祭りの地
投稿日時: 2006-07-12 09:46
引用:

nariさんの書き込み (2006-07-12 09:26) より:
おそらく、間違えているのはこのあたりかと。
reader = cmd_search.ExecuteReader()
tanto.text = reader.getstring(tanto)
Modefy.text = reader.getstring(LastModefy)


「おそらく」ではなく発生箇所を明確にして下さい。
発生箇所を把握するのは問題解決の第一歩です。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-12 09:47
引用:

nariさんの書き込み (2006-07-12 09:26) より:

おそらく、間違えているのはこのあたりかと。
reader = cmd_search.ExecuteReader()
tanto.text = reader.getstring(tanto)
Modefy.text = reader.getstring(LastModefy)


(タスク一覧を見れば場所は特定できるのに、なぜ "このあたりかと" なんでしょう?)

今、良く見たら、GetString メソッドの引数がおかしいですね。
tanto に、Text メンバがあるところからして、間違いなく型が間違っています。
GetString メソッドの引数は、Integer です。

tanto は、'System.Web.UI.WebControls.TextBox' のインスタンスですよね。
型が違えばコンパイル エラーになります。

LastModefy (Modefy という単語は、この世には存在しないと思いますが) でも起きているとすれば、同じことではないでしょうか?

# LastModefy に関しては、型がわからないので 「型が違う」 とは言及できませんでした。

引用:

上記のコードだけで実行して、同じコンパイルエラーが出てしまいます。


私は、「定義」 の部分も出しましょう、という意味でも書いています。

引用:

コンパイル エラー メッセージ: BC30311: 型 'System.Web.UI.WebControls.TextBox' の値を 'Integer' に変換できません。

行 21: conn.open()
行 22: reader = cmd_search.ExecuteReader()
行 23: tanto.text = reader.getstring(tanto)
行 24: Modefy.text = reader.getstring(LastModefy)
行 25:


何故、4 行が該当するんですか?
該当しそうな箇所は、23 行目、24 行目 の 2 行だけだと思います。

引用:

そもそも、tanto.text = reader.getstring(SQLのカラム名)という指定でよいものなのか?という疑問点があり、質問させていただいてもいます。
SQLのカラム名とテキストボックスの名前が同じことに起因?


いいえ、型を意識していないということから起因しています。
名前が同じことが原因なのではなく、型が間違えているというのが原因です。

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

お返事ありがとうございます。
以下のようにコードを修正したところ、コンパイルエラーはなくなりました。

----
Sub cmd_Search_Click(sender As Object, e As EventArgs)

dim conn as new sqlconnection()
conn.connectionstring = "data source=localhost;Initial Catalog=test;Integrated Security=SSPI;"

dim cmd_Search as new sqlcommand()
cmd_search.CommandText = "select tanto,LastModefy from Logs where ID=@ID"
cmd_search.connection = conn

dim ID2 as sqlparameter = cmd_Search.parameters.add("@ID", system.data.sqldbtype.varchar, 15)
ID2.value = ID.text

Dim reader As SqlDataReader
conn.open()
reader = cmd_search.ExecuteReader()
tanto.text = reader.getvalue(0)
Modefy.text = reader.getvalue(1)

conn.close()

End Sub
----

しかしながら、実行すると次のようなエラーになります。

----
例外の詳細: System.InvalidOperationException: 存在しないデータを読み取ろうとしました。

ソース エラー:
行 23: tanto.text = reader.getvalue(0)
行 24: Modefy.text = reader.getvalue(1)
----

getstring の場合、Integer を引数に使わなければならないことは理解できたのですが、たとえば0から始まる検索項目の連番を指定する(これは上記で指定してだめなので、間違いでしょうが)、等の細かい点がわかりません。
そもそも、getstring が適切なのかどうかも、アドバイスいただけませんでしょうか。

>じゃんぬねっとさん
>私は、「定義」 の部分も出しましょう、という意味でも書いています。

申し訳ありません。定義、という意味では、上に記載したコードのみ指定していて、そのほかは指定していません。
#おそらく、そういうことじゃなくて〜。と思っていらっしゃるかと思いますが、「この設定わからなきゃ返事できない!」という点を具体的に指示いただきたいと思います。

型については、毎度毎度同じところで引っかかっていますので、勉強をしようとは思っているのですが、どういう型があって、どんな形なのかの説明は見つけられても、各クラスで使用している型や変換についての情報がなかなか見当たらず、苦慮しています。
この本がお勧め、とか、このサイトに詳しく出てる、というようなものがありましたら、お教えいただけるとありがたいです。

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