- PR -

Page_Load時にうまくDatagridにデータが反映されない

投稿者投稿内容
ぷう
会議室デビュー日: 2006/03/15
投稿数: 12
投稿日時: 2006-03-15 01:12
初めて投稿させていただきます。よろしくお願いいたします。

現在ASP.NETにてWebアプリケーションを開発しております。
(.net framework 1.1 環境です)

ある遷移元画面(A)にリンクが張られており、これをクリックすると
遷移先画面(B)が開くようになっています。

この(B)がロードされるときに(Page_Loadのところで)
ある条件文によりDBに検索(対象はoracle9iです)しています。
検索にはDataAdapterとDataSetを使用しています。
DataSetに格納しこれをDatagridにbindしています。

このときに(B)へのリンクを押すと検索されたものがDatagridに
表示されるのですが、大体2回に1回の確率で、
ページのロードがされないことがあります。

現象としてはリンクを押しても、IEのマークが動いたままで
ページが移動しません。そこでリンクをもう一度押すと
(B)のページが表示され、Datagridも正しく表示されます。

またこれはリンクだけでなく、WebControlのボタンで遷移先の
ページを開くようにしても発生します。
リンクやボタンの二度押しは避けたいので回避する方法をご存知の方が
いらっしゃればご教授ください。

どうぞよろしくお願いいたします。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-03-15 11:43
これだけの情報だと、可能性として
・ネットワーク上の問題があって、うまく次のページをよびだせてない
・処理上の問題があって、処理が終わってない
というようなことが考えられます。
まずそこをきりわけてみたらどうでしょうか。
処理上の問題だとしたら、DBの検索を行わなければうまくいくのか、とか
DB側でアクセス状況みて何がおきてるか調査する、といったことを
やっていくようになるかと思います。
ぷう
会議室デビュー日: 2006/03/15
投稿数: 12
投稿日時: 2006-03-15 12:32
お返事、ありがとうございます!

引用:

どっとねっとふぁんさんの書き込み (2006-03-15 11:43) より:
これだけの情報だと、可能性として
・ネットワーク上の問題があって、うまく次のページをよびだせてない
・処理上の問題があって、処理が終わってない
というようなことが考えられます。
まずそこをきりわけてみたらどうでしょうか。




どのように切り分ければいいのかわかっていないかもしれませんが
検索したデータを表示させないでページをロードする画面に関しては
問題なく開きます。
またボタンを2度押せばデータが表示されるので
ネットワーク上の問題はないのではないかと思っているのですが
認識間違いはあるでしょうか。

引用:

処理上の問題だとしたら、DBの検索を行わなければうまくいくのか、とか
DB側でアクセス状況みて何がおきてるか調査する、といったことを
やっていくようになるかと思います。




先ほども書きましたが、DBの検索を行わなければページは表示されます。
ちなみに開発環境が即Webサーバになっており、
ネットワークで接続しているのはDBサーバのみです。

以下は問題のコードですが
またデバッグを細かくかけてみたところ

-------------------------以下コード--------------------
'OPEN
If CType(Session("SESS_CON"), OleDb.OleDbConnection).State = ConnectionState.Closed Then
CType(Session("SESS_CON"), OleDb.OleDbConnection).Open()
End If


search_comm.Connection = CType(Session("SESS_CON"), OleDb.OleDbConnection)

search_comm.Parameters.Add(New System.Data.OleDb.OleDbParameter("SEIKYU_EMP_NO", System.Data.OleDb.OleDbType.VarChar, 0, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "", System.Data.DataRowVersion.Current, Session("login_no"))) '
search_comm.Parameters.Add(New System.Data.OleDb.OleDbParameter("BUSHO_CD", System.Data.OleDb.OleDbType.VarChar, 0, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "", System.Data.DataRowVersion.Current, Session("busho_no"))) '

DA_SINSEI_SEARCH.SelectCommand = search_comm

DS_SINSEI_SEARCH21.Clear()
DA_SINSEI_SEARCH.Fill(DS_SINSEI_SEARCH21)・・・・・・・・・・*

DataGrid1.DataSource = DS_SINSEI_SEARCH21.Tables("table").DefaultView
DataGrid1.DataBind()
Session("repair") = ""

---------------------------------------------------------
*をつけた部分で処理が止まってしまいます。

その他調査すべき点などありましたら教えてください。
よろしくお願いいたします。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-03-15 13:38
DB側でなんらかのエラーでてませんか?
コネクションをセッションを使ってもちまわっているので、DBとの接続が
一杯になってたりしないか気になります。

#OracleとOleDB使って接続してるときってどう動くんだっけな。。。
ぷう
会議室デビュー日: 2006/03/15
投稿数: 12
投稿日時: 2006-03-15 19:22
回答、ありがとうございます。

引用:

どっとねっとふぁんさんの書き込み (2006-03-15 13:38) より:
DB側でなんらかのエラーでてませんか?
コネクションをセッションを使ってもちまわっているので、DBとの接続が
一杯になってたりしないか気になります。

#OracleとOleDB使って接続してるときってどう動くんだっけな。。。




すみません。実はOracleの管理をしたことがないので
Enterprise Manager Consoleでセッションを見るぐらいしかできないのですが
セッションが残ってしまい、いっぱいになることはありません。

また知り合いから、Oracleへの接続をその都度行うと
接続に時間がかかるため、Sessionで保持したほうがいいと
聞いて、そのようにプログラミングしたのですが
本来はその都度新しく接続を作成して、Open・closeをするべきなのでしょうか。
何も知らず、質問ばかりで申し訳ございません。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-15 19:41
引用:

ぷうさんの書き込み (2006-03-15 19:22) より:

また知り合いから、Oracleへの接続をその都度行うと
接続に時間がかかるため、Sessionで保持したほうがいいと聞いて、


OleDbConnection は接続プーリングを管理できるハズです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ぷう
会議室デビュー日: 2006/03/15
投稿数: 12
投稿日時: 2006-03-15 20:21
ご回答ありがとうございます。

引用:

じゃんぬねっとさんの書き込み (2006-03-15 19:41) より:
OleDbConnection は接続プーリングを管理できるハズです。





実は各画面でOleDbConnectionを毎回作成しているのですが
その必要はないということなのでしょうか。
それとも各画面で作成したもので同じ設定
(たとえば、Provider=OraOLEDB.Oracle.1;Password=aaa;User ID=AA;Data Source=test1
と毎回書く)
した場合は同じ接続とみなされ、接続が複数になることはないのでしょうか。

どこをどのように勉強すればいいかもわからない状態で
質問ばかりで申し訳ございません。
よろしくお願いいたします。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-03-16 10:44
> それとも各画面で作成したもので同じ設定
> した場合は同じ接続とみなされ、接続が複数になることはないのでしょうか。

接続プーリングというのは、一度接続に使ったものを完全に切ってしまわないで
とっておいて、次に使いたいといわれたときにその休止状態の接続を使う、という
仕組みです。
接続は複数になるかもしれませんけど、いちいち接続しているわけではないので
十分な処理速度となることが考えられます。

問題はOracleとの接続のところででてると考えられるわけですから、そこで
何が起きてるかをきちんと調べてみるしかないですよね。
でないと、プログラムをいくら変更してみたところで根本的な対策には
なりませんから。
この機会にしっかり勉強してみるぐらいのつもりで調べてみたらどうでしょうか。

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