- PR -

構造体をSession変数に

投稿者投稿内容
ume
ベテラン
会議室デビュー日: 2001/09/19
投稿数: 55
投稿日時: 2005-09-16 19:24
VB.NET で開発をしています。
類似のスレッドがありましたが長らく回答がないようなので新規で
質問させてください。

構造体を作成し、session変数に設定しましたが
受け取るときに「キャストが有効ではありません」というエラーが発生します。

概要は以下です。

Structureの定義名を myStruct とします。
Session("param_myStruct") = myStruct で設定
同一.aspx内では
mySt = CType(Session("param_myStruct") ,myStruct)
で正しく取得できるのですが、
別.aspx でエラーが発生します。

このような事象を解決された方のアドバイスがいただければ
助かります。
よろしくお願いします。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-09-16 19:40
とりあえず例外が発生するaspxで
Session("param_myStruct")に何が格納されているのかをクイックウォッチで確認してみてはいかがでしょうか。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-09-16 19:42
こんにちわ。

何が違うと考えておられますか?
例えば、
実は取得できたときは、同じリクエストの最中だった。
実は二つの aspx は別の Web アプリケーションだ。
実はセッションの保存にデータベースを使っている。
実はバグで値が入っていないだけだ。等。

今出ている情報では少々足りないかと思われます。
もう少し情報をいただけますか。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2005-09-16 19:44
こういうときに問題を解決するためには、"問題がない"部分をどんどん広げていって、"問題がある"部分をどんどん狭めていくと良いです。

"構造体だとだめ"ということは、クラスだと大丈夫ということですよね?

自作の構造体ではなく、Int32ではどうですか?


ね、問題のある部分が狭まってきたでしょ。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-09-16 20:51
こんばんは、じゃんぬ です。

引用:

umeさんの書き込み (2005-09-16 19:24) より:

類似のスレッドがありましたが長らく回答がないようなので新規で質問させてください。


一応、リンクを貼って欲しいなんて願ってます。

引用:

構造体を作成し、session変数に設定しましたが
受け取るときに「キャストが有効ではありません」というエラーが発生します。


こういう時はまず、キャストしようとしているものに、
どんな値が入っているのか、全メンバみたりするものです。
デバッグするならば、最初にやることだと思います。

引用:

別.aspx でエラーが発生します。


null になってません?


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ume
ベテラン
会議室デビュー日: 2001/09/19
投稿数: 55
投稿日時: 2005-09-20 09:59
ご回答ありがとうございます。
説明不足ですみませんでした。

まず、過去にあった書き込みは以下です。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=16877&forum=7
タイトルの問題から派生して発生していますが
今回の問題とは少し違うようでした。

アドバイスをいただいて構造体を構成している変数の値を確認したところ、
各変数に値は格納されていました。

主な処理は以下の通りです。
========================================================

(ABC01.aspx、ABC02.aspx に記述)
'構造体の定義
Public Structure strTest
Dim a1 As String
Dim a2 As String
Dim a3 As String
End Structure

(ABC01.aspx の記述)
'ボタンを押したときのSub で
構造体に値を設定→構造体をSessionに設定→次のaspxへ
Dim te As strTest
te.a1 = "a"
te.a2 = "2"
te.a3 = "3"
Session("test") = te
Server.Transfer("ABC02.aspx")

(ABC02.aspx の記述)
Page_Load で
Dim w1 As String = Session("test").a1 =受け取ることができる

Dim te As strTest
te = CType(Session("test"), strTest) =キャストエラー
te = Session("test")         =もちろんキャストエラー

Dim te2 As Object
te2 = CType(Session("test"), strTest) =キャストエラー
te3 = Session("test")         =キャストエラー


========================================================
構造体の定義を各aspxごとにしているのがよくない?と考え
クラスを定義し、同様の処理を行ったところ、問題なく処理できました。

クラスを使うことで今回は対応しようと思いますが
構造体でこのような記述は間違っているのでしょうか?
ume
ベテラン
会議室デビュー日: 2001/09/19
投稿数: 55
投稿日時: 2005-09-20 10:07
追加です。

ただ単に
Dim work1 = Session("test")
Dim work2 As String = w1.a1
としたところ、
キャストエラーも発生せず、a1 の値も取得できました。

むしろCtypeのキャストは不要ということでしたか?
だとしたらたいへん失礼いたしました。。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-09-20 10:09
こんにちわ。

引用:

(ABC01.aspx、ABC02.aspx に記述)
'構造体の定義
Public Structure strTest
Dim a1 As String
Dim a2 As String
Dim a3 As String
End Structure



ん?ん?それぞれ二つ定義しているという事ですか?
名前空間が違うから定義できているということですか?

それは単に同じ名前、同じ定義の「別の型」という事ですからキャストできなくて当然ですね。

引用:

クラスを定義し、同様の処理を行ったところ、問題なく処理できました。



という事みたいなので、同じように構造体を定義したらよいだけだと思います。

スキルアップ/キャリアアップ(JOB@IT)