- PR -

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

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

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

しかしながら、実行すると次のようなエラーになります。
例外の詳細: System.InvalidOperationException: 存在しないデータを読み取ろうとしました。


例外のメッセージどおりではないのでしょうか?
Read メソッドを呼び出していますか?
Read メソッドの戻り値が true の時に、SqlDataReader.Get~ メソッドを実行していますか?

引用:

tanto.text = reader.getvalue(0)
Modefy.text = reader.getvalue(1)

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


(ソースを見ると、GetString メソッドから、GetValue メソッドに変わっているのですが...)
SqlDataReader のインデクサ (デフォルト プロパティ) で、フィールド名でアクセスされてはいかがですか?
reader("フィールド名") という書き方をします。

引用:

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


'tanto' と 'Modefy' という変数を定義しているかと思いますが、
この 2 つの変数の '型' が書かれていないので、わからないですよ、という意味です。
(コンパイル エラーが解決されたようなので、もう知る必要はないです)

引用:

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


Visual Studio を使用されているなら、型が何であるかは 「オブジェクト ブラウザ」 で確認できます。
また、MSDN ライブラリというリファレンスを見れば、全メンバの型が明記されています。
すべての型を知識として身に付ける必要はなく、調べれば済む問題だったりします。

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

返信ありがとうございます。
また、返事が遅くなりまして申し訳ありません。

いろいろと試してみたのですが、まだ正しく取得できない状況です。

まず、結果が0の場合に出るメッセージであることがわかりましたので、
SQL文が誤っていないかを確認することにしました。
SQL プロファイラでトレースをかけた状態で、該当のコマンドボタンを押して、以下のコマンドが実行されていることを確認しました。
exec sp_executesql N'select tanto, LastModefy from Logs where ID=@ID', N'@ID varchar(15)', @ID = 'A0000011111'
で、これをクエリアナライザにコピーして実行し、結果を得られることを確認しました。(0件ではありませんでした)

となると、結果からテキストボックスへ表示の段階で、失敗していると思われます。

ここまで確認できたのですが、以下のコードで、結果が0件となってしまう原因と対処策が不明です。

問題は、この部分の指定方法かな?と思うのですが・・。
あとは、Reader がちゃんと情報を受け取れていない?
tanto.text = reader("tanto")
Modefy.text = reader("Lastmodefy")

度々申し訳ありませんが、何かヒントがあれば、と思います。
よろしくお願いします。

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

dim conn as new sqlconnection()
conn.connectionstring = "data source=localhost;Initial Catalog=test;Trusted_Connection=False;User ID=sa;Password=PASSWORD"

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("tanto")
Modefy.text = reader("Lastmodefy")

conn.close()



Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2006-07-14 13:21
コード:
conn.open() 
reader = cmd_search.ExecuteReader() 
reader.Read() ' <-これ入れてみたら?
tanto.text = reader("tanto") 
Modefy.text = reader("Lastmodefy") 

conn.close() 

なり
常連さん
会議室デビュー日: 2006/06/19
投稿数: 32
投稿日時: 2006-07-14 13:27
kazukiさん

ありがとうございます!
解決しました。
なるほど・・・Readを行わないといけなかったのですね。。
(今作っているのがひと段落したら、プログラミングを1から勉強したいと思います・・・。)

Sub cmd_Search_Click(sender As Object, e As EventArgs)

dim conn as new sqlconnection()
conn.connectionstring = "data source=localhost;Initial Catalog=test;Trusted_Connection=False;User ID=sa;Password=PASSWORD"

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()
reader.Read()
tanto.text = reader("tanto")
Modefy.text = reader("Lastmodefy")

conn.close()
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-07-14 13:46
引用:

nariさんの書き込み (2006-07-14 13:27) より:
なるほど・・・Readを行わないといけなかったのですね。。


↓すでに書かれている内容だし。

引用:

じゃんぬねっとさんの書き込み (2006-07-12 11:33) より:
例外のメッセージどおりではないのでしょうか?
Read メソッドを呼び出していますか?
Read メソッドの戻り値が true の時に、SqlDataReader.Get~ メソッドを実行していますか?


きちんと教えられたことくらいやろうぜ。な!

追記:
>tanto.text = reader("tanto")
>Modefy.text = reader("Lastmodefy")
これちょっと見直そうぜ。な!

[ メッセージ編集済み 編集者: ぶさいくろう 編集日時 2006-07-14 13:49 ]
Yam
大ベテラン
会議室デビュー日: 2003/09/13
投稿数: 179
お住まい・勤務地: だんじり祭りの地
投稿日時: 2006-07-14 13:58
引用:

nariさんの書き込み (2006-07-14 13:27) より:
(今作っているのがひと段落したら、プログラミングを1から勉強したいと思います・・・。)


(´ー`).oO(今作ってるプログラムはどうなるんだろう?)
なり
常連さん
会議室デビュー日: 2006/06/19
投稿数: 32
投稿日時: 2006-07-14 16:55
皆様のご指摘の通りですね。。
(すみません。Readメソッドを呼び出す、という記述で、理解できなかったので、そのまま右から左に行ってしまいました。。。)

Modefy・・については、実は実際にはこういうフィールドは無いので、
無視したいと思います。

今回のプログラムは、あと1つくらいの問題が解消できれば、一応は動作しそうなので、自分のチームでのみ使うものなので、動けばいいかな・・と。
もう少し、勉強していきます。

あきれ返るほど理解が不足していると思いますが、見捨てずにアドバイスいただきました皆様、ありがとうございました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-14 17:23
引用:

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

Readメソッドを呼び出す、という記述で、理解できなかったので、そのまま右から左に行ってしまいました。。。


その記述の部分を、もう 1 度見て頂けますか?
Read メソッドの 「戻り値」 についても書かせて頂いたハズですが、
現在の実装だと、戻り値を見ていないように思います。

引用:

Modefy・・については、実は実際にはこういうフィールドは無いので、無視したいと思います。


前後の内容から察するに 'Modify' の間違いかと思い、要らぬ指摘をしてしまいました。
ご気分を悪くされたのであれば、申し訳ありません。(*_ _)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

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