- - PR -
[ASP.NET 2.0]textboxの値を利用した更新(UPDATE)について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-11-15 14:34
はじめまして、早速ですが質問させていただきます。
環境は以下の通りです。 VS2005(VB.net) SQL Server 2005 Express 行いたいこと→WEBアプリのメインページ(main.aspx)に表示させるお知らせを作成する、管理画面(upinfo.aspx)で @テーブルに格納されている現在のお知らせを、Sqldatasourceとformviewをつかって textbox1に呼び出す。 Aお知らせをなくす(メイン)場合はcheckbox1にチェックすると、テーブルには“お知らせはありません。”が登録される。 BSQLのUPDATEで更新を行う。 ここで、以下の問題が起きています。 Page_loadイベントで If DirectCast(FormView1.FindControl("お知らせlabel"), Label).Text = "お知らせはありません。" Then CheckBox1.Checked = True TextBox1.Text = "お知らせはありません。" Else TextBox1.Text = DirectCast(FormView1.FindControl("お知らせlabel"), Label).Text End If を記述すると、既存のデータがtextbox1に貼り付けられるが、更新(button1)をおしてUPDATEコマンドで更新作業(以下のように)を行ってpostbackされても、前のデータから変化しない。(textboxの内容も変わらないし、テーブルも更新されない) Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click If CheckBox1.Checked = True Then Session("dsinfo") = "お知らせはありません。" Else Session("dsinfo") = TextBox1.Text End If SqlDataSource2.UpdateParameters.Add("お知らせ番号", 1) SqlDataSource2.Update() End Sub これに対して、page_loadイベントを消して、Page_initに Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init FormView1.DataBind() If DirectCast(FormView1.FindControl("お知らせlabel"), Label).Text = "お知らせはありません。" Then CheckBox1.Checked = True TextBox1.Text = "お知らせはありません。" Else TextBox1.Text = DirectCast(FormView1.FindControl("お知らせlabel"), Label).Text End If End Sub と記述したところ、今度は実行時に 「System.ArgumentException: 項目は既に追加されています。辞書のキー: 'お知らせ番号' 追加されるキー: 'お知らせ番号'」 と出てしまいます・・・・ テーブルにはお知らせ番号(intでID列,主キー)とお知らせ内容(nvarchar)のフィールドあって、1つのレコードを毎回更新していきたいと思っています。 上とは全く関係ない他のページでも、Gridviewからクエリ文字列を飛ばして、文書の編集画面を表示し、更新しようとしているのですが、上記の現象が起こってしまいます。 こちらの場合は、SQLdatasourceのUPDATEクエリのパラメータ設定で主キー FAQID = Request.QueryString("faqid")としています。 これで、2日ほど参っております・・・・ アドバイスをいただけると幸いです。 よろしくお願いいたします。 |
|
投稿日時: 2006-11-15 14:52
> SqlDataSource2.UpdateParameters.Add("お知らせ番号", 1)
このプログラム、何をやっているのか理解できてます? 更新時に使うパラメータをもう一つ追加しようとしています。 すでに同名のパラメータがあるため、「項目は既に追加されています」といった エラーが発生するのでしょう。 何を参考にこのようなプログラムを記述されているのかわかりませんが、 どうもSqlDataSourceを使ったデータの更新の一般的な記述方法をご存知なさそう なので、書籍等できちんとした知識を学ばれたほうがよいのではないかと思います。 |
|
投稿日時: 2006-11-15 15:26
どっとねっとふぁん様
お返事ありがとうございます。 おっしゃるとおり、まだまだ勉強不足で大変恐縮です・・・ 申し訳ありません。 SqlDataSource2.UpdateParameters.Add("お知らせ番号", 1) の行については、削除してみましたが、それでもやはり同じエラーが出てしまいます。 SqlDataSource2のUPDATEクエリは 「UPDATE [T_dsinfo] SET [お知らせ] = @お知らせ WHERE [お知らせ番号] = @お知らせ番号」 エラーの内容は、 [ArgumentException: 項目は既に追加されています。辞書のキー: 'お知らせ番号' 追加されるキー: 'お知らせ番号'] System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add) +2836675 System.Collections.Hashtable.Add(Object key, Object value) +11 System.Collections.Specialized.OrderedDictionary.Add(Object key, Object value) +118 System.Web.UI.OrderedDictionaryStateHelper.LoadViewState(IOrderedDictionary dictionary, ArrayList state) +202 System.Web.UI.WebControls.FormView.LoadControlState(Object savedState) +427 System.Web.UI.Control.LoadControlStateInternal(Object savedStateObj) +178 System.Web.UI.Page.LoadAllState() +364 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2239 です。クエリビルダ内でUPDATEを実行するときちんと実行されるのですが。 これはやはり、どこかでパラメータが追加されてしまっているということでしょうか。 |
|
投稿日時: 2006-11-15 15:42
LoadControlStateの中でエラーだったんですか。
じゃ最初の投稿はまったくまとはずれだな。 まぁ、Page_Initというのはページの初期化前の状態なので、そこでコントロールの 状態を見たり触ったりしようとしているためにでているエラーっぽいですね。 |
|
投稿日時: 2006-11-22 22:50
どっとねっとふぁんさんの繰り返しになりますが。
コードで理解しようとするから理解できないのであって、したいことを理解しようとすると、理解できるでしょう。 また、ASP.NET の場合は特に、イベントが発生するタイミングと、そのときのオブジェクトの状態をよくチェックする必要があります。 LoadcontrolState、ポストバックの元になったページの、以前の状態を復元する箇所です。ここで呼び出している LoadViewState で、重複の例外ですから、、、 以前の状態を復元しようとしたら、復元する前に存在しちゃってるよ、あらなんで? って感じですね。 個人的には、「お知らせはありません。」は、どこかひとつで持ちたいなぁ。 > SqlDataSource2.UpdateParameters.Add("お知らせ番号", 1) > SqlDataSource2.Update() うん。更新されるはずないやん。 それとも、書き写すときに抜けたのかな? _________________ |
|
投稿日時: 2006-11-25 01:23
どっとねっとふぁん様 Jitta様
お返事が遅くなって申し訳ありません。また、貴重なアドバイスありがとうございます。 まず、結論なのですが、Page_Initに書いていたものを If IsPostBack then Else (Page_Initに書いていたコード) End If という形でPage_Loadに記述することで、ひとまずUPDATEすることができました。 以前、経験した問題解決の手段でLoad→Initにコードを変えるという手段を 使っていたので、今回、ツボにはまっていたようです。 >コードで理解しようとするから理解できないのであって、 >したいことを理解しようとすると、理解できるでしょう。 まさにその通りです。。。 もうすこし、この辺を考えつつ進めていこうと思います。 また質問させていただいただくこともあると思いますが、 懲りずにアドバイスいただけると幸いです。 |
1