- PR -

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

投稿者投稿内容
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-07-14 17:50
こんにちは。

まず最初に誤っておきます。たぶん余計なお世話かもしれません。申し訳ない。

引用:

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

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


ここで「理解できない」→「右から左へ」になってしまうと、せっかくじゃんぬねっとさんが示
してくれたチャンスを見逃していることになってしまいます。
どこがチャンスなのかも不明だったということもあるかと思いますが。
理解できないことは検索して調べてみるとか、そのままじゃんぬさんに聞いてみるとか(あ
まりにオウム返しだと嫌われるかもしれませんが)方法はありますから、次はもう少しがん
ばってみてください。

引用:

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


「実際にはこういうフィールドは無い」のを知っているのは nari さんだけですよね。
我々はそういった事情はわからないので「 Modefy ってなんだよ、Modify じゃねーの?
それに tanto ってローマ字と間違った英単語チャンポンかよ、見直そうぜ。な!」という
感じでぶさいくろうさんが老婆心ながら指摘してくださったのだと思います。いや、セリフの
前半部分は私の妄想ですが。

今回のプログラムが動くようになってからでも結構ですので、ご自分でも理解されているよ
うに少しずつでも勉強していくのがよろしいかと思います。
がんばってください。

# ただ、自分のチームで「チーム内だけだから動けばいい」と言う人間がいたらちょっと考
# えてしまいそうです
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
なり
常連さん
会議室デビュー日: 2006/06/19
投稿数: 32
投稿日時: 2006-07-25 16:09
お久しぶりです。nariです。

先日教えていただいたことを復習のつもりで、
以下のようなコードを書いてみましたところ、
意図しない動作になってしまい、困惑しています。

どこか、理解に不足があるのかと思い、スレッドを見直してみたのですが、
問題なさそうなのです。。

少々アドバイス頂けますと幸いです。
#ちなみに、サンプルプログラムです。

■環境
Windows Server 2003 + VB.NET (VS2005 Web Exp)←WebMatrixから移行しました。
SQL Server 2000 SP4a

■DB
ID:Char(10)
title:char(10)
Registration_day:datetime
person:char(10)

Registration_day と person は Null を許容しています。

■想定した動作
(DBの登録されたデータが Null でなければ、) HTML上の対応するテキストボックスに結果が表示される。
()内は、まだ解消できていませんが、その点は別スレッドで質問します。

■実際の動作
「読み取りに失敗しました」が表示される。

■試行錯誤の結果
以下のIf文で、False に流されているようなので、この If 文のセットを削除したところ、上記の、「想定した動作」をしました。
If rdr_srch.Read = True Then

SQLのプロファイラで見ると、ちゃんとアクセスしているようです。

どこか、指定方法がおかしいなど、ありますでしょうか。

よろしくお願いします。
====コード====
Sub search_Click(ByVal sender As Object, ByVal e As System.EventArgs)
If Len(ID.Text) = 0 Then
title.Text = "IDを入力してください"
Else
Dim cn_srch As New SqlConnection()
cn_srch.ConnectionString = "data source=localhost;Initial Catalog=logs;Trusted_Connection=False;User ID=sa;Password=password"
Dim cmd_srch As New SqlCommand()
cmd_srch.CommandText = "select title,person,Registration_day from test2 where ID=@ID"
cmd_srch.Connection = cn_srch
Dim ID2 As SqlParameter = cmd_srch.Parameters.Add("@ID", System.Data.SqlDbType.VarChar, 10)
ID2.Value = ID.Text

cn_srch.Open()
Dim rdr_srch As SqlDataReader = cmd_srch.ExecuteReader
rdr_srch.Read()
If rdr_srch.Read = True Then
If rdr_srch.HasRows = True Then

title.Text = rdr_srch("title")
If IsDBNull(rdr_srch("person").value) Then
person.Text = ""
End If
person.Text = rdr_srch("person")
If IsDBNull(rdr_srch("Registration_day").value) Then
Registration_day.Text = ""
Else
Registration_day.Text = rdr_srch("Registration_day")
End If
Else
title.Text = "データがありません"
End If

End If
title.Text = "読み取りに失敗しました"
rdr_srch.Close()
cn_srch.Close()
End If

End Sub
でっち6号
大ベテラン
会議室デビュー日: 2005/01/31
投稿数: 176
お住まい・勤務地: Kawasaki
投稿日時: 2006-07-25 18:37
こんにちは、でっちです。

引用:

以下のIf文で、False に流されているようなので、この If 文のセットを削除したところ、上記の、「想定した動作」をしました。
If rdr_srch.Read = True Then


えーと、なんでそっちを消しちゃうんでしょう。
1つ消したらOKになったことからも、明らかにReadメソッドを2回呼んでるのが原因だと思われますが?

引用:

rdr_srch.Read()
If rdr_srch.Read = True Then


最初のReadメソッドで1レコード目に進むので、Ifの中では2レコード目に進んでしまいますよ。
先に書いてあるrdr_srch.Read()を消せば、「想定した動作」になります。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-25 19:12
前レスで、「戻り値を見るように」 と書かせて頂きましたが、言葉足らずだったかもしれませんね。

しかしながら、当たり前ですが、戻り値を受け取ろうと受けとらなかろうと、
呼び出しているメソッドは同じなのですから、動作は変わりようがありません。

2 回呼ぶというのが例外の (というより、例外が起こらなくとも動作がおかしくなる) 原因だったわけですが、
これは、リファレンスを読んで 何をするメソッド なのかを理解していれば、防げたことだと思います。

  SqlDataReader.Read メソッド

# コード例もあります。

なぜ、2 回呼び出すと想定していた動作と食い違ってくるのか、理解できるかと思います。

このように、理解 (学習) できる機会を棒に振るのは勿体無いと思いますよ。
ぽぴ王子さんと被ってしまう言い方ですが、もう少しがんばってみてください。

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

ご指導ありがとうございます。
確かに、Readを2度呼んでいることが問題だということが分かりました!
なぜか、
rdr_srch.read()
で呼んでから、
if rdr_srch.read = true
と、確認するものだと思い込んでいました。。

確かにクラスライブラリ確認すると、次のレコードを呼び出します、て記載あるじゃん。。。それじゃ、False返りますね・・。

クラスライブラリは勉強中ですが、
いまだ、どこに何があるのかきちんと理解できているとはいい難いみたいです。

#(せっかく動作確認しようと思ったら、開発環境壊れました・・・。マシンが立ち上がらない上に、VM Serverなので・・・データの取り出しができるかどうか・・・(T_T))

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