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

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

新規登録して質問してみよう
ただいま回答率
85.50%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

2回答

18433閲覧

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

taketake221

総合スコア17

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2016/08/31 10:10

編集2016/09/02 08:37

※Visual Studio 2013、SQL server 2012を使用。OSはWindows7です。
以下のようなテーブルから取得した値を関数側で配列に格納し、その配列を戻り値として返したいです。
取得する値はvalueA から valueFまでの数値のみ(フィールドのデータ型はdecimal(3,2))で、
ソース上は確認用にラベルコントロールに値を表示させるよう記述していますが、
本来メイン部分では別の値との相関係数算出に使用するつもりです。

テーブル構成 : tbl_valueTest

※いただいた回答のご指摘を反映させ、変数宣言でDouble型からDecimal型へ変更、ラベルコントロールへの表示処理にあたってString型への変換を行なって実行しましたが、
valueAのみ正しい結果が表示され、valueBからvalueFまでの値については依然 0 のままでした。

改善後実行結果

配列に読み込む部分で繰り返し処理に問題があるのかとも考えましたが、
初級者ゆえ解決策が思い浮かびません。

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

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 Decimal = Getvalues() valueA_Lbl.Text = values(0).ToString() valueB_Lbl.Text = values(1).ToString() valueC_Lbl.Text = values(2).ToString() valueD_Lbl.Text = values(3).ToString() valueE_Lbl.Text = values(4).ToString() valueF_Lbl.Text = values(5).ToString() End Sub 'データベースから値を取得する関数 Private Function Getvalues() As Decimal() 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 Decimal While (dr.Read()) valuelist(Count) = dr.GetDecimal(Count) Count = Count + 1 End While result = valuelist --- connection.Close() Catch ex As Exception End Try End Using Return result End Function End Class

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

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

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

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

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

guest

回答2

0

ベストアンサー

vb.net

1 Private Function Getvalues() As Double() 2'(略) 3 Dim valuelist(5) As Double 4 While (dr.Read()) 5 valuelist(Count) = dr.GetString(Count) 6 Count = Count + 1 7 End While

valuelistDouble配列なのにvaluelist(Count) = dr.GetString(Count)Stringを代入しようとしているので、型が一致せずエラーになっているのではないかと思います。

取得したい列のデータ型は「decimal (3,2)」

とのことなので、Decimal配列で受け取ったほうが良いかもしれません。
つまり

vb.net

1 Private Function Getvalues() As Decimal() 2'(略) 3 Dim valuelist(5) As Decimal 4 While (dr.Read()) 5 valuelist(Count) = dr.GetDecimal(Count) 6 Count = Count + 1 7 End While

こんな感じです。

それにあわせて

vb.net

1'SQLserverから値を取得する関数呼び出し 2Dim values() As Double = Getvalues() 3 4valueA_Lbl.Text = values(0) 5//(略)

これもDecimal配列で受け取るようにして、Label.Textにセットする際にDecimalからStringに変換します。

vb.net

1'SQLserverから値を取得する関数呼び出し 2Dim values() As Decimal = Getvalues() 3 4valueA_Lbl.Text = values(0).ToString() 5//(略)

投稿2016/09/02 07:46

alg

総合スコア2019

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

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

taketake221

2016/09/02 08:22

ご回答いただきありがとうございます。 とても丁寧で分かりやすいです。 ご指摘いただいたことを試してみますと、 valueAの値だけが適切に配列に格納されており(実行結果でも正しい結果が表示されていました)、valueB~valueFの値はまだ 0 となっていました。 よく分からないまま、ステップインを試してみましたが、 While (dr.Read()) valuelist(Count) = dr.GetDecimal(Count) Count = Count + 1 End While の部分に問題があるんでしょうか・・・?
alg

2016/09/02 08:38

ああ、なるほど。 たしかにそのままだとだめですね。 While (dr.Read()) For i As Integer = 0 To 5 valuelist(i) = dr.GetDecimal(i) Next i Count = Count + 1 End While こんなでどうでしょう?
taketake221

2016/09/02 08:53

迅速な返信をありがとうございます。 While (dr.Read()) For count As Integer = 0 To 5 valuelist(count) = dr.GetDecimal(count) Next count End While で実行して正しい結果が得られました! ありがとうございます!
guest

0

例外が発生してCatchで何も処理されず初期化された配列をそのまま返却している状態と思われます。
ステップ実行するなどして Catch した ex の内容を確認してください。

なおソースを見る限りSQL文を複数行に分けて文字列を結合して作成していますが、
結合時に改行もスペースも入れていないため無効なSQL文になっているように見受けられます。

投稿2016/08/31 11:10

nakit

総合スコア410

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

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

taketake221

2016/09/02 03:47

ご回答いただきありがとうございます。 返信が遅れてしまって申し訳ありません。 SQL文について改善した後、ステップ実行で確認を行なったところ、 Catch ex As Exception の部分で、 「型 'System.Decimal' のオブジェクトを型 'System.String' にキャストできません。」 と表示されました。 テーブルのフィールドのデータ型が問題なんでしょうか。 取得したい列のデータ型は「decimal (3,2)」としているんですが・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問