- PR -

[ASP.NET 2.0]textboxの値を利用した更新(UPDATE)について

1
投稿者投稿内容
allegretto
会議室デビュー日: 2006/11/15
投稿数: 3
投稿日時: 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日ほど参っております・・・・
アドバイスをいただけると幸いです。
よろしくお願いいたします。


       
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-11-15 14:52
> SqlDataSource2.UpdateParameters.Add("お知らせ番号", 1)

このプログラム、何をやっているのか理解できてます?
更新時に使うパラメータをもう一つ追加しようとしています。
すでに同名のパラメータがあるため、「項目は既に追加されています」といった
エラーが発生するのでしょう。

何を参考にこのようなプログラムを記述されているのかわかりませんが、
どうもSqlDataSourceを使ったデータの更新の一般的な記述方法をご存知なさそう
なので、書籍等できちんとした知識を学ばれたほうがよいのではないかと思います。
allegretto
会議室デビュー日: 2006/11/15
投稿数: 3
投稿日時: 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を実行するときちんと実行されるのですが。
これはやはり、どこかでパラメータが追加されてしまっているということでしょうか。





どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-11-15 15:42
LoadControlStateの中でエラーだったんですか。
じゃ最初の投稿はまったくまとはずれだな。
まぁ、Page_Initというのはページの初期化前の状態なので、そこでコントロールの
状態を見たり触ったりしようとしているためにでているエラーっぽいですね。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-11-22 22:50
どっとねっとふぁんさんの繰り返しになりますが。

 コードで理解しようとするから理解できないのであって、したいことを理解しようとすると、理解できるでしょう。

 また、ASP.NET の場合は特に、イベントが発生するタイミングと、そのときのオブジェクトの状態をよくチェックする必要があります。

 LoadcontrolState、ポストバックの元になったページの、以前の状態を復元する箇所です。ここで呼び出している LoadViewState で、重複の例外ですから、、、
以前の状態を復元しようとしたら、復元する前に存在しちゃってるよ、あらなんで?
って感じですね。


 個人的には、「お知らせはありません。」は、どこかひとつで持ちたいなぁ。


> SqlDataSource2.UpdateParameters.Add("お知らせ番号", 1)
> SqlDataSource2.Update()
うん。更新されるはずないやん。
それとも、書き写すときに抜けたのかな?
_________________
allegretto
会議室デビュー日: 2006/11/15
投稿数: 3
投稿日時: 2006-11-25 01:23
どっとねっとふぁん様 Jitta様

お返事が遅くなって申し訳ありません。また、貴重なアドバイスありがとうございます。
まず、結論なのですが、Page_Initに書いていたものを

If IsPostBack then

Else
(Page_Initに書いていたコード)
End If

という形でPage_Loadに記述することで、ひとまずUPDATEすることができました。
以前、経験した問題解決の手段でLoad→Initにコードを変えるという手段を
使っていたので、今回、ツボにはまっていたようです。

>コードで理解しようとするから理解できないのであって、
>したいことを理解しようとすると、理解できるでしょう。

まさにその通りです。。。
もうすこし、この辺を考えつつ進めていこうと思います。
また質問させていただいただくこともあると思いますが、
懲りずにアドバイスいただけると幸いです。
1

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