- PR -

FormViewを使った同時に2つのテーブル更新

1
投稿者投稿内容
ojiboss
ベテラン
会議室デビュー日: 2008/02/06
投稿数: 52
投稿日時: 2008-09-17 11:44
IDE:VS2008 ASP2.0 VB 
DB:SQL Server2000

長いですが、よろしくお願いします。

マスタメンテナンスを行うWebページを作成しています。
このマスタは2つのテーブル(メインとサブ)に分かれています。
ページ表示時にDatalist(SQLDataSourceA)を使って一覧的なデータを表示させ、
修正するレコードを選択してメインテーブルはFormView1(SQLDatasource1)、
サブテーブルはFormView2(SQLDatasource2)に表示させメインテーブルの
FormView1の更新ボタンで同時にサブテーブルも更新させたいと思っています。

またメイン、サブの両テーブルにはtimestamp型のフィールドを使い同時実行制御
を行いたいと考えています。
参考ページ:http://www.atmarkit.co.jp/fdotnet/vs2005db/vs2005db_12/vs2005db_12_01.html

DataList・・・あるマスタのメインとサブを外部結合させ、表示。
FromView1・・・メインテーブル 
   DataKeyNames=機種NO(主key)、updated(timestamp型のフィールド)。

FromView2・・・サブテーブル  
   DataKeyNames=サブID(主key)、機種NO(外部key)、updated(timestamp型のフィールド)。 


実現方法として、FromView1の更新処理が正常終了すれば、FormView2の
SQLDataSource2のUpdate()を実行させてみたのですが、FormView2のtimestamp型の
フィールド値のoldVlueとの比較(SQLDataSource2のUpdate文)で
「varchar型からtimestamp型へ暗黙変換できません。CONVERT関数を使用して〜〜」
とエラーが発生したので
CNVERT関数で[UPDATE XXX SET XXX=@XXX,YYY=@YYY WHERE 機種NO=@original_機種NO AND updated=@original_updated]
としたのですが、エラーは発生しなくなったのですが、SQLDataSource2_Updatedの更新行数(e.AffectedRows)が0で更新できていません。

そこでFormView1の更新ボタンをFormView2に移動して同じことをしても今度はSQLDataSource1_Updatedで同じエラーが発生し、同じ対応をしてもSQLDataSource1_Updatedの更新行数(e.AffectedRows)が0で更新できていません。

つまりFormViewの更新ボタンからでないとtimestamp型のフィールド値oldVlueとの比較がうまくできないようです。

対策としてFormView1の更新ボタン処理完了時に、SQLDataSource2_Updateではなく、FormView2に見えない更新ボタン
を用意してそのボタンのクリックイベントをコードで実行させるにはどのようにすれば良いでしょうか。

もしくは他に良い方法、案があればご教授お願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-10-01 23:31
引用:

ojibossさんの書き込み (2008-09-17 11:44) より:


FromView1・・・メインテーブル 
   DataKeyNames=機種NO(主key)、updated(timestamp型のフィールド)。

FromView2・・・サブテーブル  
   DataKeyNames=サブID(主key)、機種NO(外部key)、updated(timestamp型のフィールド)。 


実現方法として、FromView1の更新処理が正常終了すれば、FormView2の
SQLDataSource2のUpdate()を実行させてみたのですが、FormView2のtimestamp型の
フィールド値のoldVlueとの比較(SQLDataSource2のUpdate文)で
「varchar型からtimestamp型へ暗黙変換できません。CONVERT関数を使用して〜〜」
とエラーが発生したので
CNVERT関数で[UPDATE XXX SET XXX=@XXX,YYY=@YYY WHERE 機種NO=@original_機種NO AND updated=@original_updated]
とした


 おかしくないですか?エラーメッセージには、「varchar型からtimestamp型へ暗黙変換できません。」と、書かれていたのですよね?でも、timestamp 型を指定しているはずなのですよね?だったら、CONVERT するのではなく、設定(パラメータへの追加の時の型指定が怪しい)を見直すべきではないですか?
 それと、「CNVERT関数で...とした」と書かれていますが、「UPDATE XXX SET XXX=@XXX,YYY=@YYY WHERE 機種NO=@original_機種NO AND updated=@original_updated」には 「CNVERT関数」は出てきません。どこで、どのように指定したのでしょう?




引用:

エラーは発生しなくなったのですが、SQLDataSource2_Updatedの更新行数(e.AffectedRows)が0で更新できていません。

そこでFormView1の更新ボタンをFormView2に移動して同じことをしても今度はSQLDataSource1_Updatedで同じエラーが発生し、同じ対応をしてもSQLDataSource1_Updatedの更新行数(e.AffectedRows)が0で更新できていません。

つまりFormViewの更新ボタンからでないとtimestamp型のフィールド値oldVlueとの比較がうまくできないようです。

対策としてFormView1の更新ボタン処理完了時に、SQLDataSource2_Updateではなく、FormView2に見えない更新ボタン
を用意してそのボタンのクリックイベントをコードで実行させるにはどのようにすれば良いでしょうか。

もしくは他に良い方法、案があればご教授お願いします。


 現象が、正しく把握できていないように思います。
ここに書かれているものではわからないことを列挙します。

1.それぞれのデータを引っ張ってきた SELECT 文
2.それぞれのデータを更新するための UPDATE 文
3.それぞれの UPDATE 文に指定したパラメータの詳細

 FormView1 の TIMESTAMP を、FormView2 の TIMESTAMP とマッチさせようとしているのではないかと思います。あるいは、同じテーブルの同じ列から、2つの FormView に持ってきているのではないかと思います。そうすると、SELECT したときの値とは変わっているはずなので、後から更新しようとした方が更新できないのは、「コードに書かれているとおり」となります。
1

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