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

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

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

Re[2]: SQLサーバーのテーブルデータから配列変数への代入


(過去ログ 139 を表示中)

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

■81681 / inTopicNo.1)  SQLサーバーのテーブルデータから配列変数への代入
  
□投稿者/ あさ (5回)-(2016/10/27(Thu) 15:53:22)

分類:[.NET 全般] 

お世話になります。
Windows10、ASP.NET(VB)2015で開発しています。


SQLServer2014に[部屋マスタ]というテーブルがあります。
フィールド構成は以下の通りです。
[ID]:オートナンバー
[部屋No]:文字列型


例えば、[部屋マスタ]には以下のようなデータが入っているとします。
[ID]/[部屋No]
1/A
2/B
3/C
4/D


ボタン(btnTest)を押すと、このデータを取得し、
配列変数strHeyaNoに代入し、
ラベル(lblMessage)に「ABCD」と表示させるようにしたいと思います。


レコード数は4とは限らず、いくつであっても対応出来るプログラムにしたいと思います。
そこで、以下のようなコードを書きました。


Protected Sub btnTest_Click(sender As Object, e As EventArgs) Handles btnTest.Click
Dim i As Integer
Dim n As Integer
Dim strHeyaNo(n) As String
Dim strcn As String
strcn = "(接続文字列)"
Using cn As New SqlConnection(strcn)
Dim da As SqlDataAdapter
Dim ds As DataSet
Dim dt As DataTable
Dim dr() As DataRow
Dim strSQL As String

Try
        'データ取得
strSQL = "select [部屋No] from [部屋マスタ] ORDER BY [ID]"
da = New SqlDataAdapter(strSQL, cn)
ds = New DataSet
da.Fill(ds, "部屋マスタ")
dt = ds.Tables("部屋マスタ")
dr = dt.Select
        
        '変数にデータを代入
If dt.Rows.Count <> 0 Then
n = dt.Rows.Count - 1
For i = 0 To n
strHeyaNo(i) = CStr(dr(i)("部屋No"))……※
Next
End If
        
        '表示
i = 0
For i = 0 To n
lblMessage.Text = lblMessage.Text & strHeyaNo(i)
Next
Catch ex As Exception
      (省略)
Finally
      (省略)
End Try
End Using
End Sub


このコードを実行しますと、
i = 1になった時の※の行で、「インデックスが配列の境界外です」エラーが出ます。
strHeyaNo(1)が引っかかるようです。


部屋は「A、B、C、D」の4つで、dt.Rows.Count=4、n=3になっているのですが。


この原因が分かりません。
問題点がお分かりになる方がいらっしゃいましたら、
ご教示頂けたら幸いです。


どうぞよろしくお願い申し上げます。


引用返信 編集キー/
■81682 / inTopicNo.2)  Re[1]: SQLサーバーのテーブルデータから配列変数への代入
□投稿者/ shu (931回)-(2016/10/27(Thu) 16:25:02)
2016/10/27(Thu) 16:27:16 編集(投稿者)
No81681 (あさ さん) に返信

>         Dim strHeyaNo(n) As String
配列宣言をここで行ったときn=0なので
1個分しか領域が確保されずその後どこでも
配列を拡張していないからです。

>                 ds = New DataSet
>                 da.Fill(ds, "部屋マスタ")
>                 dt = ds.Tables("部屋マスタ")
dt = New DataTable()
da.Fill(dt, "部屋マスタ")

で十分です。


>                 dr = dt.Select
>         
>         '変数にデータを代入
>                 If dt.Rows.Count <> 0 Then
>                     n = dt.Rows.Count - 1
>                     For i = 0 To n
>                         strHeyaNo(i) = CStr(dr(i)("部屋No"))……※
>                     Next
>                 End If
>         
>         '表示
>                 i = 0
>                 For i = 0 To n
>                     lblMessage.Text = lblMessage.Text & strHeyaNo(i)
>                 Next
この処理なら
For Each row in dt.Select
    lblMessage.Text = lblMessage.Text & Cstr(row("部屋No"))
Next 
でよいです。
配列に取得データを移す意味がないです。
lblMessage.Text = lblMessage.Text & Cstr(row("部屋No"))
は一度文字列変数を使用して連結した後
結果をlblMessage.Textに設定した方がさらによいです。

引用返信 編集キー/
■81683 / inTopicNo.3)  Re[2]: SQLサーバーのテーブルデータから配列変数への代入
□投稿者/ あさ (6回)-(2016/10/27(Thu) 16:57:08)
No81682 (shu さん) に返信

ありがとうございます。

Dim strHeyaNo() As String

と宣言しておき、


If dt.Rows.Count <> 0 Then
  n = dt.Rows.Count - 1
  Redim strHeyaNo(n)


と、Redimを使って、出来ました。

For Each row〜、ですね。

とても助かりました。

ありがとうございました^^。




解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -