QA@IT
«質問へ戻る

質問を投稿

SQLserverから取得した値を配列に格納し、関数の戻り値にしたいです。

※Visual Studio 2013、SQL server 2012を使用。OSはWindows7です。

はじめてこちらを利用します。プログラミング初級者です。
記述不足等ありましたら申し訳ありません、ご指摘ください。
以下のようなテーブルから取得した値を関数側で配列に格納し、その配列を戻り値として返したいです。

tbl_valueTest.JPG

取得する値はvalueA から valueFまでの数値のみ(該当フィールドのデータ型はいずれもdecimal(3,2))で、
ソース上は確認用にラベルコントロールに値を表示させるよう記述していますが、
本来メイン部分では別の値との相関係数算出に使用するつもりです。

以下、書籍やネット上の情報を参考に見よう見まねで記述したソースコードです。

※実行結果はいずれも 0 と表示されていたため、
Catch ex As Exception 部分の内容を確認すると、
「型 'System.Decimal' のオブジェクトを型 'System.String' にキャストできません」
と表示されていました。

テーブルのデータ型の問題なんでしょうか。

また、関数定義と呼び出し、また取得した値を配列に読み込む処理の記述について不安があるため、
誤りほかご指摘いただきたいです。
どうぞよろしくお願いします。


Imports System.Data.SqlClient

Partial Class Value_get
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load

        'SQLserverから値を取得する関数呼び出し
        Dim values() As Double = Getvalues()

        valueA_Lbl.Text = values(0)
        valueB_Lbl.Text = values(1)
        valueC_Lbl.Text = values(2)
        valueD_Lbl.Text = values(3)
        valueE_Lbl.Text = values(4)
        valueF_Lbl.Text = values(5)

    End Sub

    'データベースから値を取得する関数
    Private Function Getvalues() As Double()

        Dim result(5) As Double

        Dim cnStr As String = System.Configuration.ConfigurationManager.
            ConnectionStrings("○○○○○○ConnectionString").ConnectionString

        Using connection As New SqlConnection(cnStr)

            Dim SQL As String
'特定の「FacilityID」の日付が最新のレコードを取得したいです(改善部分)
            SQL = "SELECT valueA, valueB, valueC, valueD, valueE, valueF" &
                 " from tbl_valueTest as A" &
                 " WHERE Exists(SELECT * from tbl_valueTest" &
                 " group by FacilityID" &
                 " having FacilityID = A.FacilityID and MAX(date) = A.date)" &
                 " and FacilityID = 1"

            Dim command As New SqlCommand(SQL, connection)

            Try
                connection.Open()
                Dim dr As SqlDataReader = command.ExecuteReader()

---値を配列に読み込む
                Dim Count As Integer = 0
                Dim valuelist(5) As Double
                While (dr.Read())
                    valuelist(Count) = dr.GetString(Count)
                    Count = Count + 1
                End While

                result = valuelist
---
                connection.Close()

            Catch ex As Exception

            End Try

        End Using

        Return result

    End Function
End Class

※Visual Studio 2013、SQL server 2012を使用。OSはWindows7です。

はじめてこちらを利用します。プログラミング初級者です。
記述不足等ありましたら申し訳ありません、ご指摘ください。
以下のようなテーブルから取得した値を関数側で配列に格納し、その配列を戻り値として返したいです。

![tbl_valueTest.JPG](https://qa-atmarkit-image.s3.amazonaws.com/uploads/attached_image/image/209/tbl_valueTest.JPG)

取得する値はvalueA から valueFまでの数値のみ(該当フィールドのデータ型はいずれもdecimal(3,2))で、
ソース上は確認用にラベルコントロールに値を表示させるよう記述していますが、
本来メイン部分では別の値との相関係数算出に使用するつもりです。


以下、書籍やネット上の情報を参考に見よう見まねで記述したソースコードです。

※実行結果はいずれも 0 と表示されていたため、
Catch ex As Exception 部分の内容を確認すると、
「型 'System.Decimal' のオブジェクトを型 'System.String' にキャストできません」
と表示されていました。

テーブルのデータ型の問題なんでしょうか。

また、関数定義と呼び出し、また取得した値を配列に読み込む処理の記述について不安があるため、
誤りほかご指摘いただきたいです。
どうぞよろしくお願いします。

```ここに言語を入力

Imports System.Data.SqlClient

Partial Class Value_get
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load

        'SQLserverから値を取得する関数呼び出し
        Dim values() As Double = Getvalues()

        valueA_Lbl.Text = values(0)
        valueB_Lbl.Text = values(1)
        valueC_Lbl.Text = values(2)
        valueD_Lbl.Text = values(3)
        valueE_Lbl.Text = values(4)
        valueF_Lbl.Text = values(5)

    End Sub

    'データベースから値を取得する関数
    Private Function Getvalues() As Double()

        Dim result(5) As Double

        Dim cnStr As String = System.Configuration.ConfigurationManager.
            ConnectionStrings("○○○○○○ConnectionString").ConnectionString

        Using connection As New SqlConnection(cnStr)

            Dim SQL As String
'特定の「FacilityID」の日付が最新のレコードを取得したいです(改善部分)
            SQL = "SELECT valueA, valueB, valueC, valueD, valueE, valueF" &
                 " from tbl_valueTest as A" &
                 " WHERE Exists(SELECT * from tbl_valueTest" &
                 " group by FacilityID" &
                 " having FacilityID = A.FacilityID and MAX(date) = A.date)" &
                 " and FacilityID = 1"

            Dim command As New SqlCommand(SQL, connection)

            Try
                connection.Open()
                Dim dr As SqlDataReader = command.ExecuteReader()

---値を配列に読み込む
                Dim Count As Integer = 0
                Dim valuelist(5) As Double
                While (dr.Read())
                    valuelist(Count) = dr.GetString(Count)
                    Count = Count + 1
                End While

                result = valuelist
---
                connection.Close()

            Catch ex As Exception

            End Try

        End Using

        Return result

    End Function
End Class

```