質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

3回答

9942閲覧

VB.NET 「インデックスが配列の境界外です」について

st_begin

総合スコア3

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2019/08/15 00:21

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
VB.NETで開発をしています。
デバッグ中に以下ソース箇所にてエラーが発生しました。

発生している問題・エラーメッセージ

System.IndexOutOfRangeException HResult=0x80131508 Message=インデックスが配列の境界外です。

該当のソースコード

VB.NET

Dim Month_Kizon As Integer = tblM.Select("Month = '" & txtTuki.Text & "'")(0)("INDEX")

試したこと

ググったところ以下の回答に辿り着きましたが、良く分かりません。
基礎的な構文はまだ理解出来ていません。配列は使っていない認識です。
以下内容が何なのか併せてご教示ください。
("Month = '" & txtTuki.Text & "'")(0)("INDEX")

__配列の添え字が、範囲内を超えた場合に発生します。
例えば、要素数が10個しかない配列で、11番目の要素を使おうとした場合などです。
配列を使っているつもりはなくても、クラスや関数の内部で配列を使用している場合には、
同じ例外が発生する可能性があります。

例外発生時に、スタックトレースを見ることができると思うので、
それを参考にすればどこが原因でエラーになったのか特定できると思います。__

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

tblM が DataTable で txtTuki が TextBox だったらの話です。
Select の動作については YAmaGNZ さんが説明してくださってますのでこうしたらいいのではという提案です。

VB

1Dim rows As DataRow() = tblM.Select("Month = '" & txtTuki.Text.Replace("'", "''") & "'") 2Dim Month_Kizon As Integer 3If rows.Length > 0 Then 4 Month_Kizon = CInt(rows(0)("INDEX")) 5Else 6 ' 見つからなかった時の処理 7End If

txtTuki.Text を Replace している理由は「SQLインジェクション」でググってみてください。

投稿2019/08/15 01:00

KOZ6.0

総合スコア2626

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2019/08/15 01:11

DataTable.Select()にSQLインジェクションの考慮要るんすか?初耳。
KOZ6.0

2019/08/15 01:16

そこまで大層なものでもないですが、「'」を入力されるとコケますし、WinForm なら入力を抑止できますが、WebForm だと加工しないとまずいです。
YAmaGNZ

2019/08/15 01:16

広い意味でのSQLインジェクションではなく、シングルクォートをエスケープしましょうということだと思いますよ。
gentaro

2019/08/15 01:19

あぁなるほど。「SQLインジェクションぽい何か」ということですね。
KOZ6.0

2019/08/15 01:38

まあ、こんなのが成り立っちゃうのでエスケープしておくに限ると思います。 Dim tblM As New DataTable tblM.Columns.Add("Month", GetType(String)) tblM.Columns.Add("Index", GetType(Integer)) tblM.Rows.Add("1", 0) tblM.Rows.Add("2", 1) tblM.Rows.Add("3", 2) tblM.Rows.Add("4", 3) Dim text As String = "' OR ''='" Dim rows As DataRow() = tblM.Select("Month = '" & text & "'")
st_begin

2019/08/15 07:46

回答遅くなりました。 KOZ6.0さんの想定通りの状況でした。BAにさせていただきます。 お二方にも感謝です、時間を割いていただき有難うございました。
guest

0

多分書き方から想像するとtblMはDataTableだと思いますのでそちらで回答します。

まずDataTable.SelectDataRowの配列を返します。
なので
tblM.Select("Month = '" & txtTuki.Text & "'")(0)
これは、Selectした結果の添え字0のものを取得しようとしています。
ここでSelectした結果、条件に一致するものが一件もない場合は空の配列が返ってきます。
ですので、添え字0のデータを取得しようとしてもIndexOutOfRangeExceptionとなります。

記載されているソースを分解して書くと以下のようになります。

VBNET

1Dim selectedRows As DataRow() = tblM.Select("Month = '" & txtTuki.Text & "'") 2Dim row As DataRow = selectedRows(0) 3Dim Month_Kizon As Integer = row("INDEX")

投稿2019/08/15 00:44

編集2019/08/15 00:49
YAmaGNZ

総合スコア10242

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

tblMが何のオブジェクトなのかわかりませんが、おそらくSelectメソッドは何らかのコレクションを返すメソッドなんでしょう。
で、コレクションの要素数が0だったら(つまりSelectメソッドの引数で指定した条件に合うオブジェクトがなかったら)、0番目の要素にアクセスしようとすると当然範囲外なのでそのエラーになります。

投稿2019/08/15 00:31

gentaro

総合スコア8949

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問