C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: ExecuteReader()について


(過去ログ 53 を表示中)

[トピック内 19 記事 (1 - 19 表示)]  << 0 >>

■30008 / inTopicNo.1)  ExecuteReader()について
  
□投稿者/ 彩 (1回)-(2008/12/17(Wed) 13:56:40)

分類:[VB.NET/VB2005 以降] 

こんにちは、彩といいます。

開発環境 WindowsXP
使用言語 Microsoft Visual Studio 2005 Visual Basic

デバック開始時の警告を解決できないで困っています。
何かちょっとしたことで止まっている気がして、ヒントみたいなことでも教えていただけるとうれしいです。


vbプログラム

Dim ConnectionString As String = "DSN=SAMPLE"
Dim conn As New System.Data.Odbc.OdbcConnection(ConnectionString)
SQL = "SELECT * FROM table_01 where id = '" + Me.id.Text + "'"

Dim query As New System.Data.Odbc.OdbcCommand(SQL, conn)

reader = query.ExecuteReader()

While (reader.Read())

Me.district.SelectedIndex = reader.Item("district") '1
Me.prefectures.Text = reader.Item("prefectures") '2

End While

データベース、テーブル内容

+-----+----------+-------------+
| id| district | prefectures |
+-----+----------+-------------+
| 1| 関東| 東京都|
+-----+----------+-------------+

警告内容

2のところでIndexOutOfRangeExceptionはハンドルされませんでした。
prefectures

警告される。

イミディエイト ウィンドウ

'System.IndexOutOfRangeException' の初回例外が System.Data.dll で発生しました。



1、2を入れ替えると警告は発生しない。
1の後にreader.Itemを使うとどのカラム内容でも同じような警告が表示される。

この警告を解決する方法を教えていただきたいです。

よろしくお願いします。

引用返信 編集キー/
■30012 / inTopicNo.2)  Re[1]: ExecuteReader()について
□投稿者/ カドルドエグ (63回)-(2008/12/17(Wed) 14:49:44)
No30008 (彩 さん) に返信
> 2のところでIndexOutOfRangeExceptionはハンドルされませんでした。
> prefectures

> イミディエイト ウィンドウ
>
> 'System.IndexOutOfRangeException' の初回例外が System.Data.dll で発生しました。

この警告、というかエラーの詳細がこちらにあるのですが、

MSDN:例外のトラブルシューティング : System.IndexOutOfRangeException
http://msdn.microsoft.com/ja-jp/library/3zwz4dx3(VS.80).aspx

そこにある例外の意味を見て、何か思い当たることがあれば………
引用返信 編集キー/
■30015 / inTopicNo.3)  Re[1]: ExecuteReader()について
□投稿者/ たくボン (108回)-(2008/12/17(Wed) 14:52:35)
2008/12/17(Wed) 14:53:40 編集(投稿者)

No30008 (彩 さん) に返信
> reader = query.ExecuteReader()
その前に、readerって宣言してる?
引用返信 編集キー/
■30016 / inTopicNo.4)  Re[2]: ExecuteReader()について
□投稿者/ すがり (14回)-(2008/12/17(Wed) 14:55:53)
Me.district.SelectedIndex = reader.Item("district") '1
Me.prefectures.Text = reader.Item("prefectures") '2

ータベース、テーブル内容

+-----+----------+-------------+
| id| district | prefectures |
+-----+----------+-------------+
| 1| 関東| 東京都|
+-----+----------+-------------+

どうでもいいですけど、SelectedIndexに「関東」って設定するんですか?
引用返信 編集キー/
■30017 / inTopicNo.5)  Re[2]: ExecuteReader()について
□投稿者/ 彩 (2回)-(2008/12/17(Wed) 14:57:21)
No30015 (たくボン さん) に返信
> 2008/12/17(Wed) 14:53:40 編集(投稿者)
>
> ■No30008 (彩 さん) に返信
>>reader = query.ExecuteReader()
> その前に、readerって宣言してる?

ありがとうございます。

上記に書き忘れていました

Dim reader As Odbc.OdbcDataReader

と宣言しています。すみません。
引用返信 編集キー/
■30019 / inTopicNo.6)  Re[3]: ExecuteReader()について
□投稿者/ 彩 (3回)-(2008/12/17(Wed) 15:03:22)
No30016 (すがり さん) に返信
> Me.district.SelectedIndex = reader.Item("district") '1
> Me.prefectures.Text = reader.Item("prefectures") '2
>
> ータベース、テーブル内容
>
> +-----+----------+-------------+
> | id| district | prefectures |
> +-----+----------+-------------+
> | 1| 関東| 東京都|
> +-----+----------+-------------+
>
> どうでもいいですけど、SelectedIndexに「関東」って設定するんですか?

本当はdistrictという名前のコンボボックスのコレクションにある「関東」を初期表示?させようとしているのですが
まずはコレクション内のものではなくデータベースから検索した値を表示しようかと思って上記のように書きました。
その場合

Me.district.Text = reader.Item("district")が正しい書き方なのでしょうか?
こうした場合でも同じ警告が表示されてしまいます。



引用返信 編集キー/
■30022 / inTopicNo.7)  Re[2]: ExecuteReader()について
□投稿者/ 彩 (4回)-(2008/12/17(Wed) 15:12:40)
No30012 (カドルドエグ さん) に返信
> ■No30008 (彩 さん) に返信
>>2のところでIndexOutOfRangeExceptionはハンドルされませんでした。
>>prefectures
>
>>イミディエイト ウィンドウ
>>
>>'System.IndexOutOfRangeException' の初回例外が System.Data.dll で発生しました。
>
> この警告、というかエラーの詳細がこちらにあるのですが、
>
> MSDN:例外のトラブルシューティング : System.IndexOutOfRangeException
> http://msdn.microsoft.com/ja-jp/library/3zwz4dx3(VS.80).aspx
>
> そこにある例外の意味を見て、何か思い当たることがあれば………


ありがとうございます。

そのトラブルシューティングも質問をする前に参照してみたんですが。

データベースのテーブルにはprefecturesというカラムは存在しているので列名の間違いではないのは確認しています。

Me.district.SelectedIndex = reader.Item("district") '1
Me.prefectures.Text = reader.Item("prefectures") '2

なぜ1と2を入れ替えると解決してしまうのかがわからなくて、、1の記述に問題があるのかなとは思っているんですが
解決につながるものがみつからなくて
引用返信 編集キー/
■30024 / inTopicNo.8)  Re[3]: ExecuteReader()について
□投稿者/ すがり (15回)-(2008/12/17(Wed) 15:16:03)
↑でもいわれていますけど、警告ではなくエラーですよ。

SelectedIndexに「関東」設定しても当然エラーになりますよ。数値に文字列入れるんですから・・・
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.combobox.selectedindex(VS.80).aspx

引用返信 編集キー/
■30025 / inTopicNo.9)  Re[4]: ExecuteReader()について
□投稿者/ たくボン (109回)-(2008/12/17(Wed) 15:16:30)
2008/12/17(Wed) 15:19:43 編集(投稿者)

No30019 (彩 さん) に返信
> ■No30016 (すがり さん) に返信
> 本当はdistrictという名前のコンボボックスのコレクションにある「関東」を初期表示?させようとしているのですが
> まずはコレクション内のものではなくデータベースから検索した値を表示しようかと思って上記のように書きました。

まず確認することは、
1.connのOpen()はしてるのか?
2.DSN, SQL文は正しいか?
3.reader.Item("district")のような列名ではなく、reader.Item(0)のような添字でも同様のIndexOutOfRangeExceptionが発生するか?

ここらを調べれば解決すると思うので頑張ってください。
引用返信 編集キー/
■30026 / inTopicNo.10)  Re[4]: ExecuteReader()について
□投稿者/ たくボン (110回)-(2008/12/17(Wed) 15:21:14)
No30024 (すがり さん) に返信
> ↑でもいわれていますけど、警告ではなくエラーですよ。
>
> SelectedIndexに「関東」設定しても当然エラーになりますよ。数値に文字列入れるんですから・・・
> http://msdn.microsoft.com/ja-jp/library/system.windows.forms.combobox.selectedindex(VS.80).aspx

ごめんなさい。

Me.district.SelectedIndex

こっちのIndexOutOfRangeExceptionの方かwww
すっかり勘違いしてました(笑)
引用返信 編集キー/
■30029 / inTopicNo.11)  Re[5]: ExecuteReader()について
□投稿者/ 彩 (5回)-(2008/12/17(Wed) 15:32:00)
No30025 (たくボン さん) に返信
> 2008/12/17(Wed) 15:19:43 編集(投稿者)

> まず確認することは、
> 1.connのOpen()はしてるのか?

はい、conn.Open()と記述しています。書き忘れていました。すみません。

> 2.DSN, SQL文は正しいか?

はい、DSNは正しいです、他のテーブルを検索するSQLを実行したときエラーは発生しませんでした。
SQL文はreader.Read()を実行する前にテキストボックスにSQL文を表示させてそれをコピーしてプロンプト上で実行すると望んだデータの検索は出来ました。

> 3.reader.Item("district")のような列名ではなく、reader.Item(0)のような添字でも同様のIndexOutOfRangeExceptionが発生するか?

reader.Item(0)とすると
InvalidOperationExceptionが発生し、行および列にデータが存在しません。と表示されます。
SQL文が正しければ発生しないエラーだと思うのですが、SQL文は正しいのでなぜエラーなのか探しています。
引用返信 編集キー/
■30035 / inTopicNo.12)  Re[5]: ExecuteReader()について
□投稿者/ 彩 (6回)-(2008/12/17(Wed) 15:54:35)
No30026 (たくボン さん) に返信
> ■No30024 (すがり さん) に返信
>>↑でもいわれていますけど、警告ではなくエラーですよ。
>>
>>SelectedIndexに「関東」設定しても当然エラーになりますよ。数値に文字列入れるんですから・・・
>>http://msdn.microsoft.com/ja-jp/library/system.windows.forms.combobox.selectedindex(VS.80).aspx
>
> ごめんなさい。
>
> Me.district.SelectedIndex
>
> こっちのIndexOutOfRangeExceptionの方かwww
> すっかり勘違いしてました(笑)

すみません、変更しました。

テーブル

+-----+----------+-------------+
| id| district | prefectures |
+-----+----------+-------------+
| 1| 0| 東京都|
+-----+----------+-------------+

districtのItems
Me.district.Items(0) = 関東

Me.district.SelectedIndex = reader.Item("district") '1

とすると「関東」が初期選択されているようにしましたが、同じエラーが発生してしまいます。
引用返信 編集キー/
■30036 / inTopicNo.13)  Re[4]: ExecuteReader()について
□投稿者/ カドルドエグ (64回)-(2008/12/17(Wed) 15:58:00)
No30019 (彩 さん) に返信
> 本当はdistrictという名前のコンボボックスのコレクションにある「関東」を初期表示?させようとしているのですが
> まずはコレクション内のものではなくデータベースから検索した値を表示しようかと思って上記のように書きました。

コンボボックスの中身と表示用が違う場合の設定方法の1つにこんな感じのがあります。

※フォームにはコンボボックスとテキストボックスのみ

Public Class Form1

    Private table As DataTable = New DataTable

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'テストなので型無し:実際はDBから持ってきたテーブル(データ)
        GetData()

        Me.ComboBox1.DataSource = table
        Me.ComboBox1.ValueMember = "中身用"
        Me.ComboBox1.DisplayMember = "表示用"

        '初期表示の設定
        Me.ComboBox1.SelectedIndex = 1
    End Sub

    Private Sub GetData()
        table.Columns.Add("表示用")
        table.Columns.Add("中身用")

        table.Rows.Add("東北", "01")
        table.Rows.Add("関東", "02")
        table.Rows.Add("近畿", "03")
    End Sub

    '中身の確認用
    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged

        If Me.ComboBox1.SelectedIndex > -1 Then
            Me.TextBox1.Text = Me.ComboBox1.SelectedValue.ToString()
        End If

    End Sub
End Class

引用返信 編集キー/
■30042 / inTopicNo.14)  Re[6]: ExecuteReader()について
□投稿者/ たくボン (112回)-(2008/12/17(Wed) 16:38:16)
No30029 (彩 さん) に返信
> reader.Item(0)とすると
> InvalidOperationExceptionが発生し、行および列にデータが存在しません。と表示されます。
> SQL文が正しければ発生しないエラーだと思うのですが、SQL文は正しいのでなぜエラーなのか探しています。

これはデータが取得できていない可能性がありますね。
DataAdapterを使ってCount調べてみるのが速いかも。
ちなみに、DBは何でしょうか?
引用返信 編集キー/
■30050 / inTopicNo.15)  Re[7]: ExecuteReader()について
□投稿者/ 彩 (7回)-(2008/12/17(Wed) 16:51:15)
No30042 (たくボン さん) に返信
> ■No30029 (彩 さん) に返信
>>reader.Item(0)とすると
>>InvalidOperationExceptionが発生し、行および列にデータが存在しません。と表示されます。
>>SQL文が正しければ発生しないエラーだと思うのですが、SQL文は正しいのでなぜエラーなのか探しています。
>
> ちなみに、DBは何でしょうか?

データベースはMySQLです。

> DataAdapterを使ってCount調べてみるのが速いかも。

DataAdapterを使ったことがなく、やり方を探してCountを調べてみます。

ありがとうございます。

ExecuteNonQueryで影響を受けた行数を調べるのとは違うのでしょうか?

引用返信 編集キー/
■30054 / inTopicNo.16)  Re[5]: ExecuteReader()について
□投稿者/ 彩 (8回)-(2008/12/17(Wed) 16:57:40)
No30036 (カドルドエグ さん) に返信
> ■No30019 (彩 さん) に返信
>>本当はdistrictという名前のコンボボックスのコレクションにある「関東」を初期表示?させようとしているのですが
>>まずはコレクション内のものではなくデータベースから検索した値を表示しようかと思って上記のように書きました。
>
> コンボボックスの中身と表示用が違う場合の設定方法の1つにこんな感じのがあります。
>

わざわざサンプルをありがとうございます、今後の参考に使いたいと思います。
実際にやってみるととても便利そうに感じました。

コンボボックスの、ValueMember、DisplayMember
の存在はわかっていたんですが、使ったことがなく、使い方を教えていただいてありがとうございます。
引用返信 編集キー/
■30069 / inTopicNo.17)  Re[8]: ExecuteReader()について
□投稿者/ たくボン (113回)-(2008/12/17(Wed) 17:45:48)
No30050 (彩 さん) に返信
> データベースはMySQLです。
うーん、今手元にある環境でテストしてみたんですけど、こちらでは正常に取得できます。
MySQL : 5.0.67-community-nt
ODBC Driver : MySQL ODBC 3.51 Driver

MySQLの文字セットと照合順序とかの設定は何にされていますか?
あとこれはないと思いますが、idはシングルクォートで囲んでいるので文字列ですよね?
そこら辺を知りたいので、一度WHERE句を外したSQLを投げてデータが取得できるか試してみては?

> ExecuteNonQueryで影響を受けた行数を調べるのとは違うのでしょうか?
ExecuteNonQueryとは違います。ExecuteNonQueryは結果セットを返却しない、 ExecuteQueryは前方向の結果セットを返却する呼び出しです。

引用返信 編集キー/
■30072 / inTopicNo.18)  Re[9]: ExecuteReader()について
□投稿者/ 彩 (9回)-(2008/12/17(Wed) 18:18:48)
No30069 (たくボン さん) に返信
> ■No30050 (彩 さん) に返信
>>データベースはMySQLです。
> うーん、今手元にある環境でテストしてみたんですけど、こちらでは正常に取得できます。
> MySQL : 5.0.67-community-nt
> ODBC Driver : MySQL ODBC 3.51 Driver
>
> MySQLの文字セットと照合順序とかの設定は何にされていますか?

show table status from SAMPLEで調べたテーブルの
Collationは「ujis_japanese_ci」でした、これのことでしょうか、、調べ方がちょっとわかっていません。

> あとこれはないと思いますが、idはシングルクォートで囲んでいるので文字列ですよね?

シングルクォートで囲っているんですがint型です、
紛らわしい記述をしていまいすみません。

> そこら辺を知りたいので、一度WHERE句を外したSQLを投げてデータが取得できるか試してみては?
>

> ExecuteNonQueryとは違います。ExecuteNonQueryは結果セットを返却しない、 ExecuteQueryは前方向の結果セットを返却する呼び出しです。
>

ここはちょっと読んで理解できていないので勉強します。

解決には至っていないんですが、データを取得していないことだと思います。

Me.district.SelectedIndex = reader.Item("district")
を設定したあとにこのコンボボックスの値が変更されたら
データベースから値を取り直す機能が動いているのかもしれないのでそれが原因な気がしています。
変更されたらが画面上で操作だけじゃないことを見落としていました。
私が記述した内容では気がつかないことでした、情報不足ですみません。

いろんな解決への方法を教えていただきありがとうございます。
今後参考にします。
原因がわかったのであとは自分でやってみます。ありがとうございました。解決済みにしておきます。
引用返信 編集キー/
■30074 / inTopicNo.19)  Re[6]: ExecuteReader()について
□投稿者/ 彩 (10回)-(2008/12/17(Wed) 18:20:12)
解決済みにします。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -