- PR -

Global.asaxで作成したDataViewを使いたい

1
投稿者投稿内容
DCPRG
会議室デビュー日: 2004/09/06
投稿数: 15
投稿日時: 2005-03-14 12:49
いつもお世話になっております。
Global.asaxのApplication_BeginRequest内で、
Oracle9i上のテーブルよりデータを取得し、
DataViewにセットしたものを、あるWebページ内の
dropdownlistのDataSourceにセットした結果、
レコード一覧が表示されません。

1.Global.asax

cn.Open()
cm = New OracleCommand
With cm
.CommandTimeout = 60
.Connection = cn
.CommandText = strSql
.CommandType = CommandType.Text
End With

da = New OracleDataAdapter(cm)
ds = New DataSet
intCnt = da.Fill(ds)
da.Dispose()

dt.Columns.Add(New DataColumn("CD", GetType(String)))
dt.Columns.Add(New DataColumn("NM", GetType(String)))

For i = 0 To (intCnt - 1)
dr = dt.NewRow()

dr(0) = ds.Tables(0).Rows(intIndex).Item(0)
dr(1) = ds.Tables(0).Rows(intIndex).Item(1)

dt.Rows.Add(dr)
Next i

Dim dvCD As New DataView(dt)

Application("dvCD") = dvCD


2.WebPage.aspx

With ddl_CD
.DataSource = Application("dvCD")
.DataTextField = "NM"
.DataValueField = "CD"
.DataBind()
.Items.Insert(0, New ListItem("選択無し"))
End With

どなかたご存知の方がいらっしゃれば、ご教示お願い申し上げます。
nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2005-03-14 13:28
こんにちは。

たぶん原因は、元となるDataTableオブジェクトが破棄されてしまっているからでしょう。
DataView自身にはデータのコピーは格納されていません。DataViewは、対応するDataTableから値を返します。ですから、元となるデータが破棄されているとデータを返すことができません。

やったこと無いけど、DataTableのインスタンスも一緒にApplication変数に入れたら可能なのかな?試してみてください。

#いや、そもそもなしてApplication変数。リクエスト毎に、このロジックが走るとして複数ユーザーがアクセスしたとき、大丈夫なのかな。。。?

[ メッセージ編集済み 編集者: nodera 編集日時 2005-03-14 13:33 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-03-14 18:38
 キャッシュ使いましょう、キャッシュ。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconaspcachingfeatures.asp

 「いろいろなページ、または複数のページアクセスで使用するテーブル情報を共有したい」って言うことでしょ?
 キャッシュがあるか調べ、なければデータベースから読み取ってキャッシュにしまう。キャッシュがあればそこから読み取る。

http://quick-tips.hp.infoseek.co.jp/asp.net/tip.html
「値の永続化」参照。

_________________
DCPRG
会議室デビュー日: 2004/09/06
投稿数: 15
投稿日時: 2005-03-15 14:07
noderaさん、Jittaさん、ご回答有り難うございました。

すみません、「Application_BeginRequest」でではなくて、
「Application_Start」側での事でした。
現状では、Public SharedでDataView型のワークを設け、
そこに値をセットしてという方法で取り敢えず動かしております。
Jittaさんのご指摘にありましたように、キャッシュも少しやって
みたのですが、私の根本的な理解力ミスのせいでしょうか、
これはアプリケーションのルートに一つ配置するGlobal.asaxでは
無効なのでしょうか?
感じとしまして、朝の業務開始時点で任意のアプリケーションを
ユーザーが開始させた際、その時点でキャッシュできればいいのですが…。
説明不足で申し訳ありません、よろしくお願い致します。
1

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